• 締切済み

【VBA】印刷のループを途中で強制的に抜ける方法

Excel2007を使用しています。 「オートフィルター⇒印刷」を繰り返す自動処理のマクロを作成しました。 処理結果自体にはとくに問題はないのですが、印刷量が多いので、何らかの事情がおきた場合ループの途中で強制終了させたいのですが、どうすればいいのでしょうか。 ※繰り返し処理は、こちらの仕様をお借りしています。  http://ameblo.jp/raikayooo/entry-11219911386.html ※印刷したいシートとは別のシートにオートフィルターの条件をA列に入力し、それを上から順番にフィルターをかけて印刷していくものです。 Sub 明細連続印刷() Dim i As Long Dim x Dim MaxRow As Long '「明細」シートをアクティブにする ActiveWorkbook.Worksheets("明細").Activate 'オートフィルターが設定されている場合、解除 If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData End If '「印刷リスト」の記載に従ってオートフィルターを設定 MaxRow = Sheets("印刷リスト").Cells(Rows.Count, 1).End(xlUp).Row For i = 1 To MaxRow x = Sheets("印刷リスト").Cells(i, 1).Value ActiveSheet.Range("$B$8:$M$20422").AutoFilter Field:=3, Criteria1:=x 'フィルター済みの「明細」シートを印刷 Worksheets("明細").PrintOut Next i 'オートフィルターが設定されている場合、解除 If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData End If End Sub

みんなの回答

回答No.1

こんにちは。 >印刷量が多いので、何らかの事情がおきた場合ループの途中で強制終了させたいのですが、どうすればいいのでしょうか。 一つは、CommandButton をどこかにおいて、ループの中のFlg がTrueになったら、「止まれ」という信号を出します。 本来、「Cntl + Break」で止まることは止まるのですが、安全に、終わらせるということになると、 もう一つは、Application.EnableCancelKey の設定をすることです。以前は「Escapeキー」が利いたのですが、今試したら、「Ctrl + Break」のみでした。イレギュラーですから、あまりお勧めしません。 '*加筆したところ '// '標準モジュール Public Flg As Boolean '* Sub 明細連続印刷()  Dim i As Long  Dim x  Dim MaxRow As Long  ActiveWorkbook.Worksheets("明細").Activate    If ActiveSheet.FilterMode = True Then   ActiveSheet.ShowAllData  End If    MaxRow = Sheets("印刷リスト").Cells(Rows.Count, 1).End(xlUp).Row  For i = 1 To MaxRow   x = Sheets("印刷リスト").Cells(i, 1).Value   ActiveSheet.Range("$B$8:$M$20422").AutoFilter Field:=3, Criteria1:=x   DoEvents   If Flg = True Then MsgBox "途中終了しました", vbExclamation: Exit For '*   Worksheets("明細").PrintOut  Next i  If ActiveSheet.FilterMode = True Then   ActiveSheet.ShowAllData  End If  Flg = False End Sub 'シートモジュール(ActiveX コントロールのボタン) Private Sub CommandButton1_Click() '*  Flg = True End Sub '// '//別案(あまりお勧めしはませんが、テクニックとしてあります。 Sub 明細連続印刷()  Dim i As Long  Dim x  Dim MaxRow As Long  On Error GoTo EndLine '*  Application.EnableCancelKey = xlErrorHandler 'Cntl + Break で、止める *    ActiveWorkbook.Worksheets("明細").Activate    If ActiveSheet.FilterMode = True Then   ActiveSheet.ShowAllData  End If    MaxRow = Sheets("印刷リスト").Cells(Rows.Count, 1).End(xlUp).Row  For i = 1 To MaxRow   x = Sheets("印刷リスト").Cells(i, 1).Value   ActiveSheet.Range("$B$8:$M$20422").AutoFilter Field:=3, Criteria1:=x   DoEvents '*こちらでは、これは意味がありませんが、念のため   Worksheets("明細").PrintOut  Next i EndLine:  If ActiveSheet.FilterMode = True Then   ActiveSheet.ShowAllData  End If If Err.Number = 18 Then '*  MsgBox "途中終了しました。", vbExclamation '* End If '*  Application.EnableCancelKey = xlInterrupt '* 標準に戻す End Sub

