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

このQ&Aのポイント
  • VBAを使用して受注データの重複チェックを行い、別シートに住所録を作成する方法についての質問です。
  • Excelのバージョン2016で、VBAのみを使用して重複チェックと住所録作成を行いたいです。
  • 要件として、(1)I列での重複チェック、(2)B列の電話番号には先頭に0を付与し、ハイフンなしでまとめる、(3)別シートに住所録を作成することがあります。
回答を見る
  • ベストアンサー

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から重複チェックを行い特定のセルのみを抽出することは出来たのですが 行全体を抽出する方法がわかりませんでした…。 よろしくお願いいたします。

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

  • ベストアンサー
  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.1

こんにちは テストブックで、 Sub test()   Dim t As Range   With Worksheets("Sheet2")     .Cells.Clear     .Range("A1").Value = "受注ID"     .Range("B1").Value = "名前"     .Range("C1").Value = "住所"     .Range("D1").Value = "電話1"     .Range("E1").Value = "電話2"     .Range("F1").Value = "電話3"     .Range("G1").Value = "電話1"     With Worksheets("Sheet1")       .Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _         CopyToRange:=Worksheets("Sheet2").Range("A1:G1"), Unique:=True     End With     Set t = Intersect(.UsedRange.Offset(1), .Range("A1").CurrentRegion)     With t.Columns(7)       .FormulaR1C1 = "=""0""&RC[-3]&""-""&RC[-2]&""-""&RC[-1]"       .Value = .Value     End With     With t.Columns(1)       .FormulaR1C1 = "=""'""&SUBSTITUTE(RC[6],""-"","""")"       .Value = .Value     End With     .Range("D:F").Delete     .Range("A1").Value = "ID"     .Range("D1").Value = "電話"   End With End Sub とか、色々。

torento19
質問者

お礼

質問後、素早いご回答ありがとうございました。 まだまだ未熟で、VBAの内容を全て理解出来ていませんが、コピペのみで理想的なレイアウトになり感動しております。 これから、いただきましたアドバス(VBA)を参考にして勉強して参ります。

その他の回答 (2)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

1行目にタイトル行,2行目からデータとして sub macro1()  dim w as worksheet  dim w0 as worksheet  dim LastRow as long  set w0 = activesheet  set w = worksheets.add(after:=w0) ’複製後に重複削除  w0.range("B:F,I:I").copy destination:=w.range("A1")  range("A:F").removeduplicates columns:=6, header:=xlyes  lastrow = cells(rows.count, "F").end(xlup).row ’電話・ID欄の準備  range("F:F").insert shift:=xlshifttoright  range("F1") = "電話"  with range("F2:F" & lastrow)   .formula = "=0&A2&""-""&B2&""-""&C2"   .value = .value  end with  range("D:D").insert shift:=xlshifttoright  range("D1") = "ID"  with range("D2:D" & lastrow)   .formula = "=0&A2&B2&C2"   .numberformat = "@"   .value = .value  end with ’片付け  range("H:H").clearcontents  range("A:A").delete shift:=xlshifttoleft  range("D:D").columns.autofit end sub

torento19
質問者

お礼

この度のアドバイスありがとうございます。 1つ1つ、どのような動作のVBAなのかコメントも付けていただき大変分かりやすいアドバイスです。感動しております。 いただきましたアドバイスを基にVBAの意味を確認しながら、精進して参ります。 ありがとうございました。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 シート1において何行目からリストが始まっているのかという事や、シート2において何行目以下にリストを作成すれば良いのか、という事が御質問文中には示されておりませんので、取り敢えず仮の話として、シート1の2行目には「受注日」、「電話1」、「電話2」、「電話3」、「名前」、「住所」、「商品」、「数量」、「受注ID」といった項目名が入力されていて、住所録のリストの中で「ID」、「名前」、「住所」、「電話」等の項目名が入力されているのはシート2の2行目である場合に対応するVBAを回答致します。 Sub QNo9137333_VBAを使用しての重複チェック→住所録作成() Const DataSheetName = "Sheet1" '元データシートのシート名 Const PasteSheetName = "Sheet2" '抽出先のシートのシート名 Const FirstPasteCell = "A2" '抽出先のリストのセル範囲中における左上の隅のセル Const ItemRow = 2 '元データシートにおいて「受注日」~「受注ID」等の項目名欄として使用されている行の行番号 Dim DataSheet As Worksheet, PasteSheet As Worksheet, DataColumn As Variant _ , TelColumn As Variant, LastRow As Long, c As Range, i As Long, j As Long DataColumn = Array("I", "E", "F") 'ID、名前、住所が入力されている列の列番号 TelColumn = Array("B", "C", "D") '電話番号が入力されている列の列番号 If IsError(Evaluate("ROW('" & DataSheetName & "'!A1)")) Then MsgBox "元データが入力されているシートとして設定されている" _ & vbCrLf & vbCrLf & DataSheetName & vbCrLf & vbCrLf & _ "というシート名のシートが見つかりません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "存在しないシート" Exit Sub End If Set DataSheet = Sheets(DataSheetName) LastRow = DataSheet.Range(DataColumn(0) & Rows.Count).End(xlUp).row If LastRow <= ItemRow Then MsgBox "処理すべきデータが見当たりませんません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If Set TelNo = DataSheet.Range("B" & ItemRow + 1 & ":D" & LastRow) If IsError(Evaluate("ROW('" & PasteSheetName & "'!A1)")) Then Set PasteSheet = Worksheets.Add() PasteSheet.Name = PasteSheetName Else Set PasteSheet = Sheets(PasteSheetName) End If With Application .ScreenUpdating = False .Calculation = xlManual End With With DataSheet.Range(DataColumn(0) & ItemRow & ":" & DataColumn(0) & LastRow) .AdvancedFilter Action:=xlFilterInPlace, Unique:=True End With PasteSheet.Range(FirstPasteCell & ":" & PasteSheet.Cells _ .SpecialCells(xlCellTypeLastCell).Address).ClearContents j = -1 For Each c In DataSheet.Range("A" & ItemRow & ":" _ & "A" & LastRow).SpecialCells(xlCellTypeVisible) j = j + 1 With PasteSheet.Range(FirstPasteCell) For i = 0 To UBound(DataColumn) .Offset(j, i).Value = DataSheet.Cells(c.row, DataColumn(i)).Value Next i With .Offset(, UBound(DataColumn) + 1) If j = 0 Then .Value = "電話" Else For i = 0 To UBound(TelColumn) .Offset(j).Value = _ .Offset(j).Value & "-" & DataSheet.Range(TelColumn(i) & c.row).Value Next i .Offset(j).Value = Mid(.Offset(j).Value, 2) End If End With End With Next c DataSheet.ShowAllData With Application .Calculation = xlAutomatic .ScreenUpdating = True End With End Sub

torento19
質問者

お礼

私の質問の仕方などに不備がある中、大変ご丁寧なアドバスをいただきありがとうございました。 MsgBoxの処理なども付けていただいているようで感動しております。 これからいただきましたアドバイスを参考にして、1つづつVBAの意味を理解しながら勉強して参ります。 分かない点がありましたら、またOKWebで質問させていただいます。

関連するQ&A

  • エクセルで重複のチェックをしたい

    初心者なので、拙い内容ですが教えてください。 ・エクセル2003 二つのシートにそれぞれA列に企業名、B列に支店名、 C列に郵便番号、D列に住所が入力されています。 二つのシートはほぼ同じ内容で、シート1は3000件の全データ、 シート2は抽出された1300件のデータが入力されています。 やりたいことは3000件のうちの1300件の重複データを シート1の全データの空白列に「重複」や  重複データには行に色をつけて表示させる、などとにかく 重複をわかりやすく表示させたいのです。 過去ログみましたが、いまいち理解できませんでしたので わかりやすく教示してくださると助かります! ちなみに二つのデータをひとつにし、フィルタオプションの 「重複するレコードは・・」は検討違いだったようでうまくいきませんでした・・ ひとつの列に対する重複チェックは理解できたのですが.. 支店によって住所が違ってくるので、たちどまってしまいました。

  • エクセル 重複数字の書き換えについて

    シート1のA列に番号(重複番号あり) B列に項目。シート2のA列に番号(重複番号なし) B列に項目。シート2の順番を正としてシート1のA列重複番号をVBAで書き換えるには、どうしたらよろしいか。 【シート1】   【シート2】    【シート1】 1 りんご     1 バナナ     3 りんご 2 バナナ     2 すいか     1 バナナ   2 バナナ     3 りんご ⇒   1 バナナ   2 バナナ               1 バナナ  3 すいか               2 すいか

  • Excelで重複チェックの方法

    重複データのチェックについて教えてください。 シート1にA支店の顧客データ、シート2にB支店の顧客データがあります。シートの構成は、A列に名前、B列に電話番号があります。 これで、A支店に顧客登録されていて、同じくB支店にも登録されている人を選び出し、支店間で同一人物を登録しないようにしたいのですが、どのようにしたら良いでしょうか。 私が考えるにはA列の名前でVLOOKUPを使えばいいと思うのですが、これだと同姓同名のダブりチェックが出来ないですね。名前が同じなら電話番号で比較しようと思うのですが、良く分かりません。 シート1のA支店を基準にしてシート2のB支店と比較し、重複していれば仮にC列に「重複」と表示させる。 ・・・としたいのですが、どなたか教えてください。

  • VBAで重複していない行を削除したいです。

    初めてgoo質問を使います。 sheet1とsheet2の1列目と2列目で重複していない行を sheet2から削除したいです。 例えば、 Aの列に番号?、Bの列に数字 sheet1 A B CDEF 1 番号A 1 2 番号A 2  3 番号A 3 4 番号C 1 5 番号C 2 6 番号F 6 7 番号F 7 8 番号F 8 9 番号F 9 10 番号F 10 sheet2 A B CDEF 1 番号A 1 2 番号A 2  3 番号A 3 4 番号B 1 5 番号B 2 6 番号B 3 7 番号C 1 8 番号C 2 9 番号D 8 10 番号D 10 があったとして、上記を下記のようにしたいです。 sheet2 A B CDEF 1 番号A 1 2 番号A 2  3 番号A 3 4 番号C 1 5 番号C 2 6 番号F 6 7 番号F 7 8 番号F 8 9 番号F 9 10 番号F 10 CDEFの列にはsheet1とsheet2で違うデータが入っています。 sheet2から重複していない行を削除したいです。 宜しくお願いします。

  • 【Excel VBA】重複行の削除

    はじめまして。 IDの重複を削除し、日付データを横1列にまとめるVBAについてご教示いただけますと幸いです。 ------------------------------------------------------- ▼シート1(データ入力がされているシート)    A   B   C   D   E   F    1   ID 日付 2  1234  1/1  1/6  1/10  1/20   3  1234  2/3  2/20 4  1234  3/2 5  7777  1/10  1/15  1/20 6  7777  2/2   2/12  2/22 7  9876  2/3 ⇓ マクロ起動後 ▼シート2(重複行を削除しまとめたシート)    A   B   C   D   E   F   G   H 1   ID 日付 2  1234  1/1  1/6  1/10  1/20  2/3  2/20  3/2 3  7777  1/10  1/15  1/20  2/2  2/12  2/22 4  9876  2/3 【補足】 列情報  ・A列…ID  ・B-F列…日付(左詰め) ※日付はIDごと月毎に行が変わるため、IDによって複数行存在する場合があります。 ※A列のIDは重複しない場合もあれば、4行以上ある場合があります。 ※シート1のデータはおおよそ1000-5000行です。 ※IDに対して、日付は5つあれば問題ありません。そのためG列以降の日付を削除しても支障はございません。 ------------------------------------------------------ VBAの知識があまりなく、調べて出てきたものをコピペ使用も試みたのですが、 上手く動かす事ができませんでした…。 お力添え頂けますと幸いです…。 Windows10でエクセル2016を使用しております。 何卒宜しくお願いいたします。

  • エクセル)2シート間の重複データのチェック

    シート1 A列(チェック欄)B列(会社名)C列(商品名) シート2 A列(チェック欄)B列(会社名)C列(商品名) というエクセルの表があります。 A列(チェック欄)は、 シート1のA列は「B列C列の内容がシート2と重複するもの」にチェック、 シート2のA列は「B列C列の内容がシート1と重複するもの」にチェック、 をいれています。 いずれも、B列C列がそろって重複している場合にのみチェックをしています。 B列のみ、C列のみの場合はチェックをいれません。 シート1 ☆ い社 りんご   い社 みかん   ろ社 みかん ☆ は社 ぶどう   に社 すいか   に社 りんご シート2 ☆ い社 りんご   ろ社 いちご   ろ社 すいか   ろ社 もも ☆ は社 ぶどう   に社 いちご というようなかんじです。 このA欄のチェックを自動でできるように関数を入力したいのですが、 どうすればよいでしょうか?

  • 重複データの計算式

      教えてください!      B    G    i     N    O    Q   V   W     1  飴   20個  ガム  5個   重複  アイス 4個      2  ガム  3個  りんご 2個         飴  4個  重複   3 すいか 1個   桃   3個        ブドウ 2個        別シート      A    B     C    D     E    F            1  飴   24個   りんご  2個   アイス  4個   2  ガム  8個    桃    3個   ブドウ  2個   3 すいか 1個      B1の飴20個とQ2の飴4個 B2のガム3個とI1のガム5個、飴、ガムの重複す  るデータどうしが、B、I、Q列に不特定にある場合の計算式を教えてください。   B列に対してI列、Q列の商品が重複までは抽出はできましたが、   別シートのセルに重複しない表を作りたいのです、   別シートB1、B2 D2、F2に入る関数を教えてください。  

  • エクセルで重複データの削除の方法

    エクセルのSheet1に下記のような住所録データが1万件近くあります。 電話番号をキーに重複するデータは削除したいです。 なにか良い方法がないか御指導下さい。    A     B       C        D 1 氏名   電話番号    郵便番号  住所 2 山田真理 0355551111  100-2222  東京都港区・・・ 3 島本夕太 0432225555  300-5555  北海道札幌市・・・ 4 市川正一 0355559999  444-6666  東京都北区・・・ 5 市川正一 0355559999  444-6666  東京都北区・・・ 6 島本夕太 0432225555  300-5555  北海道札幌市・・・ 7 山田真理 0355551111  100-2222  東京都港区・・・ 8 島本夕太 0432225555  300-5555  北海道札幌市・・・ 9 市川正一 0355559999  444-6666  東京都北区・・・   

  • エクセルで作成した一覧表をカード形式にしたい。

    エクセルで作成した一覧表をカード形式にしたいのですが 例えばsheet1の 列1のセルA、B、C、D、E、Fに 山田さんの住所、氏名、年齢、職業、電話、備考 列2にセルA、B、C、D、E、Fに 佐藤さんの住所、氏名、年齢、職業、電話、備考、 列3にセルA、B、C、D、E、Fに 大山さんの… (以降は同様の繰り返し)を入力したとき、 sheet2の 列1のセルA、Bに山田さんの住所、氏名、 列2のセルA、Bに山田さんの年齢、職業、 列3にセルA、Bに山田さんの電話番号、備考、 列4にセルA、Bに佐藤さんの住所、氏名、 列5にセルA、Bに佐藤さんの年齢、職業、 列6にセルA、Bに佐藤さんの電話番号、備考、 列7にセルA、Bに大山さんの住所、氏名、 列8にセルA、Bに大山さんの年齢、職業、 列9にセルA、Bに大山さん電話番号、備考、 列10… と表示されるようにしたいのですが sheet2のA1、B1、A2、B2、A3、B3セルに数式を入力し 列4以降にコピーしても飛び飛びになってうまくいきません。 入力規則かと6列目まで増やしてコピーしても 7列目以降に正しくコピーできません。 何か関数が必要なのでしょうか?過去の質問も検索しましたが よく分かりません。よろしくお願いします。

  • エクセル2000:こんな重複チェックの仕方を教えてください

    下記B列のように関数を入れると、重複していないものが1、しているものが2以上の数値を返します。「1」で、オートフィルタをかけると重複したものを表示しないと思いきや、下の例では山田太郎も当然、表示されません。そこで、山田太郎のうち、一回目の山田太郎は「1」で返すということはできますか?そうするとオートフィルタで正しい重複チェック後の抽出ができると思うのですが・・・。それとももっと簡単な方法はあるのでしょうか?   A       B       B列に入れる計算式       =COUNTIF(A:A,$A1) 山田太郎   2 川村花子   1 山田太郎   2

専門家に質問してみよう