プロが教えるわが家の防犯対策術!

A列に会社コード
B列に商品コード
が入っているExcelがあります。

会社コードと商品コードをあわせて複合キーとして
重複しているデータを抽出したいのですが
やり方がわかりません。

たとえば、
会社コード 商品コード
01      001
02      001
01      002
01      001
0       1001
01      001
という値が入っているときに、
1行目と重複している行として4行目と6行目を検索したいのです。

A列とB列の文字列を結合させてFindを使用しようと思ったのですが
そうすると、5行目も検索対象としてヒットしてしまいます。
(5行目は重複してるとはいいませんよね・・・)

VBAでの実現を考えています(初級者です)。

どなたか教えてください。
よろしくお願いします。

A 回答 (3件)

複合キーを作るときは第1キーの長さを見繕う(会社コード2桁)。


また第2キーの長さを見繕う(商品コード4桁)。そして両方ともTEXT関数やFormat関数でそれぞれを定桁にして、その上で&演算子で結合して修正キーにする。
これは鉄則です。

A列  B列    C列
01001010001
02001020001
01002010002
01001010001
01001001001
01001010001
C1の式は、
=TEXT(A1,"00")&TEXT(B1,"0000")
ーー
後はバッチ処理ですが、複合キーでソートし、直前レコードを同じか聞いていく、ソート法をお勧めします。
初心者にはFind関数は難しい。しかしFindメソッドも、まあ例題がWEBに沢山あるので、まねをすれば良いのですが。
    • good
    • 1

#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
    • good
    • 1

質問に書かれているだけのことでよければ、A2セルに条件付き書式で以下の数式を入力後「書式」ボタンで背景色を指定します。


「数式が」 「=AND($A$2=$A2,$B$2=$B2)」

後は他のセルに「編集」→「形式を選択して貼り付け」→「書式」で貼り付ければ、1行目と合致する行の背景色を変えることができます。
VBAを使うまでもありません(2003で確認しています)

もしVBAでやりたいとしても、この質問内容では残念ながら回答のしようがないですね。検索して見つかった時に、何をどうすればよいか明示されていないからです。
もしCtrl+Fの検索と同じような動作をさせるなら、当然「次へ」などのボタンを用意しなければなりませんが、UserFormで作るのですか?
それとも、別のシートに結果を書き込めばよいのですか?
VBAで実現するならそこまで考えてから質問するべきと思います。
(そこまで考えたら作って差し上げるという意味ではありませんが…)

この回答への補足

回答ありがとうございます。
説明が不足していて申し訳ありません。

やりたいことは
(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

結果として、何らかの重複があるデータが、赤い文字で表示されます。

補足日時:2007/12/20 20:39
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています