• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:長いマクロ文をdo whileで簡潔にするには)

長いマクロ文をdo whileで簡潔にするには

このQ&Aのポイント
  • 月末に一括で請求書を自動作成・保存・印刷するマクロ文が長いため、短くしたい
  • 現状のマクロでは、請求書作成のためにkprint1からkprint70までのマクロを作成している
  • マクロ文をdo whileかfor next文で書き換えて短くする方法はあるか

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

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.1

コードをざっくり眺める限り、シートが少なくとも  請求書データベース  今月処理件数  作業データ1  請求書3  売上一覧表  作業データ3  売上集計 と7シートあり、それぞれのレイアウトがわからないのと、 Case Range("a2") = "" や Range("A1").Select Range("D2").Value = "印刷済み" といったコードでは、 どのブック、どのシートを指しているのかわかりません。 特に後者は、バグの温床になります。 更に、 Sub kprint2() がポストされていないので Sub kprint1() と Sub kprint2() の比較ができません。 そのため、的を射ているかどうか怪しいですが こんな感じにすればいいだろうと思います。 'Sub 請求書一括印刷() ' '実際にはkprint1~kprint70までありますが、kprint3までで割愛しています。 ' Select Case True '  Case Range("a2") = "" '   MsgBox "印刷データがありません。" ’   略 '   Call KPprintSub(3) '   MsgBox "印刷しました。" ' End Select 'End Sub '//--------------------------- '// 請求書一括印刷 '//--------------------------- Sub 請求書一括印刷()  Dim RowCounter As Long  RowCounter = 2  If Cells(RowCounter, 1).Value = "" Then   MsgBox "印刷データがありません。"   Exit Sub  End If    Do   If Cells(RowCounter, 1).Value = "" Then Exit Sub    Call KPprintSub(RowCounter - 1)   RowCounter = RowCounter + 1  Loop End Sub '//--------------------------- '// KPprintSub 引数:RowNumは、印刷対象会社の行-1かな?? '//--------------------------- Sub KPprintSub(RowNum As Long)  Application.ScreenUpdating = False  ThisWorkbook.Worksheets("請求書データベース").Unprotect  ThisWorkbook.Worksheets("今月処理件数").Unprotect  'Worksheets("今月処理件数").Range("A2").Copy _  ' Worksheets("請求書データベース").Range("AD1")  Worksheets("今月処理件数").Cells(RowNum + 1, 1).Copy _   Worksheets("請求書データベース").Range("AD1")    Range("D2").Value = "印刷済み" '///どのシート?    '//////以下省略  '----------- End Sub

shibushijuko
質問者

お礼

長い文章を精査いただき、ありがとうございます。ご提示いただいた、Sub 請求書一括印刷() 及びSub KPprintSub(RowNum As Long)を実行したところ、処理速度も速く請求書の一括保存・印刷が実行されました。 ご指摘いただいたRange("D2").Value = "印刷済み"はシート「今月処理件数」D2を指しています。ただし私の拙いマクロ文では、どのシートなのか指摘していませんね。なぜか、うまく動作はしていたのですが、バグの原因になるのですね。 印刷済みの表示は必須ではないので、今回のマクロ文では省きました。kprint1とkprint2の違う箇所は以下のマクロ文だけです。 Worksheets("今月処理件数").Range("A3").Copy Worksheets("請求書データベース").Range("AD1") kprint3はA4、kprint4はA5の値をコピーするように指摘しているだけです。 うまく動作しているマクロ文は以下の通りです。誠にありがとうございます。m( _ _)m Sub 請求書一括印刷() Dim RowCounter As Long RowCounter = 2 If Cells(RowCounter, 1).Value = "" Then MsgBox "印刷データがありません。" Exit Sub End If Do If Cells(RowCounter, 1).Value = "" Then Exit Sub Call KPprintSub(RowCounter - 1) RowCounter = RowCounter + 1 Loop End Sub Sub KPprintSub(RowNum As Long) Application.ScreenUpdating = False ThisWorkbook.Worksheets("請求書データベース").Unprotect ThisWorkbook.Worksheets("今月処理件数").Unprotect Worksheets("今月処理件数").Cells(RowNum + 1, 1).Copy _ Worksheets("請求書データベース").Range("AD1") Call 条件フィルタ2 Call 条件フィルタ1 ThisWorkbook.Worksheets("今月処理件数").Protect ThisWorkbook.Worksheets("請求書データベース").Protect AllowFiltering:=True ThisWorkbook.Worksheets("請求書データベース").Unprotect Range("A1").Select Selection.CurrentRegion.Select 'アクティブシートの切り替え ActiveWorkbook.Worksheets("作業データ1").Activate 'アクティブシートの図形・画像を全て削除 ActiveSheet.DrawingObjects.Delete 'アクティブシートの内容を全て削除 ActiveSheet.Cells.Clear 'アクティブシートのコメントを全て削除 ActiveSheet.Cells.ClearComments Sheets("請求書データベース").Select Selection.Copy Sheets("作業データ1").Activate Range("A1").Select ActiveSheet.Paste Sheets("請求書データベース").Select ActiveSheet.Protect AllowFiltering:=True Call 売上一覧入力 Call 売上集計保存2 Sheets("請求書データベース").Select ActiveSheet.Protect AllowFiltering:=True Sheets("請求書3").Visible = True Sheets("請求書3").Select Call print_nohin1 Sheets("請求書3").Visible = False Sheets("今月処理件数").Select Application.ScreenUpdating = True End Sub

関連するQ&A