マクロ講座 動画編 42回
全自動で繰り返し複数ページの請求書、部品マクロのコード解説

動画でExcel 請求書発行コード編 ExcelVBA 複数ページを得意先ごとに繰り返し
メインのプログラムのコードは、データをフィルタリングして、どのように転記するかということで、請求書1枚のケース2枚のケースとこれまでに2回説明しているので
それほど難しくはなくなったとおもいます。メインのプログラムに部品化したコードを追加することで複雑な処理を行なっていきます。
ぜひ動画を見ながら、コード解説をご覧ください。
F5キーを押して実行します。すると、マークのついているところで止まりました。これは部品です。
Call firstmake_sh というコードです。Call ステートメントで、後ろに続くfirstmake_shという部品マクロを呼び出します。

部品マクロ、Sub firstmake_sh()に移動しました。これはSub ステートメントで引数もありませんから、単独で動くマクロです。ここでは部品としてつかっています。
何をするかというと 作業用のシートを追加するマクロです。今回の 請求書発行にあたって 対象となる取引先を絞り込むための請求対象というシートと、それから転記するための補助として
使う作業という名前のシート2つを作成します。

Application.ScreenUpdating = False
Set sh_target = Sheets.Add(After:=Worksheets(Worksheets.Count))
ActiveSheet.Name = "請求対象"
Set sh_sagyou = Sheets.Add(After:=Worksheets(Worksheets.Count))
ActiveSheet.Name = "作業"シートを追加した後、さらに次のコードにより、売上シート上の売り上げデータから対象月でデータを絞り込む操作をしています。

With ws
rng.AutoFilter Field:=1, Operator:=xlFilterValues, _
Criteria2:=Array(1, Range("対象月").Value)
.Range("B5").CurrentRegion.Columns(2).Select
rng.CurrentRegion.Columns(2).Copy
End With
月で絞り込む場合のオペレーターには xlFilterValues を使い criteria 2で指定します。
Criteria2:=Array(1, Range("対象月").Value)
Operator:=xlFilterValuesの使い方
Operator:= xlFilterValuesは、複数選択する場合の指定方法です。
たとえば、下図の例では、
Criteria2:=Array(1, "2022/10 /1") と指定することで、1はその後ろの月(10月)を指定することができます。
2022年の10月ならばすべて日付を抽出できるということになります。

Operator:= xlFilterValues
Criteria2:=Array(2, "2022/10/1 ") とすれば、2は日ですから、10/1のみを抽出します。
これが、Criteria2:=Array(0, "2022 /10/1")で0指定ですと、2022年を指定し抽出できます。

シートのデータを月で絞り込めたのでその、次に書いてあるコードで、データの得意先の列だけをコピーして作成したシート請求対象という名前のシートに貼り付けます。
rng.CurrentRegion.Columns(2).Copy

貼り付け先では、CurrentRegion.RemoveDuplicatesを使って重複を削除します。これにより、該当月の請求先が決まります。

作業用のシートを作成する部品マクロのコード
Public shnew1 As Worksheet
Public sh_target As Worksheet, sh_sagyou As Worksheet
Sub firstmake_sh()
Application.ScreenUpdating = False
Set sh_target = Sheets.Add(After:=Worksheets(Worksheets.Count))
ActiveSheet.Name = "請求対象"
Set sh_sagyou = Sheets.Add(After:=Worksheets(Worksheets.Count))
ActiveSheet.Name = "作業"
'**********該当取引先の抽出
Set ws = sh_uriage
Set rng = ws.Range("A5").CurrentRegion
ws.Activate
Application.ScreenUpdating = False
With ws
rng.AutoFilter Field:=1, Operator:=xlFilterValues, _
Criteria2:=Array(1, Range("対象月").Value)
.Range("B5").CurrentRegion.Columns(2).Select
rng.CurrentRegion.Columns(2).Copy
End With
'****** sh_targetにはる ***********
With sh_target
.Range("A1").PasteSpecial Paste:=xlPasteValues
.Range("A1").CurrentRegion.RemoveDuplicates Columns:=Array(1), _
Header:=xlYes
End With
End Sub