• 締切済み

複数セルの値が重複しているかどうかを調べたい

A列に会社コード B列に商品コード が入っているExcelがあります。 会社コードと商品コードをあわせて複合キーとして 重複しているデータを抽出したいのですが やり方がわかりません。 たとえば、 会社コード 商品コード 01      001 02      001 01      002 01      001 0       1001 01      001 という値が入っているときに、 1行目と重複している行として4行目と6行目を検索したいのです。 A列とB列の文字列を結合させてFindを使用しようと思ったのですが そうすると、5行目も検索対象としてヒットしてしまいます。 (5行目は重複してるとはいいませんよね・・・) VBAでの実現を考えています(初級者です)。 どなたか教えてください。 よろしくお願いします。

みんなの回答

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

複合キーを作るときは第1キーの長さを見繕う(会社コード2桁)。 また第2キーの長さを見繕う(商品コード4桁)。そして両方ともTEXT関数やFormat関数でそれぞれを定桁にして、その上で&演算子で結合して修正キーにする。 これは鉄則です。 例 A列  B列    C列 01 001 010001 02 001 020001 01 002 010002 01 001 010001 0 1001 001001 01 001 010001 C1の式は、 =TEXT(A1,"00")&TEXT(B1,"0000") ーー 後はバッチ処理ですが、複合キーでソートし、直前レコードを同じか聞いていく、ソート法をお勧めします。 初心者にはFind関数は難しい。しかしFindメソッドも、まあ例題がWEBに沢山あるので、まねをすれば良いのですが。

全文を見る
すると、全ての回答が全文表示されます。
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

#01です。 例えばこんなマクロでしょうか。Findメソッドも理解されていらっしゃるようですので、読めば分かると思います。 Sub Macro6() Const col As String = "A" Dim res Dim act As Worksheet Dim idx, lastR As Long Dim fAdr As String   Application.ScreenUpdating = False   Set act = ActiveSheet   lastR = act.Cells(65536, col).End(xlUp).Row   For idx = 2 To lastR - 1     With act.Range(Cells(idx + 1, col), Cells(lastR, col))       Set res = .Find(What:=act.Cells(idx, col).Value, LookAt:=xlWhole)       If Not res Is Nothing Then         fAdr = res.Address         Do           If res.Offset(0, 1).Value = act.Cells(idx, col).Offset(0, 1) Then             res.Resize(1, 2).Font.ColorIndex = 3           End If           Set res = .FindNext(res)         Loop Until res.Address = fAdr       End If     End With   Next idx   Application.ScreenUpdating = True End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

質問に書かれているだけのことでよければ、A2セルに条件付き書式で以下の数式を入力後「書式」ボタンで背景色を指定します。 「数式が」 「=AND($A$2=$A2,$B$2=$B2)」 後は他のセルに「編集」→「形式を選択して貼り付け」→「書式」で貼り付ければ、1行目と合致する行の背景色を変えることができます。 VBAを使うまでもありません(2003で確認しています) もしVBAでやりたいとしても、この質問内容では残念ながら回答のしようがないですね。検索して見つかった時に、何をどうすればよいか明示されていないからです。 もしCtrl+Fの検索と同じような動作をさせるなら、当然「次へ」などのボタンを用意しなければなりませんが、UserFormで作るのですか? それとも、別のシートに結果を書き込めばよいのですか? VBAで実現するならそこまで考えてから質問するべきと思います。 (そこまで考えたら作って差し上げるという意味ではありませんが…)

lisa_1218
質問者

補足

