• 締切済み

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

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/17069)
回答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 結果として、何らかの重複があるデータが、赤い文字で表示されます。