アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。

【やりたいこと:同姓同名の方で時間がかぶるケースのエラーメッセージを出したい。】

下記のような、重複エラーチェックの方法について教えていただきたく、よろしくお願いいたします。
(やりたいことの質問例は表の下に記します)
「入力規則」でできますか?
それとも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行の山田太郎は時間がかぶっているためエラーメッセージを出したいのです。

【要約(再):同姓同名の方で時間がかぶるケースのエラーメッセージを出したい。】

質問がわかりにくかったならご指摘ください。
よろしくお願いいたします。

A 回答 (5件)

こんにちは



なによりもまず、出したいエラーメッセージというものによって決まります。
俗に言う「メッセージボックス」
つまりExcelでブックに記入後、保存せず閉じようとするとメッセージが出ますよね?
アレを出したいですか?

色が変わる程度でいいですか?

まずそこです。
メッセージボックスでないと困るならマクロ書くしかないですね。
あと、B・C列に入力される時間ですが、手入力ですか?
    • good
    • 0

ごめんなさい追加要求



あと、この3列以外にも色々入ってもいいですか?

この回答への補足

補足要求をありがとうございます。

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

補足日時:2006/02/01 18:26
    • good
    • 0

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)」
として書式で文字色か背景色を変えてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/02/08 11:05

やっぱマクロですね


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

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

お礼日時:2006/02/08 11:06

VBAでやってみました。

ロジックが相当難しかった。
氏名でソートし、氏名重複分同士について、時間重複をチェック。
例データ Sheet1 A-E列
8近藤 次郎110:0011:00
10近藤 次郎210:3016:00
4海川 花子39:3010:30
1山田 太郎410:3011:00
3山田 太郎515:3016:00
5山田 太郎610:5011:00
4山田 太郎711:3017:30
6山田 太郎88:309:30
7山田 太郎912:2013:50
2川中 島子109:5011: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列
ソート後行ソート前行氏名スタートエンドソート後行ソート前行スタートエンドかぶり具合
28近藤 次郎10:0011:00310 10:3016:00S
51山田 太郎10:3011:0075 10:5011:00SE
84山田 太郎11:3017:30107 12:2013:50SE
もっとテストを繰り返すべきで、エラーがあるかも知れないが、時間もあって、お許し願いたい。
Sheet2のD,E,H,I列は書式をユーザー定義のhh:mmにしてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/02/08 11:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!