• 締切済み

ExcelVBAで重複するデータを表示するには?

VBAで重複するデータを検索し,一致するデータがある場合は, その隣のセルを別シートにて横方向に表示させたいと思っています。 どのようにしたら,良ろしいでしょうか? 具体的には,下記のSheet1 のデータを元に,VBAでSheet2を作成したいと考えています。 <<Sheet1>> 社名   品名 -----+------+ A社     PC A社   プリンタ B社    モデム B社     PC A社    スキャナ C社     PC <<Sheet2>> 社名     品名1     品名2    品名3 -----+------+--------+--------+ A社     PC    プリンタ    スキャナ B社    モデム    PC C社      PC 関連して・・・  ・Sheet2の社名は重複表示させない  ・品名1,品名2,品名3の順番は,Sheet1にて1行目から検索してヒットする順番で表示  ・重複するデータがない場合(C社),そのまま社名と品名をSheet2に表示 以上,よろしくお願い致します。

みんなの回答

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.4

Excel の関数等不慣れなので、そういう人が考えたら・・・の例になるか?も 重複排除・・・ Dictionary を使ってしまいます。 今回の場合、社名がキーで品名が内容 社名は出現順、品名も出現順(ただし、重複する品名は覚えない) 以下の関数を標準モジュールに記述しておきます。 Public Sub CngShowPtn(rng As Range, toRng As Range)   Dim dic As Object   Dim v As Variant, vr As Variant   Dim bNxt As Boolean   Dim i As Long, iv As Long, ivmax As Long   Set dic = CreateObject("Scripting.Dictionary")   With rng     i = 1     While (.Offset(i) <> "")       bNxt = True       v = dic.Item(.Offset(i).Value)       If (Not IsArray(v)) Then         ReDim v(0)       Else         For Each vr In v           If (vr = .Offset(i, 1).Value) Then             bNxt = False             Exit For           End If         Next         If (bNxt) Then ReDim Preserve v(UBound(v) + 1)       End If       If (bNxt) Then         v(UBound(v)) = .Offset(i, 1).Value         dic.Item(.Offset(i).Value) = v       End If       i = i + 1     Wend   End With   If (dic.Count > 0) Then     With toRng       i = 1       ivmax = 0       For Each v In dic.Keys         vr = dic.Item(v)         iv = UBound(vr) + 1         If (iv > ivmax) Then ivmax = iv         .Offset(i) = v         .Offset(i, 1).Resize(, iv) = vr         i = i + 1       Next       .Offset(0) = rng       For i = 1 To ivmax         .Offset(0, i) = rng.Offset(0, 1) & i       Next     End With   End If   Set dic = Nothing End Sub 使い方は、どこの表を、そして結果をどこに表示する を Range で指定します。 以下を実行してみた結果は、添付図のようになります。 Public Sub test()   Call CngShowPtn(Range("A1"), Range("D2"))   Call CngShowPtn(Range("A9"), Range("D10")) End Sub また、シートを修飾して指定したりします。 例)   Call CngShowPtn(Worksheets("Sheet1").Range("A1") _             , Worksheets("Sheet2").Range("A1"))

全文を見る
すると、全ての回答が全文表示されます。
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

ANo.2です。 画像をせっかく作ったのに添付し忘れていました。

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

簡単なものを作ってみました。 該当社名が一番最初に登場する行の右に品名を追加していき、最後に社名登場が2番目以降の不要な行を削除して形を整えています。 Sub Sample()   Dim nMax, nMatch, nCol, sString, i   'Sheet1からSheet2にコピー   Sheets("Sheet1").Cells.Copy   Sheets("Sheet2").Range("A1").Select   ActiveSheet.Paste   nMax = Cells(Rows.Count, 1).End(xlUp).Row   For i = 2 To nMax 'データがあるのは2行目から     nMatch = WorksheetFunction.Match(Cells(i, 1), Range("A:A"), 0)     If nMatch <> i Then       '品名を右に表示       sString = sString & i & ":" & i & "," '不要行削除用       nCol = Cells(nMatch, 1).End(xlToRight).Column       Cells(nMatch, nCol + 1) = Cells(i, 2)     End If   Next i   '不要な行の削除   sString = Left(sString, Len(sString) - 1)   Range(sString).Delete Shift:=xlUp End Sub

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

