• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAを使用しての重複チェック→住所録作成)

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

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

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

  • ベストアンサー
  • 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/7941)
回答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

専門家に質問してみよう