• ベストアンサー

マクロを使用しての重複チェックについて

ここの質問にCOUNTIFや条件式書式などでデータの重複チェックを する内容はあるのですが、ちょっと思ってるのと違うので 質問します。 A列 B列 1 aaa 1 aaa 2 aaa 2 aaa 3 bbb 3 bbb 4 ccc 4 ccc 上記のように8行のデータがあります。 条件で、A列の数字が同じ数字でB列が同名の場合は、 チェック対象外で、A列の数字が違う数字でB列が同名の場合 (上記でいうと1 aaa と 2 aaaの場合)は、重複で対象行を 網掛けをするという処理を作りたいのですが、そういうことって できるのでしょうか。 まずは、値を明示的にやるべきだと思いますが、 理想としては、A1とA2が同じ値でB1とB2の値が一緒の値だったら 処理なし。 A1とA2の値が違う値でB1とB2の値が一緒の値だったら 重複っていうような処理を行えたら幸いです。 理由は、どんどんなデータ(行)を追加することを想定させた場合を 考えております。 参考になるのがありましたら教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

こんにちは。 小手先に走ったコードかもしれませんが。空セル対策や最終行判定などは 省略してます。ソートは多分不要です。 Sub Sample()      Dim colGroup As Collection   Dim i    As Long   Dim sKey   As String   Dim r    As Range      Set colGroup = New Collection   On Error Resume Next   For i = 1 To 10        '<--- とりあえず1~10行目まで     sKey = Cells(i, "B").Value     colGroup.Add Cells(i, "A"), sKey     If Err Then       Set r = colGroup(sKey)       colGroup.Remove sKey       colGroup.Add Union(r, Cells(i, "A")), sKey       Err.Clear     End If   Next   On Error GoTo 0      Set r = Nothing   For Each r In colGroup     If Application.Sum(r) / r.Count <> r.Cells(1).Value Then       r.EntireRow.Interior.ColorIndex = 6     End If   Next      Set colGroup = Nothing End Sub

meteo14
質問者

お礼

回答ありがとうございます。 実際動かしてみまして、ちゃんと動きました。 上記に対して、多少追記したりしましたら、理想の動きが できました。 ありがとうございました。

その他の回答 (4)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.5

#01です >失礼かもしれませんが、上記内容は動作確認なさったものですか?? もちろん動作を確認しております(^^; WinXP+Office2003です。 数式はA1セルに条件付き書式を設定することを前提にしています。もしそれ以外のセルに設定したのであれば動作しないでしょう。 またセルの絶対参照の$を消してしまったら動きませんよ。 >数式が多分間違ってるような気がします。 ご自身がうまくいかなかったからといって、間違っているとは限りませんよ。式の意味が理解できていれば簡単です。 マクロがよろしいようですので、これ以上の追加回答はやめておきます。

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

バッチ処理向きですが、ロジックが簡単になるものとして、 「ソート」法を薦めます。 B列+A列でソートする。 全行について、B列について直前レコード(行)の内容と比較して行って、B列が直前行と同じで、A列が違う行が出現すると、それ(またはそれに続く同じ行)が質問で検出したい行です。

meteo14
質問者

補足

回答ありがとうございます。 色々試しておりますが、正直うまくいってません.. ソート法も考えてみます。

  • NYAx2
  • ベストアンサー率27% (3/11)
回答No.2

次のようにC列にチェック欄を設けて作成すれば・・・ LastRow = Range("A655356").End(xlUp).Row 最終行検索 for r0 = 1 to (LastRow - 1) if Cells(r0, 3) = xlNull then     チェック済か? wkA = Cells(r0, 1).Value wkB = Cells(r0, 2).Value for r1 = r0 to LastRow if cells(r1, 3) = xlnull then チェック済か? if wkA = Cells(r1, 1).Value And _ wkB = Cells(r1, 2).Value then cells(r1, 3) = "1"    チェック済 (ここで網掛け指定) end if end if Next r1 End if Next r0