こんにちは。 技術的に簡易なものを選んで書いてみました。 VBAに慣れたら、配列とか外部オブジェクトとか使いたくなると思いますが、 そこまで望んでいるようには見受けられなかったので、易しい方法にします。 具体的なご要望あれば、一応お応えするつもりです。 指定が漏れている点、都合上、すべて可変にして書いています。 以下こちらで仮に設定したもの。  社名は、A列にある  nKeyCol = 1  品名は、B列にある  nField2Col = nKeyCol + 1  統合するデータの元の列は(B列に始まり)B列で終る  nFieldsEndCol = nField2Col + 0  レコードの先頭行は3行め  nTopRow = 3  Sheet2 のフィールド名を設定する記述は省きました。 Sub Re7799914cc()   Dim vTemp  As Variant   Dim wshtP  As Worksheet   Dim flgA() As Boolean   Dim nKeyCol     As Long   Dim nField2Col   As Long   Dim nFieldsEndCol  As Long   Dim nTopRow     As Long   Dim nBottomRow   As Long   Dim nC As Long   Dim nR As Long   Dim i  As Long   Dim j  As Long   Dim k  As Long   Set wshtP = Sheets("Sheet2") '    ◆指定   nKeyCol = 1 '            ◆指定   nField2Col = nKeyCol + 1 ' 2 '    ◆指定   nFieldsEndCol = nField2Col + 0 ' 2 ' ◆指定   With Sheets("Sheet1") '       ◆指定     nTopRow = 3 '          ◆指定     nBottomRow = .Cells(Rows.Count, nKeyCol).End(xlUp).Row     ReDim flgA(nTopRow To nBottomRow) As Boolean     nR = nTopRow - 1     For i = nTopRow To nBottomRow       If Not flgA(i) Then         nR = nR + 1         vTemp = .Cells(i, nKeyCol).Value         wshtP.Cells(nR, nKeyCol).Value = vTemp         nC = nField2Col - 1         For k = nField2Col To nFieldsEndCol           nC = nC + 1           wshtP.Cells(nR, nC).Value = .Cells(i, k).Value         Next k         For j = i + 1 To nBottomRow           If Not flgA(j) Then             If .Cells(j, nKeyCol).Value = vTemp Then               flgA(j) = True               For k = nField2Col To nFieldsEndCol                 nC = nC + 1                 wshtP.Cells(nR, nC).Value = .Cells(j, k).Value               Next k             End If           End If         Next j       End If     Next i   End With   Set wshtP = Nothing   Erase flgA End Sub

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

