- ベストアンサー
【Excel】マクロを使用した重複チェックについて
- Excelのマクロを使って重複をチェックする方法について教えてください。
- 表の行ごとに重複している人がいる場合に、メッセージを表示する方法を知りたいです。
- フォームのボタンを作成し、そのボタンをクリックすることで重複チェックのマクロが実行できるようにしたいです。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 >私が下に記入してきたような表で列と列の間にいくつかの空白列が含まれる場合 こういう質問は、とても好きですね。(^.^) 頭の体操にはよいのですが、でも、今度こそ、自信がありませんね。 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 ということになるかと思います。 試してみてください。
その他の回答 (6)
- Wendy02
- ベストアンサー率57% (3570/6232)
froma_a さん、こんばんは。 >田中 佐藤 鈴木 吉田 今度は、3列目から、6列目までですから、前回の理屈からすれば、ひとつ手前までです。しかし、とびとびではありませんので、Step はひとつずつだから、書かなくて良いですね。だから、 # For j = 3 To 5 Step 2 の部分を、このように替えてあげれば、良いことになりますね。 For j = 3 To 5 試してみてください。
補足
御回答ありがとうございます。 返事が遅くなって申し訳ありませんでした。 もう一つ質問してもいいですか? 例えば私が下に記入してきたような表で列と列の間にいくつかの空白列が含まれるとする場合、「この列とこの列を見て重複しているかチェックする」といった、参照する列を指定したマクロにする場合はどうしたら良いのでしょうか? 本当度々の質問ですみません。
- Wendy02
- ベストアンサー率57% (3570/6232)
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 1 田中 佐藤 鈴木 吉田 5 2 佐藤 鈴木 鈴木 佐藤 5 3 鈴木 田中 佐藤 鈴木 5 4 佐藤 鈴木 吉田 田中 2日が佐藤さんと鈴木さんが重複していますよね? 尚且つ、3日には鈴木さんが重複しています。
- Wendy02
- ベストアンサー率57% (3570/6232)
>行ごとにかぶっている人がいると”■行の○○さんが重複しています” 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 '-----------------------------------------
補足
細やかな回答ありがとうございます。 とてもうれしいです。 一つ質問してもいいですか? 例えば、以下のように1行に重複している人がいた場合、 月|日|A担当|コード|サブ|コード|B担当|コード 5 1 田中 1 佐藤 5 田中 1 5 2 佐藤 5 鈴木 3 田中 1 5 3 鈴木 3 田中 1 佐藤 5 5 4 佐藤 5 佐藤 5 田中 1 ”1日に田中さんが重複しています””5日に佐藤さんが重複しています”といったようなメッセージを表示する場合、どうしたらよいのでしょうか? 質問ばかりですいません。
- lasichi
- ベストアンサー率31% (122/389)
for文で行を順番進ませてA担当、サブ、B担当の内 等しい個所を検索して、ヒットすればその行と ヒットした名前をメッセージボックスで表示させればいいんじゃないでしょうか? ソースをここに書いても良いのですが簡単なのでがんばってください。
補足
回答ありがとうございます。 色々と考えてはみたのですが、中々うまくいきません。 まだ初心者なもので…すいません。 ソースを書いていただいてもよろしいでしょうか? そこから勉強させていただきます。
- haukappu
- ベストアンサー率15% (46/296)
マクロで確認する流れとしてはこんな感じでしょうか。 ・A担当の情報を取得 ・サブ、B担当と比較、同じ人が居たら表示。 ・サブの情報を取得 ・B担当と比較、同じ人が居たら表示。 これを行の数だけ繰り返す。(For~else でくりかえす) (行数は、先に数えておいたほうが良いですね。) ・自分で確認するだけならピボットテーブルを使って 項目の数を数え、二個以上の重複がないかみるほうが楽かと思います。 担当の数が限られているなら、行のラストに各担当の名前が使われる回数を”COUNTIF”関数で数えても良いと思います。 それぞれの方法はEXCELLのヘルプを参照ください。
補足
回答ありがとうございます。 マクロで確認する流れとしましては以下のような形だと思います。 ・1行目に記載されている名前を取得 ・重複している場合エラー”1行目の○○さんが重複しています” ・重複していなかった場合、そのほかの行(2行目以降)を重複チェック 表自体がすでに出来上がっているため、できる限りそれを生かしチェックを行いたいと思っています。 ヘルプを見たり、他のサイトを見たりしたのですが不明確で…
- kaisendon
- ベストアンサー率44% (114/257)
こんばんは マクロではありませんが 条件付書式の数式が =COUNTIF(A:A,A1)>1 書式で目立たせる(例えばセルのパターンを赤くする) 等すれば、入力中に重複に気がつきますし どのセルが重複しているのかも 一目瞭然だと思いますが いかがなものでしょうか? ご質問の >マクロを使用した重複チェックについて に対しての回答では無いことをお詫びします o(_ _)o
補足
回答ありがとうございます。 条件付書式は私も考えました。 できれば今勉強中のマクロを使用し考えたいと思いまして投稿しましたので、これからもまだまだ学習していきたいと思います。 どうもありがとうございます。
お礼
御礼が遅くなってしまい申し訳ありません。 あれから色々試行錯誤を繰り返しながら、やっとこ出来ました◎ 何度もすみませんでした。 ありがとうございます。