請求書データベースというシートがあります。毎月の売り上げが入りますが、同じ会社でも月に何回も注文があることがあります。そこで以下のマクロを作りました。
・売上日から該当月のフィルターをかけて、表示させ、そのシート全体を作業用シートにいったんコピーします。
・作業用シートから重複する会社コードを除く会社コードリストを今月処理件数というシートにコピーします。
上記内容はマクロボタン一つで実行できるようにしてあります。
次に今月処理件数のシート上で、下記マクロ(kprint1)を実行すると、A2の会社コードが請求書データベースのAD1にコピーされます。
その後、請求書データベース上のAD1の会社コードを参照してA列(会社コード)にフィルターがかかり、その会社の売り上げ一覧が表示され、そこから印刷できる状態です。
毎月の処理件数は月平均50~60件くらい入ってきます。そのため単純にkprint1から余裕をもってkprint70くらいまで作っておけばよいかと考えました。
その後、下にある「自動実行1」を使って、印刷を自動実行させるボタンを作ればと考えてのですが、マクロ分があまりにも長く、処理も時間がかかりそうな気がしています。
おそらく do while や for nextを使えばもっと短くできると思うのですが、うまくいきません。 一番下の「自動処理2」を試行錯誤で作ったのですが、実行すると、なぜか「今月処理件数」シート上のA2にある最初の会社コードのみ実行され、連続してA3,A4と進みません。
何がいけないのでしょうか。
Sub kprint1()
ThisWorkbook.Worksheets("請求書データベース").Unprotect
ThisWorkbook.Worksheets("今月処理件数").Unprotect
Worksheets("今月処理件数").Range("A2").Copy Worksheets("請求書データベーす").Range("AD1") 'AD1で会社コードを取得して、フィルター検索で該当会社のみ表示させる。
Range("D2").Value = "印刷済み" '今月処理件数に印刷済みの文字を表示させる。
Call 条件フィルタ2 '請求書データベースのA列(会社コード)のフィルタ解除
Call 条件フィルタ1 '請求書データベースのAD1の会社コードからA列にフィルターをかけ、該当会社のみ表示
call 印刷 '請求書データベースから請求書を作成して印刷実行。
ThisWorkbook.Worksheets("今月処理件数").Protect
ThisWorkbook.Worksheets("請求書データベース").Protect AllowFiltering:=True
End Sub
Sub 自動実行1()
select case true
case range("a2") = ""
msgbox "印刷データがなし"
case range("a3") = ""
call kprint1
msgbox "印刷しました。"
case range("a4") = ""
call kprint1
call kprint2
msgbox "印刷しました。"
End Select
End sub
Sub 自動実行2()
ThisWorkbook.Worksheets("請求書データベース").Unprotect
ThisWorkbook.Worksheets("今月処理件数").Unprotect
Dim i As Long, LastRow As Long
LastRow = Cells(Rows.Count, 2).End(xlUp).Row
call 条件フィルタ2 'A列のフィルター解除のマクロ文です。
call 条件フィルタ1 ’AD1の会社コードを使ってA列にフィルターをかけるマクロ文です。
call 印刷 ’請求書を作成、印刷するマクロ文が記述してあります。
i = 2
Do
Range("A" & i).Value = Sheets("請求書データベース").Range("AD1").Value
Call 条件フィルタ1
i = i + 1
Loop Until i > LastRow
ThisWorkbook.Worksheets("今月処理件数").Protect
ThisWorkbook.Worksheets("請求書データベース").Protect AllowFiltering:=True
End Sub
※下は条件フィルター1と条件フィルター2のマクロ文です。上記「自動実行2」で試しに、call印刷を外して、call 条件フィルタ2とcall条件フィルタ1だけにしても、やはり最初の会社コードで止まってしまいます。
Sub 条件フィルタ1()
Worksheets("請求書データベース").Select
ActiveSheet.Range("$A$1").AutoFilter Field:=1, Criteria1:=Range("AD1")
End Sub
Sub 条件フィルタ2()
Worksheets("請求書データベース").Select
ActiveSheet.Range("$A$1").AutoFilter Field:=1
End Sub
自動実行2のコード群で繰り返される部分は
Do~Loopの間です。
この繰り返しの中に印刷命令がありません。
コードの一部しか記載されていないこと
シートのレイアウトが未詳なことから
提示のコードを詳しく追いかけることができませんが、
おそらく、次のようなコードになるものと思います。
Sub 自動実行2()
ThisWorkbook.Worksheets("請求書データベース").Unprotect
ThisWorkbook.Worksheets("今月処理件数").Unprotect
Dim i As Long, LastRow As Long
LastRow = Cells(Rows.Count, 2).End(xlUp).Row
i = 2 '<== 正しくは1かも????
Do
Range("A" & i).Value = _
Sheets("請求書データベース").Range("AD1").Value
call 条件フィルタ2
call 条件フィルタ1
call 印刷
i = i + 1
Loop Until i > LastRow
ThisWorkbook.Worksheets("今月処理件数").Protect
ThisWorkbook.Worksheets("請求書データベース").Protect AllowFiltering:=True
End Sub
むしろコードではなく
ThisWorkbook.Worksheets("今月処理件数")
ThisWorkbook.Worksheets("請求書データベース")
のレイアウトとやりたいことを掲示しなおしたほうが
識者の方から
より見やすいコードを提示してもらえるんじゃないかと思います。
レイアウト次第では、SQL文を使うことで
AutoFilter を使わずに済むんじゃないかと思います。
お礼
ご回答ありがとございました。 今一度、整理してから再質問させていただきます。