重複するidをデータごとにまとめるvbaのコード

このQ&Aのポイント
  • Excel VBAを使用して、重複するidをデータごとにまとめるコードの作成方法を教えてください。
  • 1000件以上のデータがあるExcelシートで、同じidを持つ行を3行ずつ横に表示する方法を教えてください。
  • 同じidを持つ行が3行に満たない場合は改行し、3行以上ある場合は3行ごとに改行するコードを教えてください。
回答を見る
  • ベストアンサー

重複するidをデータごとにまとめるvbaのコード

excel vbaで次のようなコードを作りたいです。 シート1に元データが4000件ほどあります。 シート2に、シート1のidが同じものを、3行ずつ横に表示したいです。 idと名前は1度のみ、それ以降は都道府県名と数字のみ表示します。 同じidを持つものが3行に満たないのであれば、改行します。 同じidを持つものが3行以上ある場合は、3行ごとに改行します。 1 佐藤 東京 1000 1 佐藤 千葉 2100 1 佐藤 青森 1300 2 鈴木 東京 5600 2 鈴木 千葉 3500 3 山田 三重 2910 3 山田 長野 3820 3 山田 山口 8760 3 山田 沖縄 6560 4 : ↓ 1 佐藤 東京 1000 千葉 2100 青森 1300 2 鈴木 東京 5600 千葉 3500 3 山田 三重 2910 長野 3820 山口 8760 3 山田 沖縄 6560 4 : どなたかこのような動作を行うvbaのコードを教えてください。 よろしくお願いします。

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

  • ベストアンサー
  • eden3616
  • ベストアンサー率65% (267/405)
回答No.1

(1)Alt+F11でVBEを開き、挿入→標準モジュール (2)作成された標準モジュールへ以下のVBAコードを貼付 (3)コード内の以下の箇所を該当のシート名に合わせて修正    '対象のシートを設定    Set mySt(0) = Worksheets("Sheet1") ←元データのシート    Set mySt(1) = Worksheets("Sheet2") ←表示先のシート (4)Alt+F11でVBEを閉じ、Alt+F8で「sample」マクロを実行 ※補足 処理中で使用している区切り文字列について 元データのA列(ID)に「;」「,」を含む場合は正常に動作しません。 含む可能性がある場合は、コード内の以下の箇所をそれぞれ元データで使用していない 文字列に変更してください。(key(0)とkey(1)は別の文字列としてください)    key(0) = ";": key(1) = "," ■VBAコード Sub sample() '変数を宣言 Dim mySt(1) As Worksheet, key(1) As String Dim bsData() As Variant, myData() As Variant Dim i As Long, j As Long, cnt As Long Dim names() As String, buf As Variant Dim tar As Range, flag As Boolean '対象のシートを設定 Set mySt(0) = Worksheets("Sheet1") Set mySt(1) = Worksheets("Sheet2") '区切り文字(必要であれば変更) key(0) = ";": key(1) = "," '配列にデータを格納 With mySt(0)   bsData = .Range(.Cells(1, "A"), .Cells(Rows.Count, "C").End(xlUp)) End With '重複しない名前の配列を作成 For i = 1 To UBound(bsData, 1)   flag = True   If Sgn(names) <> 0 Then     For j = 0 To UBound(names, 2)       If names(0, j) = bsData(i, 1) Then         flag = False         Exit For       End If     Next j   End If   If flag Then     If Sgn(names) = 0 Then       ReDim names(1, 1)     Else       ReDim Preserve names(1, UBound(names, 2) + 1)     End If     names(0, UBound(names, 2)) = bsData(i, 1)   End If Next i '名前配列へ同名のデータを集約 For i = 1 To UBound(names, 2)   For j = 1 To UBound(bsData, 1)     If bsData(j, 1) = names(0, i) Then       names(1, i) = names(1, i) & bsData(j, 2) & key(1) & bsData(j, 3) & key(0)     End If   Next j Next i 'シートへ書き出し Application.ScreenUpdating = False With mySt(1)   .Cells.ClearContents   For i = 1 To UBound(names, 2)     buf = Split(names(1, i), key(0))     For j = 0 To UBound(buf) - 1       If j Mod 3 = 0 Then         cnt = cnt + 1         Set tar = .Cells(cnt, "A")         tar = names(0, i)       End If       tar.Offset(0, (j Mod 3) * 2 + 1) = Left(buf(j), InStr(1, buf(j), key(1)) - 1)       tar.Offset(0, (j Mod 3) * 2 + 2) = Right(buf(j), Len(buf(j)) - InStr(1, buf(j), key(1)))     Next j   Next i End With Application.ScreenUpdating = True '終了 MsgBox "終了" End Sub