関連するQ&A

  • (VBA)フィルタがかかっているかどうかの判断方法

    フィルタがかかっているかどうかを取得したいのですが フィルタがかかっているシートにて Sub test1() If ActiveSheet.FilterMode Then MsgBox "フィルタがかかってます" End If End Sub Sub test1の1() If ActiveSheet.FilterMode = True Then MsgBox "フィルタがかかってます" End If End Sub を実行しても"フィルタがかかってます"は表示されません。 Sub test2() If Rows(1).FilterMode Then MsgBox "フィルタがかかってます" End If End Sub Sub test3() If ActiveSheet.Rows(1).FilterMode Then MsgBox "フィルタがかかってます" End If End Sub こちらは オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438) になってしまいます。 フィルタがかかっているか調べる方法はありますか? よろしくお願いします。

  • Excel VBA; 複数のループ処理

    ↓のようなコードがあります。 Dim i As Long, MaxRow1 As Long, MaxRow2 As Long MaxRow1 = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row MaxRow2 = Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row For i = 1 To MaxRow1 Worksheets("Sheet1").Cells(i, 1).Value = i . Next i For i = 1 To MaxRow2 Worksheets("Sheet2").Cells(i, 1).Value = i . Next i これらを最大行の多いシートに合わせて、パフォーマンスを良くしたいと思います。 同様の処理をシート1、シート2で実施しているので纏めて記述したいです。 シート1、シート2に対する処理をサブルーチンにする方法しかありませんか? どなたかお願いします。 If MaxRow1 >= MaxRow2 Then For i = 1 To MaxRow1 Else For i = 1 To MaxRow2 End If Worksheets("Sheet1").Cells(i, 1).Value = i Worksheets("Sheet2").Cells(i, 1).Value = i . Next i

  • 【Excelマクロ】特定のタイミングでオートフィルタ-を解除し、コンボボックスの表示項目を変更するには。

    お教えください。 まずは現状です。 シート1とシート2があります。 シート1上にはコンボボックスがあります。 コンボボックス内の項目を選択すると、シート1内でオートフィルタ-が実行され、選択項目をキーに絞り込まれます。 シート1とシート2はそれぞれ画面上のボタンで行き来できます。 シート2にはコンボボックスはありません。 ここで質問です。 (1)シート1でコンボボックスを利用し、オートフィルタ-を実行したまま状態で、(2)シート2にボタン(ないしは下のタブ)で移動します。(3)さらに再度ボタン(ないしは下のタブ)でシート1に戻るとします。 (1)~(3)の操作を行った時に、シート1のオートフィルタ-を解除し、コンボボックスの表示項目を「すべて表示」という項目に自動変更させる方法はありますでしょうか? 下記がボタン押下時のコードです。 一応ボタンで戻った時にオートフィルタ-は解除できるようになりました。下のタブだと変化なしです。 Sub ボタンA_Click() ' シート1を開く Sheets("シート1").Select End Sub Sub ボタンB_Click() If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData End If ' シート2を開く Sheets("シート2").Select End Sub 現状ではコンボボックスはそのままで、(タブで戻った時は)オートフィルタ-も変わりません。 どなたかご指南ください。 よろしくお願いします。

  • なぜShowAllDataだとうまく行かないのでし

    なぜShowAllDataだとうまく行かないのでしょう? 「オートフィルタがかかってるなら解除する」 と言うコードを勉強しているのですが Sub a() If ActiveSheet.AutoFilterMode = True Then ActiveSheet.ShowAllData End If End Sub とすると、実行時エラー1004になります。 Sub b() If ActiveSheet.AutoFilterMode = True Then ActiveSheet.AutoFilterMode = False End If End Sub すると正常に動きます。 ActiveSheet.ShowAllData= True にしてもダメでした。

  • EXCEL VBAでのフィルタ設定

    今、会社を辞めて行った人が作ったEXCEL VBAの改造を実施しているのですが、VBAの経験がないため、非常に困っています。 今回改造しようとしている内容は、一覧表示されたシートにEXCELのデータメニューから行うフィルタ設定を、VBAプログラミングで実施したいのです。 一応、EXCEL VBAの参考書があるので見ながら改造を行ったのですが、 一箇所だけうまくいきません。 何がおかしいのかもよくわかりませんので、達人の皆様にアドバイスをしていただきたいです。 Sheets(sheet1).Select If (Range("A2").Value <> "") Then Range("A1:K1000").AdvancedFilter Action:=xlFilterInPlace ActiveSheet.ShowAllData End If このActiveSheet.ShowAllDataというところでエラーが出てしまいます。 どうか、宜しく御願いいたします。

  • 【Excel】(続)複数シートのオートフィルターで一項目を選択する方法について

    いつもお世話になっております。 表記の件で、昨日マクロをご教示頂きました。 http://okwave.jp/qa4039109.html 当初はうまく作動していたのですが、 ネットから探してきましたオートフィルターを解除するマクロを 別に設けたところ、それが理由かどうかわかりませんが、 作動はするものの、「*」を選択せず、通常終了となります。 (エラーメッセージは出てきません) 理由がわかりましたら改善致したく、 ご教示の程宜しくお願いいたします。 ================================================ 教えて頂いたマクロ↓ For Each sheet_name In Worksheets sheet_name.Activate If FilterMode Then Selection.AutoFilter Field:=1, Criteria1:="~*" End If Next End Sub ================================================ 別に設けたフィルターを解除するマクロ↓ Dim W As Worksheet For Each W In Worksheets If W.FilterMode = True Then W.ShowAllData End If Next W End Sub

  • VBAについて教えてください。

    VBAについて質問です。 シート1(元払)があり、そのシート内のオートシェイプを消す式が下記の式で 可能なのですが、別シートのオートシェイプも同時に消す場合はどのようにすれば良いか 教えてください。   Sheets("元払").Select Dim sh As Shape For Each sh In ActiveSheet.Shapes If sh.Type = msoAutoShape Then sh.Delete End If Next sh

  • エクセルVBA  どうしても動きません。

    お世話になります。 なかなか上達しない超初心者です。 ↓↓ですが、Activesheetにすると動くのに、シート名を元々存在するシート”実験"に指定すると動きません(データ内容はまったく同じで、A列に色んな名前が入っていて、重複しているとC列に重複と入力します)。 2日間試行錯誤したのですが、やっぱり動かず・・・ ちなみに、Activateにするとアクティブになるし、CurrentRegionも選択できるのに なんでうごかないんでしょうか・・・ 何卒ご指導くださいませ。よろしくお願いいたします!!!!!! Sub Test2() With Sheets("実験").Range("A1").CurrentRegion Dim i As Long Dim LastRow As Long LastRow = Range("A" & Rows.Count).End(xlUp).Row For i = 1 To LastRow If WorksheetFunction.CountIf(Range("A:A"), Cells(i, 1)) > 1 Then Cells(i, 3) = "重複" End If Next i End With End Sub Sheets("実験")をActivesheetに変えると別のシートがしっかり動いてくれます・・・が、なんとしてでも”実験”シートに動いていただきたいです・・・。

  • エクセル内で、一度の印刷で2つのセルに差し込み印刷をする方法

    エクセルで差し込み印刷のマクロを組んでいます。現在は下の様に宛名を名簿に書いてある順番に印刷していくマクロですが、これに「住所」のシートを作成し、B4のセルに「住所」の内容も印刷できるようにしたいのです。つまり、一度の印刷で2つのセルに差し込み印刷をしたいのです。そのようなことは可能でしょうか。 Sub 封筒印刷() Dim i As Long i = Sheets("原本").Range("A65536").End(xlUp).Row Sheets("宛名").Select ActiveSheet.PageSetup.PrintArea = "$A$1:$E$14" For i = 1 To i Range("B5").Value = Sheets("原本").Cells(i, 1).Value ActiveSheet.PrintOut Next End Sub

  • excel2000のVBAでループ内でループさせる方法

    excel2000でVBAを組んでいるのですが下記のような構文でループさせている中でループをさせたいのですがエラーメッセージ "Nextに対するForがありません"と出てしまいます。構文を以下に示しますので間違っている点をご指摘いただけたらと思います。 Dim h As Integer Dim I As Integer For h = 1 To 2 If h = 1 Then F_Name = "回送依頼(通常と翌月).xls" ElseIf h = 2 Then F_Name = "回送依頼(当日).xls" End If Windows(F_Name).Activate ActiveSheet.Unprotect For I = 1 To 2 'ループ内ループ If I = 1 Then S_Name = "通常" ElseIf I = 2 Then S_Name = "通常2" End If Sheets(S_Name).Activate Range("c7:i16").Select Selection.Copy Windows("請求書.xls").Activate Sheets("3").Select Selection.PasteSpecial Paste:=xlValues, _ Operation:=xlNone, SkipBlanks:=False, Transpose:=False Windows(F_Name).Activate ActiveSheet.Unprotect Sheets(S_Name).Activate Range("b7:b16").Select Selection.Copy Windows("請求書.xls").Activate Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False '値貼付 Next I ActiveWorkbook.Save ActiveWorkbook.Close Next h

専門家に質問してみよう