meteo14
質問者

補足

回答ありがとうございます。 試しに動かしてみましたが、全て網掛けしてしまうのでは ないかと思います。 気になったことをコメントで質問させてください。 LastRow = Range("A65356").End(xlUp).Row For r0 = 1 To (LastRow - 1) If Cells(r0, 3) = xlNull Then wkA = Cells(r0, 1).Value wkB = Cells(r0, 2).Value For r1 = r0 To LastRow If Cells(r1, 3) = xlNull Then If wkA = Cells(r1, 1).Value And wkB = Cells(r1, 2).Value Then →ここのif文ですが、r1には1が代入されると思います。  wkAとwkBと同じセルを最初みると思いますが、  For文で全てのセルを対象とした場合は見てないですよね?? Cells(r1, 3) = "1" Cells(r1, 2).Interior.ColorIndex = 6 Else End If End If Next r1 End If Next r0 End Sub 最終的な目的は、A列とB列をみて、 A列  B列 1   aaa 重複 1   aaa 重複 1 aaa 重複 2   aaa 重複 2   aaa 重複 2   aaa 重複 3   bbb 3   bbb 3   bbb 5 aaa 重複 5 aaa 重複 上記のような処理をしたいと思っております。 自分でもいただいた内容を元に作成してみます。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

条件付き書式で十分ではありませんか。 ただし条件が不足しています。それは重複している行は全て網掛けにするのか、後から出現した行のみを網掛けにするのかが書かれていないのです。 ここでは後から出現した行だけを網掛けにする方法を説明します 質問のデータ例を少し変えました。以下のようなデータがあるとき、A1セルを選択し「書式」→「条件付き書式」をせんたくし「セルの値が」を「数式が」に変更します 数式には  =COUNTIF($B$1:$B1,$B1)-SUMPRODUCT(($A$1:$A1=$A1)*($B$1:$B1=$B1)*1)>0 を入力して「書式」で網掛けを設定します。あとはA1セルをコピーして、他のセルに「編集」→「形式を選択して貼り付け」→「書式」で貼り付けます A列  B列 1   aaa 1   aaa 2   aaa * 3   aaa * 3   bbb 4   bbb * 4   ccc 4   ccc すると*印をつけた行だけが網掛けになります。

meteo14
質問者

補足

情報ありがとうございます。 ただ上記を試してみましたが、網掛けになる対象セルが 全く網掛けとなりませんでした。 全く無反応でした。 よく分からなくなってしまいましたが、ご教示いただいた 数式が多分間違ってるような気がします。 調べてみて、なんか違うような気がしております。 失礼かもしれませんが、上記内容は動作確認なさったものですか?? ちょっと自分が思っているのでは、新しくデータを追加した場合、 書式を毎回コピーを行わないといけないと思いますので、 できれば簡素化したいなぁって思っておりますので、 多分条件式書式だと厳しいと思います。 マクロでなんとかしてみます。