関連するQ&A

  • エクセル 重複のデーター

    Sheet1  A   B       2 A社 商品1      3 B社 商品2    4 A社 商品5   5 C社 商品4     6 F社 商品1  7 D社 商品3    8 E社 商品6    9 C社 商品2 Sheet2 A   B       1 A社       2 B社     3 C社    4 F社      5 G社   6 D社     7 E社     上記のようにSheet1の社名をSheet2に重複の無いように関数で抽出できないでしょうか? 尚、社名は5・6社のとこもあれば30社以上になることもあります 社名の順番は問いません  よろしくお願いします。    

  • 2つの条件で重複しないデータを抽出

    シート1 1|品名 種類 名前 データ 2|A 1 あ 21 3|B 2 い 11 4|F 2 あ 51 5|A 1 い 21  6|B 2 あ 64 7|A 1 あ 84 シート2 1|品名 A 2|種類 1 3| 4|名前 5|あ 6|い シート1のデータから、シート2の2つの条件(A1:B2)で、重複しない名前を表示する方法を教えて下さい。 上記のデータでいうと、品名Aであり種類が1の名前を重複なしで特定の位置(A5)から詰めて縦に表示するようにして、 シート1のデータ、シート2の条件を変更したらA5からの名前が自動更新されるようにしたいです。 以下できたら追加したいこと 1.表示する名前の順番が、シート2の条件で集計したデータ値が多い名前順 2.シート2のB2の種類に0を入れると種類の条件無しで表示 実際はA5からの名前の行は数行を結合したもので右側には複数の行でデータ項目別になって、名前が入力された時に日毎のデータを自動表示しています。 全部で名前の種類は30以上ありますが、品名の条件をつければ名前は10種類以下になります。 グラフは名前別で表示しており、不要な名前が増えると表示しずらいので、必要な名前だけのデータを表示するようにしたいです。 どうかよろしくお願いします。

  • 2シート間の重複データのチェックについて質問です!

    2シート間の重複データのチェックについて質問です! まず、以下のように二つのシートがあるとします。 【シートA】 A列     B列 登録あり  あああ社 登録なし  いいい社 登録あり  ううう社 登録なし  えええ社 登録あり  おおお社 登録なし  かかか社 【シートB】 A列     B列       あああ社       いいい社       えええ社       おおお社       かかか社       さささ社 やりたいのは、シートAのB列の社名がシートBのB列と重複しており、且つシートAにて登録ありの社名のみシートBのA列に「登録あり」とチェックする・・・ということです。 要するに、 以下のようにしたいのです。 【シートB】 A列     B列 登録あり  あああ社       いいい社       えええ社 登録あり  おおお社       かかか社       さささ社 ちなみに、シートAは5000社、シートBは10000社以上あります。 ここでシートAとシートBを比較し、登録ありの重複データをシートBにてチェックしたいということです。 説明がややこしくて大変申し訳ありません。 どなたか教えていただけませんでしょうか? 何卒よろしくお願いします。

  • エクセル重複データを非表示にしたい

    エクセル2003です。重複してるデータを1件のみ表示し他は非表示にする方法お願いします。 データ→フィルタ→フィルタオプションを使用するのは解ってますが詳細がわかりません。 例;A1に品名、B1に購入年月、C1~E1はその他項目としたデータが複数件あります。 品名と購入年月が同じデータ複数あった場合1件のみ表示させたい。 宜しくお願いします。

  • VBAでの重複データ統一についてです。

     いつもお世話になっております。VBA初心者です。 過去の質問で、2つのセルの重複データを一つのデータにする処理があったのですが、3つのセルの重複データを1つのデータにするやり方に苦戦しております。 (A列) (B列) (C列)  A社  鈴木   男性  B社  田中   女性  A社  鈴木   男性  B社  佐藤   女性  B社  田中   女性  A社  鈴木   男性      ↓↓ (A列) (B列) (C列)  A社  鈴木   男性  B社  田中   女性  B社  佐藤   女性  となるようにしたいのです。 サンプルソース等がありましたら、 よろしくお願いいたします。

  • ◆◆急募◆◆ エクセル 重複するデータの抽出について

    データの入力された2枚のA、Bシートが同じブックにあります。 <Aシート> D2~D500まで顧客番号が入力されています。 <Bシート> C2~C600まで顧客番号が入力されています。 AシートとBシートの顧客番号はいくつか重複しています。 その重複している番号をBシートのどこかのセルに”重複”と表示したいのですが、その方法が分かりません。最終的にオートフィルタで重複と重複していないものを分けたいのです。 大至急教えてください!宜しくお願いします。

  • エクセル2003 重複データの抽出

    エクセル2003を使っています。 重複したデータの抽出を行いたいのですが、 例えば、  A      B     C      D コード  書籍名  出版社名  著者 といった感じのデータが1万件ほどあります。 このうち、B列の「書籍名」が重複しているデータを抽出したい です。(抽出したものは、書籍名だけではなくて、ほかの出版社や著者の指定したデータも表示させたい。) VLOOKUPなどを使えばできないこともないのですが、一万件の 処理を行う上に、パソコンも非力なので時間がかかってしまい 困っています。 どうぞよろしくお願いします。

  • Excel 2つの重複データに重複先セル番地を表示させたい!

    お世話になります。 エクセルで2つの重複しているデータがランダムにがあります。 下記のように表示いたいのですが、良いほうを教えて下さい。 たとえばA1のみかんがA7と重複している時【7】と表示したい ※VBAはわかりません。関数は得意です。  よろしくお願いします。 A  B C 1  7 みかん 2  5 りんご 3    もも 4  6 なし 5  2  りんご 6  4  なし 7  1  みかん 8  9  ぶどう 9  8  ぶどう

  • A列のデータの重複を取り除いてC列に表示。ただし、B列に存在するデータはC列に表示させない

    お世話になります。 Excel2000を使っています。 A列のデータがA1,A2,...の順に 1 2 3 2 3 4 B列のデータがB1,B2,...の順に 2 4 6 8 だとします。 まず、A列のうち重複するデータは1つとみなして 1 2 3 4 とし(順番はどうでもいいです)、 さらにB列に含まれる2,4,6,8を取り除いた 1 3 をC列に表示させたいです。C列の順番はどうでもいいです。 どうすればできるでしょうか?ご教示ください。よろしくお願いします。

  • Excelで隣り合う列にあるデータの重複チェック

    Excelで同一のシート上の隣り合う列に入力されたデータの重複チェックをする方法が知りたいです。 例:A1とB1にそれぞれデータ(長文もあり)が入っていて、それぞれのデータが重複していればC1に「重複あり」などと表示させるための数式が知りたいです。 いろいろとやってみたのですが、どうもうまく行きません。 よろしくお願い致します。