spinia0120
質問者

お礼

完璧です! 本当にありがとうございました!!

関連するQ&A

  • エクセルのデータ並べ替え(抽出)の方法

    エクセルのデータ並べ替え(抽出)の方法 を教えてください。 下記のようなデータがあるとします。   A    B    C   D 1 田中  東京  千葉  福岡 2 山田  京都  滋賀 3 佐藤  奈良  青森  USA 4 鈴木  カナダ 愛媛 A列は名前、B列以降は文字列です。B列以降はC列までの行、D列までの行とさまざまです。重複セルはありません。 これを下記のように並べ替えたいです。   A    B    C   D 1東京  田中 2千葉  田中 3福岡  田中 4京都  山田 5滋賀  山田 6奈良  佐藤 7青森  佐藤 8USA   佐藤 9カナダ 鈴木 10愛媛  鈴木 こういうことは可能でしょうか??? 教えてください。 よろしくお願いします。

  • ExcelのVBAに明るい方・・・

    Excelの、Sheet1 に 1日目,鈴木くん,点数,・・・ 2日目,佐藤くん,点数,・・・ 2日目,山田くん,点数,・・・ 3日目,佐藤くん,点数,・・・ 3日目,鈴木くん,点数,・・・ 4日目,山田くん,点数,・・・ ・・・ という、元ダネの一覧表があって、 このデータを日々追加入力していくごとに、自動的に、 Sheet2 には、鈴木くんのみの一覧表のデータ 1日目,鈴木くん,点数,・・・ 3日目,鈴木くん,点数,・・・ ・・・ Sheet3 には、佐藤くんのみの一覧表のデータ 2日目,佐藤くん,点数,・・・ 3日目,佐藤くん,点数,・・・ ・・・ Sheet4 には、山田くんのみの一覧表のデータ 2日目,山田くん,点数,・・・ 4日目,山田くん,点数,・・・ ・・・ が、自動的に追加入力されるVBAの記述って、 どうすればいいんでしょうか? VBAに明るい方、どうかよろしくお願いします。

  • エクセル キーとなる項目で判別し重複データ行を削除したい

    エクセル2002を使用しています。 差込印刷用のデータとして整える方法を教えていただきたいと存じます。 具体的には、子供ごとのレコードデータから、親宛の封筒宛名ラベルを作成したいと考えていて、2人兄弟や3人兄弟の場合でも封筒は1通なので、 キーとなる項目を目安に、不必要な行を削除すればできると考えましたが、具体的な方法がわからないでいます。 現在のデータは、以下のものです。(簡潔にするために列を部分的に省いています) 世帯コード   親の氏名   住所           子の氏名 0011223    鈴木 一郎  東京都千代田区一丁目   鈴木 次郎 0011223    鈴木 一郎  東京都千代田区一丁目   鈴木 三郎 0011223    鈴木 一郎  東京都千代田区一丁目   鈴木 四郎 0011556    山田 花子  埼玉県川口市中央     山田 洋子 0011556    山田 花子  埼玉県川口市中央     山田 和夫 0153355    佐藤 次郎  千葉県船橋市海浜     佐藤 みく 0002333    鈴木 一郎  神奈川県川崎区高津区   鈴木 空 0002333    鈴木 一郎  神奈川県川崎区高津区   鈴木 陸 これを、次のように「世帯コード」で判別して世帯ごとの最初の行だけを抜き出したり、2行目以降を削除したりできれば、差込印刷用のデータとして利用できると思います。 世帯コード   親の氏名   住所           子の氏名 0011223    鈴木 一郎  東京都千代田区一丁目   鈴木 次郎 0011556    山田 花子  埼玉県川口市中央     山田 洋子 0153355    佐藤 次郎  千葉県船橋市海浜     佐藤 みく 0002333    鈴木 一郎  神奈川県川崎区高津区   鈴木 空 (世帯ごとに一行ずつになっています。親の氏名のうち、鈴木 一郎 さんは、同姓同名の方です。世帯コードが違うので区分できます。) エクセルの機能でこのようにできる方法はあるでしょうか? もしくは別の方法でも、宛名ラベルを親宛に一枚印刷できる方法があるでしょうか? お願いいたします。 データ用のシートですので、行や列の挿入や別シートの利用などはすべてできますので、よろしくお願いいたします。

  • バラバラになっている名前をきれいに並べたい

    エクセルで表を作成しています。 山田太郎  東京 鈴木花子  神奈川 佐藤一太郎 千葉 山田太郎  東京 山田太郎  東京 鈴木花子  神奈川 佐藤一太郎 千葉 ↓ 山田太郎  東京 山田太郎  東京 山田太郎  東京 鈴木花子  神奈川 鈴木花子  神奈川 佐藤一太郎 千葉 佐藤一太郎 千葉 のようにきれいに並べる方法はないでしょうか? よろしくおねがいします。

  • VBAのマクロで、複数行を1行に集計

    お世話になります。VBA初心者です。 下記のような表があった場合、請求書番号が同じものをVBAで1行に集計するにはどうしたらよろしいのでしょうか? 請求書No.|顧客名|摘要|金額 111111  |鈴木 | A |100 111111 |鈴木 | S |160 222222 |佐藤 | F |500 555555 |山田 | A |150 555555 |山田 | D |200 888888 |鈴木 | S |160  ↓下記のように集計 請求書No.|顧客名|摘要|金額 111111 |鈴木 | A |260 222222 |佐藤 | F |500 555555 |山田 | A |350 888888 |鈴木 | S |160 摘要は各請求書番号の最初の行を使います。重複は2行とは限りません。また、最終的に何枚の請求書があるのかも計算させたいのです。ただしこれはどこかに関数"=counta()"を使えばVBAでなくても出来るのですが。 よろしくお願いいたします。

  • EXCEL VBAの記述をお願いします

    添付ファイル1.の表は一カ月のシフト表です各記号で役割があります上段(1)(1)が午前、下段が午後(2)(2)です。お願いしたいのはこのシフト表から2.の表に実績として1日の(1)はだれ(1)はだれ、(2)はだれと代入したいのです。 お願いは代入する式をお願いしたい。 1.の表です 1月  1日 2日 3日 4日 鈴木 (1)  (1)  (2) (2)    これらは縦横の罫線が引いてあります 佐藤 (1)  (1)  (2)  (2) 山田  (1) (1)  (2) (2) 伊藤  (1)  (1)  (2)  (2) 2.の表です 1月 1日  2日 3日  4日 (1) 鈴木 伊藤 山田  山田 (1) 佐藤 鈴木 伊藤  佐藤 (2) 山田  佐藤 鈴木  伊藤 (2) 伊藤  山田 佐藤  鈴木 このように1.の表から代入するVBAでの式をお願いいたします 画像添付ファイルもあります

  • VBAを使用しての重複チェック→住所録作成

    VBAを始めたばかりの初心者です。 VBAにて受注データの重複チェックを行い、別シートへ住所録を作りたく奮闘しております。 他のシステムへインポートするため関数を使用するとなぜかエラーが出てしまうのでVBAのみで対応したいです。 Excelはバージョン2016です。 ▼受注データはおおむね下記の状態です。 シート1 A      B   C   D   E  F  G    H   I 受注日   電話1 電話2 電話3 名前 住所 商品  数量  受注ID 2016/2/5  11   111  1111 山田 東京 りんご  5  123-11111 2016/2/5  11   111  1111 山田 東京 いちご  2  123-11111 2016/2/5  11   111  1111 山田 東京 バナナ  6  123-11111 2016/2/5  80   8888 8888 鈴木 福岡 メロン  1  123-22222 2016/2/8  44   444  4444 加藤 奈良 りんご  3  123-33333 2016/2/8  44   444  4444 加藤 奈良 すいか  1  123-33333 2016/2/8  44   444  4444 加藤 奈良 ぶどう  5  123-33333 2016/2/8  44   444  4444 加藤 奈良 レモン  6  123-33333 2016/2/8  44   444  4444 加藤 奈良 いちご  2  123-33333 ▼やりたいこと シート2に受注IDを基に重複しないよう抽出して住所録を作りたいです。 (1) I列で重複をチェック (2) B列の電話1ですが先頭にOが削除されて表示されるのでシート2では0を付与してリスト化 (3) B列~D列の電話番号をシート2のリスト化の際には1つのセルに(ハイフンなしで)まとめる (4) (3)とは別のセルにB列~D列の電話番号をハイフンを付与してまとめる   ※電話番号は固定電話と携帯電話の番号が混ざっています。 (5) 住所録はシート2に作成 補足 (3)の情報は別システムのID(コード)として使用します。 (4)はそのまま電話番号として使用します。 ▼理想的な状態 A       B    C    D ID      名前   住所   電話  0111111111  山田   東京   011-111-1111 08088888888 鈴木   福岡   080-8888-8888 0444444444  加藤   奈良   044-444-4444 ▼難しそうなら最悪 A      B   C   D   E  F  G    H   I 受注日   電話1 電話2 電話3 名前 住所 商品  数量  受注ID 2016/2/5  11   111  1111 山田 東京 りんご  5  123-11111 2016/2/5  80   8888 8888 鈴木 福岡 メロン  1  123-22222 2016/2/8  44   444  4444 加藤 奈良 りんご  3  123-33333 までの状態にはもっていきたいです。 Webにて有志のかたの参考情報を基に 受注IDから重複チェックを行い特定のセルのみを抽出することは出来たのですが 行全体を抽出する方法がわかりませんでした…。 よろしくお願いいたします。

  • エクセル VBA リストを参照して 色を変えたい

    Sheet1に リストとして       A    B    C    D --+-------+-------+-------+-------+------+-------+------- 1   山田 --+-------+-------+-------+-------+------+-------+------- 2   鈴木 --+-------+-------+-------+-------+------+-------+------- 3   佐藤 --+-------+-------+-------+-------+------+-------+------- 4   内藤 Sheet2に 一覧表として       A    B     C    D --+-------+-------+-------+-------+------+-------+------- 1   山田   赤松   斎藤   内藤 --+-------+-------+-------+-------+------+-------+------- 2   佐藤   清水   鈴木   米田 --+-------+-------+-------+-------+------+-------+------- 3   上田   今川   藤本   越崎 --+-------+-------+-------+-------+------+-------+------- 4   千葉   尾崎   松田   安西 と、作成した場合、Sheet1のリストにある名前のみ フォントカラーを赤にするマクロを組んでいただきたいのですが・・・ 宜しくお願いします。

  • 【エクセル】リストの照合について教えてください!!

    sheet1に、下記の様に600件の氏名が書いてあります。 A      B 1     山田太郎  2     鈴木花子 ・・・ 600   佐藤次郎 sheet2に、地域と氏名がずらっと書いてあります。 A      B      C     D    E 東京都   神奈川県   埼玉県   千葉県  茨城県 山田太郎 鈴木太郎 山田花子 佐藤次郎 ・・・ このsheet2の地域を、sheet1のC列に下記の様に入れたいのですが、 どの様に行ったら良いでしょうか? みなさんのお知恵をください!!宜しくお願い致します。 A      B      C 1     山田太郎   東京都 2     鈴木花子   神奈川県 ・・・ 600   佐藤次郎   埼玉県

  • excel男女混合名簿を別のシートへ男女別にしたい

    sheet1に、男女混合名簿を作成しました。    A    B    C    D    E 1  年   組   性  名前   住所  2   1   1    男   山田   東京都 3   1    1   女   鈴木   神奈川県 4   1    1   男   高橋   埼玉県 5 1 1 男  佐藤  千葉県 6 1 1 女  田中 茨城県 7 1 1 男  松井  沖縄県 sheet2に、男女別の名前だけの名簿(男だけが先女だけが後)   A   B  C  D  E 1 山田 2 高橋 3 佐藤 4 松井 5 鈴木 6 田中 のようにしたいのですが、どうしたらいいですか? (1)sheet1が変更されたら、sheet2も自動的に変更したい。 (2)VBAなしで という初心者向けのわがままですが、よろしくお願いいたします。  

専門家に質問してみよう