• 締切済み

エクセル:こんな「入力規則」によるエラーチェックは可能でしょうか?

お世話になります。 【やりたいこと:同姓同名の方で時間がかぶるケースのエラーメッセージを出したい。】 下記のような、重複エラーチェックの方法について教えていただきたく、よろしくお願いいたします。 (やりたいことの質問例は表の下に記します) 「入力規則」でできますか? それともVBAでしょうか?幅広い方法でのご指導をいただければうれしいのですが、初心者わかりやすくご教授くださいますことをお願いいたします。   A       B      C 1 山田 太郎  10:00  11:00 2 川中 島子  11:30  12:30 3 山田 太郎  15:30  16:00 4 海川 花子  11:30  12:30 5 山田 太郎  10:30  11:00 【今回やりたいことの(例)】 上記の表で、B列、C列は時間で「B列からC列まで」という時間範囲を示します。 1行、2行、5行と山田太郎が入力されていますが、1行目と3行目は時間がかぶっていないのでOKです。しかし、1行と5行の山田太郎は時間がかぶっているためエラーメッセージを出したいのです。 【要約(再):同姓同名の方で時間がかぶるケースのエラーメッセージを出したい。】 質問がわかりにくかったならご指摘ください。 よろしくお願いいたします。

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

VBAでやってみました。ロジックが相当難しかった。 氏名でソートし、氏名重複分同士について、時間重複をチェック。 例データ Sheet1 A-E列 8 近藤 次郎 1 10:00 11:00 10 近藤 次郎 2 10:30 16:00 4 海川 花子 3 9:30 10:30 1 山田 太郎 4 10:30 11:00 3 山田 太郎 5 15:30 16:00 5 山田 太郎 6 10:50 11:00 4 山田 太郎 7 11:30 17:30 6 山田 太郎 8 8:30 9:30 7 山田 太郎 9 12:20 13:50 2 川中 島子 10 9:50 11:00 コード Sub test01() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") sh2.Range("A1:J100").ClearContents d = sh1.Range("A65536").End(xlUp).Row ' MsgBox d k = 2 '---ソート sh1.Range(sh1.Cells(1, "A"), sh1.Cells(d, "E")).Sort key1:=sh1.Range("B2") For i = 1 To d c = WorksheetFunction.CountIf(Range(sh1.Cells(1, "B"), sh1.Cells(d, "B")), sh1.Cells(i, "B")) If c = 1 Then cmode = "n" Else If cmode = "n" Then cmode = "y" l = i + c - 1 End If '--- sa = sh1.Cells(i, "D") ea = sh1.Cells(i, "E") For j = i + 1 To l ' MsgBox i & "=" & j s = sh1.Cells(j, "D") e = sh1.Cells(j, "E") '--- If s >= sa And s < ea Then ' MsgBox Format(Cells(i, "D"), "hh:mm") & Format(Cells(i, "E"), "hh:mm") & Format(Cells(j, "D"), "hh:mm") ers = "S" End If '--- If e > sa And e <= ea Then ' MsgBox Format(Cells(i, "D"), "hh:mm") & Format(Cells(i, "E"), "hh:mm") & Format(Cells(j, "E"), "hh:mm") ers = ers & "E" End If '--- If ers <> "" Then prt01 k, i, j, ers ers = "" k = k + 1 End If Next j End If Next i End Sub Sub prt01(k, i, j, ers) Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") sh2.Cells(k, 1) = i sh2.Cells(k, 2) = sh1.Cells(i, "A") sh2.Cells(k, 3) = sh1.Cells(i, "B") sh2.Cells(k, 4) = sh1.Cells(i, "D") sh2.Cells(k, 5) = sh1.Cells(i, "E") sh2.Cells(k, 6) = j sh2.Cells(k, 7) = sh1.Cells(j, "A") sh2.Cells(k, 8) = sh1.Cells(j, "D") sh2.Cells(k, 9) = sh1.Cells(j, "E") sh2.Cells(k, 10) = ers End Sub 結果 Sheet2 A-J列 ソート後行 ソート前行 氏名 スタート エンド ソート後行 ソート前行 スタート エンド かぶり具合 2 8 近藤 次郎 10:00 11:00 3 10 10:30 16:00 S 5 1 山田 太郎 10:30 11:00 7 5 10:50 11:00 SE 8 4 山田 太郎 11:30 17:30 10 7 12:20 13:50 SE もっとテストを繰り返すべきで、エラーがあるかも知れないが、時間もあって、お許し願いたい。 Sheet2のD,E,H,I列は書式をユーザー定義のhh:mmにしてください。

yastaro
質問者

お礼

お礼が遅くなりました。 いまだ内容研究しています。ごめんなさい。 完全に理解できないままですが、一度締めます。 今後ともご指導をよろしくお願いいたします。

  • mimi-_-
  • ベストアンサー率28% (55/191)
回答No.4

やっぱマクロですね この表後どれくらい伸びるか分からないし。。 (縦に) そういうダイナミクスに対応するにはやっぱマクロが一番。 どのパターンでも対応できますね。

yastaro
質問者

お礼

お礼がおそくなりました。ありがとうございました。

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.3

B1セルに設定として 入力値の種類が「ユーザー設定」で 数式が「=SUMPRODUCT(($A$1:$A$65000=$A1)*($B$1:$B$65000<=B1)*($C$1:$C$65000>=B1))=1」 これをコピーして「編集」「形式を選択して貼り付け」で「入力規則」で貼り付けてください。 ただし入力済みの時間には反応しません。 入力済みで確認したい場合は「書式」「条件付書式」で 「数式が」「=AND(ISNUMBER(B1),SUMPRODUCT(($A$1:$A$65000=$A1)*($B$1:$B$65000<=B1)*($C$1:$C$65000>=B1))>1)」 として書式で文字色か背景色を変えてください。

yastaro
質問者

お礼

お礼が遅くなりました。 いまだ内容を研究しています。 結果がうまくだせません。もう少しいただいた内容をもとに勉強してみます。 いったん締めさせてください。 ありがとうございました。今後ともお願いいたします。

  • mimi-_-
  • ベストアンサー率28% (55/191)
回答No.2

ごめんなさい追加要求 あと、この3列以外にも色々入ってもいいですか?

yastaro
質問者

補足

補足要求をありがとうございます。 すみません、急務が入って補足要求を今見ました。 色がかわることでも可としたいと思います。 それと列は左右にずっとたくさんあってブランクの列を挿入する余裕はない状況です。

  • mimi-_-
  • ベストアンサー率28% (55/191)
回答No.1

こんにちは なによりもまず、出したいエラーメッセージというものによって決まります。 俗に言う「メッセージボックス」 つまりExcelでブックに記入後、保存せず閉じようとするとメッセージが出ますよね? アレを出したいですか? 色が変わる程度でいいですか? まずそこです。 メッセージボックスでないと困るならマクロ書くしかないですね。 あと、B・C列に入力される時間ですが、手入力ですか?

関連するQ&A