こんばんは。
>私が下に記入してきたような表で列と列の間にいくつかの空白列が含まれる場合
こういう質問は、とても好きですね。(^.^)
頭の体操にはよいのですが、でも、今度こそ、自信がありませんね。
Sub 重複チェック3()
Dim i As Long, j As Long, LastCol As Long
Const 最初の行 As Long = 2
With ActiveSheet
LastCol = .Cells(最初の行, 256).End(xlToLeft).Column
For i = 最初の行 To .Range("A65536").End(xlUp).Row
For j = 3 To LastCol - 1
If VarType(.Cells(i, j)) = vbString Then '※
If Application.CountIf(.Range(.Cells(i, j), .Cells(i, LastCol)), _
.Cells(i, j).Value) > 1 Then
MsgBox .Cells(i, 2).Value & " 日に " & _
.Cells(i, j).Value & "さんが重複しています。"
End If
End If
Next j
Next
End With
End Sub
解説:
If VarType(.Cells(i, j)) = vbString Then
これで、文字列の時だけ、引数を取るようにしました。でも、その間の場所が空白ならともかく、全角空白では、これではダメですね。例えば、全角文字列だけしか検索値に取らない、という場合は、その部分が、
If .Cells(i, j).Value Like "[ぁ-钁]*" Then
ということになるかと思います。
試してみてください。
froma_aさん、こんばんは。
>”1日に田中さんが重複しています””5日に佐藤さんが重複しています”といったようなメッセージを表示する場合、どうしたらよいのでしょうか?
なるほど、そういう意味なのですか!
それでは、私の解釈が違いましたね。難しく考えすぎました。
”5日に佐藤さんが重複しています”
なお、これは、4日目ですね。
'----------------------------------
Sub 重複チェック2()
Dim i As Long, j As Long
Const 最初の行 As Long = 2
With ActiveSheet
For i = 最初の行 To .Range("A65536").End(xlUp).Row
For j = 3 To 5 Step 2
If Application.CountIf(.Range(.Cells(i, j), .Cells(i, 7)), _
.Cells(i, j).Value) > 1 Then
MsgBox .Cells(i, 2).Value & " 日に " & _
.Cells(i, j).Value & "さんが重複しています。"
End If
Next j
Next
End With
End Sub
'-------------------------------------
For j = 3 To 5 Step 2
なお、ここの部分は、もっと列が多いときは、現在は、7列目まで、人名が入れてありますから、そのひとつ手前、5列目までで良いわけです。最後はひとつしかありませんからね。つまり、13列目まであるときは、11列目までで良いことになりますね。
>行ごとにかぶっている人がいると”■行の○○さんが重複しています”
A担当 コード サブ コード B担当 コード
の「行ごとにかぶる」という意味は、日付を除いた、その組み合わせが全部同じである行ということだと解釈しました。
つまり、サンプルの表ですと、佐藤さんの5行目に当たりますね。
以下は、わたし流のコードです。一般的には、Dictionary を使う方法や、仮にVBAでも、#1さんのようなCountif を、シートの作業列を設けるのが普通です。
私は、あまり、シートの作業列を設けるのが好きではないので、もし、Dictionary の方法をお使いになりたければ、また、ご指摘ください。バブルソート法などのアルゴリズムを使う方法もありますが、仮にも、Excelですから、そこまでの必要性がないような気がします。VBAでも、Countif が使えたらよいのですが、配列を引数に取れません。
なお、このコードは、時系列から考え、下からチェックするようにできています。
'----------------------------------------------
Sub 重複チェック1()
Dim i As Long, j As Long, k As Long
Dim myData() As Variant, buf As String
Dim rtn As Variant
Const 最初の行 As Long = 2
For i = 最初の行 To ActiveSheet.Range("A65536").End(xlUp).Row
For j = 3 To 8
buf = buf & "," & Cells(i, j).Value
Next j
ReDim Preserve myData(k)
myData(k) = Mid$(buf, 2)
k = k + 1
buf = ""
Next i
For k = UBound(myData) To LBound(myData) Step -1
rtn = Application.Match(myData(k), myData, 0)
If Not IsError(rtn) Then
If rtn <> k + 1 Then
MsgBox k + 最初の行 & "行目の" & _
Mid$(myData(k), 1, InStr(myData(k), ",") - 1) & _
"さんが重複しています。"
End If
End If
Next k
End Sub
'-----------------------------------------
お礼
御礼が遅くなってしまい申し訳ありません。 あれから色々試行錯誤を繰り返しながら、やっとこ出来ました◎ 何度もすみませんでした。 ありがとうございます。