回答ありがとうございます。 説明が不足していて申し訳ありません。 やりたいことは (1)ボタンを押す (2)データの入力されている2行目のセルから、最終行まで検索 (3)2行目のA列・B列と合致している行のA列・B列の文字を赤くする (4)最終行まで検索したら、3行目のセルから(2)・(3)の動作を繰り返す (その後、4行目、5行目・・・として、最終行の1行前まで検索します) ということです。 1つのセルでの重複チェックであれば実現できたのですが 2つ以上のセルでの実現方法がわかりませんでした。 1つのセルでのチェックの一部を抜粋すると Do While ROW < lRow 'lRow:データのある最終行(事前に取得) '重複チェック対象の値を取得 Inputdata = Cells(ROW, COL) '自分の行より下の行をチェック対象範囲とする With Range(Cells(ROW + 1, COL), Cells(lRow, COL)) Set objRange = .Find(what:=Inputdata, LookAt:=xlWhole, MatchCase:=True) If Not objRange Is Nothing Then '最初の検索結果のアドレスを格納 Addr = objRange.Address Do '対象文字を赤字にする(ロジック省略) Loop While objRange.Address <> Addr And Not objRange Is Nothing End If ROW = ROW + 1 End With Loop 結果として、何らかの重複があるデータが、赤い文字で表示されます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 重複行を削除

    重複する行をVBAコードで削除したいのですが A列 B列 C列 あ  1  a あ  1  a あ  2  a い  1  a い  2  c い  2  c A列 B列 C列 あ  1  a あ  2  a い  1  a い  2  c のようにABC列同一文字は1行にしたいのですがVBAコード、関数の解る方ご教授願います。

  • エクセル、VBA、抽出複数検索について

    エクセル、VBA、VLOOKUP、MATCH関数等について出来る方法があれば教えてください。 インチごとに分けてあるシートがあり、(在庫表です) これを参照して、別ブックへVLOOKUP等を使って、サンプルデータのシート4のように表示させたいのですが、 何か方法を使って出来ることは可能でしょうか? 問題点が複数あります 1、VLOOKUPの範囲について、B列が結合されていて、C列は複数行あるため、商品名が入ってきません。 C列については、何千件とデータがあるため、結合することは不可能です。 一致している条件としては商品コードが必ずあり、商品名には「/」が入っております。 =CONCATENATEとVLOOKUPは一緒に使うことは可能ですか? もしくはINDEX関数やIF、SUMPRODUCT等を使うのでしょうか? シート4のような形に出来る方法があれば、教えてほしいです。 VBAは詳しくはないのですが、VBAで出来るのであれば、教えてほしいです。 在庫表はとても作り方が悪いのですが、これを作り直すと言うことは、不可能です。 グループ会社で使っているため、なんとかこの在庫表を使いたいです。 VBAでA列をA5からA100にコードのみ入れた場合、B列に商品名が入るようにVBAで作ることは可能でしょうか? もしくは、検索条件を2つ使って、一つは商品コード完全一致+あいまい検索で【/】で商品名を入れることは可能でしょうか? 関数は調べたのですが、関数では難しいのかなと思います。 宜しくお願い致します。

  • 【Excel】複数の条件を設定した重複セルの抽出

    【Excel】複数の条件を設定した重複セルの抽出 例えば、A列にA社からD社のデータが行に複数個ずつ並び、B列にそのクライアントに問い合わせた日付が入力されている場合。 A社に問い合わせた日付は1/1、1/3、1/5。B社に問い合わせた日付が1/1、1/1、1/3、1/5、1/5となっているデータで、 B社の3~7行目の日付で重複している1/1と1/5の行のみを抽出する方法ってありますか? 作業自体はB社だけでなく、複数あるので、関数か何かで出来る方法があれば教えていただきたいです。

  • 2行にわたる値を1行にまとめるには?

    A列に6桁の数字、B列に文字、C列から不特定な列(=x列)まで空白か文字か数字が表示されているという行が、不特定行(=y行)並んでいるエクセル表があります。 A列の数字はB列の商品に対するコード番号で、C列からx列は日ごと売上数とします。 ある1つの商品には、2つのコードがついてしまっているために、A列にはそれぞれのコード、B列には同じ商品名、C列からx列には、日によって売上数がどちらかにばらばらに入っています。 また、売上表の抽出方法によって、行の位置は変わり、その商品が抽出されない時もあります。 このように、1つの商品について2行になっているところを1行にまとめた表にするマクロを作りたいのですが、教えて下さい。 途中まで作ってみたのがこれです。根本から直してもらってもよいですので、教えて下さい。 Dim CL As Range '変数宣言 Dim CCL As Range With Range("A:A") Set CL = .Find(What:="コード番号", LookAt:=xlWhole) If CL Is Nothing Then Else Set CCL = .Find(What:="もう1つのコード番号",LookAt:=xlWhole) If CCL Is Nothing Then   Else ’一行にする関数 をここへ End If End If End With    

  • エクセル セルの結合について

    エクセルにてA列縦3行を結合してB列・C列は縦3行は結合せずにそれぞれ数値を入力してます。オートセルにてB列の数値を抽出後A列を再度抽出すると、A列は画面上では表示されているのですが、抽出が出来ません。どのようにしたらA列を抽出できるのでしょうか?ご存知の方教えてください。

  • EXCEL 条件による重複セルの検出

    列A   列B   (列C) A2001   0    (*) A2001   0    (*) A2001   1    (*) A2001   1    (*) A2001   2 A2001   2 A2002   0 A2003   1    (*) A2003   1    (*) A2003   3 A2003   3 列A、Bに上記のようなデータが入力されている。 以下の条件でデータを抽出し、列Cに印(上の例では*)を付けたい。 1.列Aが重複しているならば、 2.重複しているデータの中で列Bを比較し、 3.列Bの中で最大の値ではないものに対して*を付ける。 このような処理を行いたいのですが、さっぱり分かりません。 関数でも、VBAでもどちらでもかまいません。 どうぞよろしくお願い致します。

  • Excelセル内の改行を含む文字列の1行目抽出

    Excelセル内の改行を含む文字列があり、関数を使って、その1行目だけ抽出したい。 たとえば、下記のような式を書きました。「改行コード」おかしみたいで動作しません。 Left("A1", Find(vbCrLf, "A1")) (改行コードをさがして、そこまでの文字列を切り取る) これをVBAで書く方法があれば、コードを教えてください!

  • VBAで条件に一致するセルの隣の値をまとめる方法

    VBAで条件に一致する複数セルの隣のセルの値を取得し、まとめる方法教えて下さい! 下記例の様に、A列に商品コード、B列にサイズ値の入力されたデータが8万行ほどあり、別シートに商品コード毎にサイズ値をまとめたいです。 例: 処理前 A列(商品コード)      B列(サイズ値) abc1000           S abc1001           S abc1001           M abc1001           L abc1002           XS abc1002           S 処理後(別シート) A列(商品コード)      B列(サイズ値) abc1000           S abc1001           S:M:L abc1002           XS:S COUNTIFで連番を振ってMATCHとINDEX関数で抽出し、まとめるという方法で実現は出来たのですが、処理にかなりの時間を要するのでVBAならもっと高速にできるのではないかと思い質問させて頂きました。 よろしくお願い致します。

  • 可視セルで重複セルをカウントしない方法

    売上シートのA列のA2から下方向に会社コードが入っています。B列には日付が入っています。同じ月でもA列には同じ会社から注文が入ると同じ会社コードが入ります。 B列の日付ら、月別の集計をフィルター機能を使って特定月を表示させ、A列の会社コードから注文があった会社の個数を求めたいのですが、どうすればよいでしょうか。VBAでも構いません。 A列のA2からA3、A4と売り上げがある度に会社コードが追加されます。会社コードは1001,1002,1003,1004,1005と続き150社ほどあります。B列のB2から下は例として2018/9/27と言う形式の日付が入ります。 よろしくお願いいたします。

  • エクセルで重複するセルを削除したい

    エクセル2000で同じ内容のセルが複数あったとき、ひとつだけを残し他を削除する方法を教えてください。 ただし少し条件があります。 データーは5列100行位からなっています。 A列にある重複したデーターのセルを削除したいのですが、A列は同一なのですがB列は異なっています。B列に数字が入っているセルとうでないセルがあるのですが、数字が入っているものを残したいのです。 具体例は次のとおりです。 A列に 「ホンダCIVIC」 B列 「-」と書かれた行と A列に 「ホンダCIVIC」 B列 「2」と書かれた行、 A列に 「ホンダCIVIC」 B列 「5」と書かれた行、 のA列だけを見ると重複した3行が有ったとします。 B列に「5」または「2」の入った行ひとつだけ残し、他を削除したいのです。 何かよい方法があればお教えください。よろしくお願いします。

専門家に質問してみよう