関連するQ&A

  • 名簿データベースの重複チェック

    2つの名簿データベースがあります。(約3千件) 元はAデータベースで、これに随時、追加・修正を 加えたBデータベースがあります。 このAとBそれぞれに、重複した名簿データが含まれている 可能性があります。 これを重複がないかチェックし、あった場合は BデータベースのB列に "重複" 表示させる方法を 教えてください。 希望結果表示イメージは次ぎのとおりです。 Aデータベース   Bデータベース A列 B列・・・  A列 B列・・・ Z列 aaa         aaa bbb         bbb       重複 bbc         bbd ccc         ccc ddd         bbc eee         eee fff         bbb       重複 希望1:Z列に関数を埋め込み表示 希望2:VBでループ処理 希望3:何でもいいです

  • 【少し急いでます】エクセルについて教えてください!

    Excel2000を使っています。 A列に重複するデータがあり、B列に別データがあります(20000行強) 例)     A  B 1  001 aaa 2   001 bbb 3   001 ccc 4   002 aa 5  002 bb 6  003 aaa 7  003 bbb 8  004 ddd 9   004 eee 10  005 aa 11  006 bbb A列で重複する001は3行あり、重複しているデータは1行にまとめてB列のaaa、bbb、cccをつなげたいです。(わかりづらくてすみません) 例)     A      B 1  001  aaa・bbb・ccc 2  002   aa・bb 3  003  aaa・bbb というようにまとめたいです。 どのような方法がありますでしょうか? よろしくお願い致します。

  • Excel2000のマクロで

    Excel2000のマクロで B1 AAA B2 B3 BBB B4 B5 CCC B6 B1~最後の行までで データがいくつ入ってるか知りたいのですが分かりません。 このときデータは3つ だから3を取りたいです。 それから A1に1 A3に2 A5に3 B列にデータが入ってる行に1から順に 数字を入れるにはどうしたらいいですか? 教えてください。よろしくお願いします。

  • マクロで重複データの削除

    過去ログを使っていろいろ試したのですが、うまくいかなかったので助言お願いします。 データ的には B列 C列 AAA 50 AAA 50 BBB 70 BBB 70 BBB 72 CCC 25 のようなデータあります。 これを「AAA」でC列のデータが同じやつはひとつにするということをやりたいのです。 B列 C列 AAA 50 BBB 70 BBB 72 CCC 25 のようになります。 B列第一優先にC列第二で並べ替えをして、過去ログ参照より、下のデータからループしてくというのを試したのですが、全部削除されてしまいます。 しかし、これでは並べ替えの場合によってはCの重複がおかしくなると思うので、B列参照したほうがいいのかな? 別シートに書き出しタイプでないやり方をしたいと思っています。お助けくださいよろしくお願いします。

  • エクセルVBAで重複する名前に(2)、(3)等をつける方法は?

    こんにちは。お世話になります。 以下のようなデータ(約1500件)があります。 データは分類と名称でソート済みです。 同じ分類のなかで同じ「名称」があった場合、B列の名称の直後に同一セル内で(2)や(3)を順に振っていくマクロを教えていただきたいのです。(1)は不要です。 下記の例では、ううう(2)、ううう(3)といった具合です。 よろしくお願いします。 A列 B列 C列 分類 名称 データ1 aaa あああ a aaa いいい b aaa ううう a aaa ううう a aaa ううう a aaa えええ b bbb かかか a bbb かかか a bbb ききき a bbb くくく b ccc さささ a ccc ししし b ccc すすす a ccc すすす a ccc すすす a ccc すすす a ccc せせせ a

  • エクセル / 重複する文字の行番号を抜き出す。

    お世話になります。 XP/2003 使用です。 エクセルで下記のようなケースの行番号を抜き出したいです。 できれば、関数のみがありがたいのですが、 マクロでもOKです。 ----------- 抽出したい行番号  重複する文字が入力された 「先頭の行」 と 「最後の行」 の行番号 ----------- 例 同じ列に、重複する単語が入力されています。 重複する単語は、必ず上下に並んでいますが、 1単語のみ場合もあります。 1  AAA 2  AAA 3  AAA 4  AAA 5  BBB 6  BBB 7  CCC 8  CCC 9  CCC 10 DDD 上記の場合の抽出した行番号 単語 → 先頭の行/最後の行 AAA → 1/4 BBB → 5/6 CCC → 7/9 DDD → 10/10 行番号は、B列、C列などに抽出できれば良いです。 何卒よろしくお願いします。

  • 重複時の網掛けについて

    以前、重複行を網掛けにする処理で質問を載せましたが、 もう少し深くやりたくて試しているのですが、 無限ループが発生して困っております。 A B 1 aaa 1 aaa 1 aaa 2 aaa 2 aaa 2 aaa 3 bbb 3 bbb 4 aaa 4 aaa 上記データがあって結果を A B C 1 aaa 重複 1 aaa 重複 1 aaa 重複 2 aaa 重複 2 aaa 重複 2 aaa 重複 3 bbb パス 3 bbb パス 4 aaa パス 4 aaa パス B列の値が同じの場合は、A列の番号が大きいもののみパスと するように処理を作成しようと思っております。 下記でまずはどのように値が返ってくるか試したのですが、 無限ループになってしまいました。 Dim i As Integer Dim n As Integer LastRow = Range("A65356").End(xlUp).Row For i = 1 To LastRow A_retsu = Cells(i, 1).Value B_retsu = Cells(i, 2).Value For n = 1 To LastRow If A_retsu = Cells(n, 1).Value And B_retsu = Cells(n, 2) Then MsgBox "パス" Else MsgBox "重複" End If Next Next End Sub 最終結果は、 3 bbb パス 3 bbb パス 4 aaa パス 4 aaa パス 上記だけを残して他は削除させる処理を作りたいです。 すいませんがお願いします

  • エクセルの重複データの抽出(条件付)

    エクセルの以下のようなデータから3時間以上連続で出現しているデータを抽出してその行に色をつけるようなマクロを組みたいのですがそのような方法はないでしょうか。 A列   B列 6/1 3:00 AAA社 6/1 3:00 BBB社 6/1 3:00 CCC社 6/1 2:00 AAA社 6/1 2:00 CCC社 6/1 2:00 DDD社 6/1 1:00 AAA社 6/1 1:00 DDD社 6/1 1:00 EEE社 6/1 1:00 FFF社 6/1 1:00 GGG社 6/1 0:00 AAA社 6/1 0:00 BBB社 6/1 0:00 CCC社 6/1 0:00 DDD社 6/1 0:00 GGG社 6/1 0:00 HHH社 ・ ・ ・ A列は日時、B列は企業名です。 B列の企業名が3時間以上連続して出現している行を抽出して、その行(または企業名)に色をつけるか、または重複してる企業名の一覧表示をしたいです。 この例の場合、AAA社とDDD社になります。 (CCC社は3回出現してるけど、3時間連続していないので対象外。) 3時間以上連続して出現というのがポイントです。 データは2000行ほどで、24時間分です。 マクロ初心者でいろいろ検索してみたのですが、わからずすごく困っています。よろしくお願いします。

  • 重複 があれば削除して1つに

    http://oshiete1.goo.ne.jp/qa4510771.html の族編です。 エクセルの1列の縦長いデータを抽出して 1行の横長いカンマ区切りのテキストにしたいのですが、 エクセルの縦1列をコピペでワードにテキストで貼り付け そこから改行を置き換え削除で横並び1列になったのですが 重複する文字が複数あったので、重複分を削除して1つだけに残したいのです。 エクセルデータは変更してはいけないので、コピーしかできません。別のエクセルにならコピーしてもかまいません。 手作業では大変な作業ですので、簡単で単純な方法を教えて下さい。 ********************************** aaa  ← エクセルの縦列のデータ bbb  ← ccc aaa ddd bbb ↓ aaa,bbb,ccc,ddd こんな風に重複分だけ削除して1行カンマテキストにしたいのです。 <(_ _)>

  • マクロを使った重複チェックについて。

    以下の様な表があります。 番号  名前  ジャンル   AAAA-1 佐藤   趣味     BBB-5  高橋  スポーツ CCC-35 酒井   音楽 AAAA-1 佐藤   趣味     BBB-6  高橋   スポーツ CCC-35 酒井   音楽 番号部分が重複していると、重複している行を順々に、 『○行目と×行目が重複しています”というようなメッセージが表示されるようにしたいのです。 (番号部分の桁数は、その時々によって変わります。) 行は1000行ほどあります。 ボタンをクリックすると、チェックのマクロが走るようにしたいのですが、 どのようにすれば良いのでしょうか? 教えてください。 宜しくお願いします。

専門家に質問してみよう