• 締切済み

EXECL VBAにて自動印刷100枚でフリーズ

フィリーズの原因 とりあえず、アクティブプリンターのみで印刷を連続すると異常なし 交互に印刷すると今度はリソース不足が出ました。 最後に、EPSON LPプリンターのみに連続印刷でやはりリソース不足が出ました。 どうもアクティブプリンターからの切替でリソースを必要としているみたいですが 対策はをご教示下さい。 ======================================== Sub チェンジプリンター() '印刷切り替え Dim myPrinter As String myPrinter = Application.ActivePrinter '現在のプリンターを記憶 If Worksheets("DeviceRead-Write").Cells(6, 13).Value = 2 Then 'I6が2ならEPSON_2プリンターに印刷する Application.ActivePrinter = "EPSON_2 on Ne00:" 'プリンターを切り替える ActiveSheet.PrintOut 'シートFormの印刷 Application.ActivePrinter = myPrinter 'プリンターを元に戻す End If If Worksheets("DeviceRead-Write").Cells(6, 13).Value = 1 Then 'I6が1ならEPSON LPプリンターに印刷する ActiveSheet.PrintOut 'シートFormの印刷 End If End Sub ==========================================

  • mgm_0
  • お礼率71% (5/7)

みんなの回答

回答No.4

ネットワーク(プリンタ)の設定か何かのためのような気も? ローカルPCでも実プリンタで試すわけにはゆかないので MS社のXPSプリンタとPDFCreatorで試しました。 提示されたコードを試してもリソース不足のエラーは発生しません。 (Cells(6,13)は"M6"の間違いとしても) 当方はWindows7 & Office2010 です。 サンプルに使ったデータは日本郵便の郵便番号.csv を xlsm に変換したもので 印刷プレビューでは408ページになります。 関数・セルの結合など一切行っていません。 で、下記でも行いましたが何事もなく進行しました。 Sub test() Dim myPrinter As String Const XPS As String = "Microsoft XPS Document Writer on Ne01:" Const PDF As String = "PDFCreator on Ne00:" Dim i As Integer For i = 1 To 4 If i Mod 2 = 1 Then Sheets("DeviceRead-Write").PrintOut Copies:=1 _ , ActivePrinter:=XPS _ , PrintToFile:=True _ , PrToFileName:="E:\pdf\" & i & ".xps" Else Sheets("DeviceRead-Write").PrintOut Copies:=1 _ , ActivePrinter:=PDF 'PDFCreatorは自動的に連番名ファイルを作ってくれるように設定してあるので。 End If Next End Sub

回答No.3

>最後に、EPSON LPプリンターのみに連続印刷でやはりリソース不足が出ました。 >プリンターを切替条件で(B)に変更すると113枚程度でリソース不足で完了出来ませんとなりす。 >始めからプリンター(B)に出力条件を出しても同様113枚程度でリソース不足で止まります。 ということから EPSON LPプリンターを通常使うプリンターに設定し、 Excelのデータはリソース不足の時のモノを流用。 でもリソース不足のエラーになりますかね。 ミスリードが怖いので、これっきりにしたいと思いますが、 切り替えで問題が発生しているのではなく EPSON LPプリンターに問題があるのでは? 他にプリンタがあればEPSON LPプリンターではなく そちらとの組み合わせで試してみる。 (MS社のXPSやPDFプリンタで代用できるかも) EPSON LPプリンタの設定変更と確認。 EPSONのサイトにいってドライバーの更新確認。 イベントビューアに何かログが残っていないか確認。 などを私なら調べてみます。 以上ご参考までに。

mgm_0
質問者

お礼

いろいろ実験をした結果、 プリンター切替にはリソースを費やすようです。 定期的にExelを保存しないで再起動することで 継続的に出力できます。 定期的にExelを保存しないで再起動する方法を探します。

mgm_0
質問者

補足

ご教示ありがとうございます。 他のプリンタードライバー(NEC製・キヤノン製)等でも試して見ましたが、ネットワークプリンターの切替でやはりリソース不足が発生します。 イベントビューワーにはエラーはありませんが、いろいろな情報は出ています。 解析中です。 やはり、プリンターの切替でメモリーリークが起きている可能性が大かもしれません。 メモリーリークを防ぐ方法があればいいのですが・・・

回答No.2

Sleepとか入れて一定期間処理を停止させてはどうですか? 他のかたも言っていますが、よみきっていないのでしょう。

回答No.1

相当な『山勘』ですが プリンターにデータを送り切っていない OR プリンターの印刷が終了していない のにプリンターの切り替えを行ってフリーズ・・・かも? 前者の場合にVBAでデータ送信完了まで調整してくれるのか? ・・・など。 プリンターの状況を観察しつつVBAでステップ実行などで確認すれば 解決の糸口が見えて来るかもです。 経験があるわけでも実証した訳でもありません。ご参考まで。

mgm_0
質問者

お礼

ご意見ありがとうございました いろいろ実験をした結果、 プリンター切替にはリソースを費やすようです。 定期的にExelを保存しないで再起動することで 継続的に出力できます。 定期的にExelを保存しないで再起動する方法を探します。

mgm_0
質問者

補足

ご回答ありがとうございます。 現象は通常使うプリンター(A)に出力する場合、問題ありません。 スプール状態(印刷待ち)の状態で2000枚まで確認しました。 プリンターを切替条件で(B)に変更すると113枚程度でリソース不足で完了出来ませんとなります。 始めからプリンター(B)に出力条件を出しても同様113枚程度でリソース不足で止まります。 (A),(B)切替(交互)の場合合計113枚でリソース不足となります。 また、2個目のIf文をElseIfに替えても変化有りません。 殆どが、(B)出力条件が絡み、113枚前後でリソース不足になる理由が分かりません。 チェンジプリンターの文献が少なく苦慮しています。 宜しくお願い致します。

関連するQ&A

  • Execl VBA UserForm1の印刷先

    Execl VBA UserForm1の印刷先を変更したいのですが Execl VBAで困っています。 UserFormの印刷を条件を変えてプリンター1とプリンター2に振り分けたいのですが ネットを検索してもいい方法が見つかりません。 UserFormはOSのプリンターを参照するため思うように印刷できません。 一度下記を試しましたが、試通常使うプリンターでしか印刷出来ません UserFormのプリンター切替方法のご伝授宜しくお願い致します。 =========================================== Sub チェンジプリンター() Dim myPrinter As String myPrinter = Application.ActivePrinter '現在のプリンターを記憶 If Worksheets("DeviceRead-Write").Cells(6, 11).Value = 2 Then 'I6が2ならEPSON_2プリンターに印刷する Application.ActivePrinter = "EPSON_2 on Ne02:" 'プリンターを切り替える Range("A4").Value = Application.ActivePrinter 'プリンターの確認 UserForm1.PrintForm 'フォームの印刷 Application.ActivePrinter = myPrinter 'プリンターを元に戻す Range("A2").Value = Application.ActivePrinter 'プリンターの確認 End If If Worksheets("DeviceRead-Write").Cells(6, 11).Value = 1 Then 'I6が2ならEPSON_1プリンターに印刷する Range("D2").Value = Application.ActivePrinter 'プリンターの確認 UserForm1.PrintForm 'フォームの印刷 End If End Sub

  • EXECL VBAにて自動印刷100枚でフリーズ

    非常に困っています。 VBAにてシーケンサからのデータを印刷するプログラムでシーケンサのトリガーで 印刷をしています。 シーケンサのデータは5秒に1回512点のデータを読み込み 1番目が印刷命令だと印刷すると言った具合ですが、 何度シミュレーションしても105~110枚印刷するとフィリーズします。 何が影響しているかイベントビュワー等解析しても分からず困っています。 ご教示願います。 ==================================== Private Sub Auto_Open() 一定時間周期でプロシージャー実行 End Sub Sub 一定時間周期でプロシージャー実行() myReserveTime = Now + TimeValue("00:00:5") Application.OnTime EarliestTime:=myReserveTime, Procedure:="一定時間周期でプロシージャー実行" ActiveWorkbook.Worksheets("form").Activate 'シートformをアクティブにする データ読み込み チェンジプリンター End Sub 'すべての変数を明示的に宣言するようにします。 Sub データ読み込み() Dim wRet As Long '戻り値 wRetは長整数型を宣言する Dim wdata(513) As Long 'Integer '読み出したデバイス値 Dim wcnt As Integer 'ワークカウンタ Dim iRet As Long '戻り値 iRetは長整数型を宣言する Dim idata(1) As Integer '書き込むデバイス値 Dim szData As String 'デバイス名 On Error GoTo Error 'エラー処理ルーチン先設定 '論理局番をActUtlTypeコントロールのプロパティに設定する。 Worksheets("DeviceRead-Write").ActUtlType1.ActLogicalStationNumber = 1 '論理局番1を指定 '通信回線1をオープンする。 wRet = Worksheets("DeviceRead-Write").ActUtlType1.Open() '異常終了の場合 ' If (wRet <> 0) Then 'エラーコードに対応したトラブルシュートメッセージを表示する。 ' ErrorViewMessage (wRet) ' Exit Sub 'VBA終了する ' End If '---------------------D10000~読み出し----------------------------- 'D10000-D10511を読み出し、セルに表示する。 'シーケンサからデバイス値を読み出す。 wRet = Worksheets("DeviceRead-Write").ActUtlType1.ReadDeviceBlock("D10000", 512, wdata(0)) 'D10000~取込点数を指定(512) '読み出し成功の場合 If (wRet = 0) Then '正常終了の場合 With Worksheets("DeviceRead-Write") '読み出したデバイス値をセルに設定する。 For wcnt = 0 To 511 .Cells(6 + wcnt, 4).Value = wdata(wcnt) 'セルD6~D6+512まで繰り返す Next wcnt End With Else '読み出し失敗の場合 'エラーコードに対応したトラブルシュートメッセージを表示する。 ' ErrorViewMessage (wRet) End If '=====================D10001~書込===================================== 'PLC D10002 に印刷命令を返す 'PLC D10001 に D10000の値を返す。セルにも表示する。 'M6(D10000) のセルデータをシーケンサデバイス(D10002)に書き込む。 'セルのデータを書き込むデバイス値(idata)に格納する。 With Worksheets("DeviceRead-Write") idata(1) = CInt(.Cells(6, 4).Value) End With 'シーケンサデバイスに値を書き込む。 szData = "D10001" & vbLf iRet = Worksheets("DeviceRead-Write").ActUtlType1.WriteDeviceRandom2(szData, 1, idata(1)) '==================== D10001~書込終了 ================================== '機種G,生産区分,納入先データ代入 Worksheets("DeviceRead-Write").Range("N28").Value = Worksheets("DeviceRead-Write").Range("M28").Value Worksheets("DeviceRead-Write").Range("N33").Value = Worksheets("DeviceRead-Write").Range("L33").Value Worksheets("DeviceRead-Write").Range("N36").Value = Worksheets("DeviceRead-Write").Range("L36").Value '---------------------D10000~読み出し終了----------------------------- '回線のクローズを行なう。 wRet = Worksheets("DeviceRead-Write").ActUtlType1.Close() Exit Sub Error: '例外処理 '回線のクローズを行なう。 wRet = Worksheets("DeviceRead-Write").ActUtlType1.Close() 'エラーを表示する。 ' MsgBox Error$(Err), vbCritical End End Sub Sub チェンジプリンター() '印刷切り替え Dim myPrinter As String myPrinter = Application.ActivePrinter '現在のプリンターを記憶 If Worksheets("DeviceRead-Write").Cells(6, 13).Value = 2 Then 'I6が2ならEPSON_2プリンターに印刷する(D10000上位2ビットが2) Application.ActivePrinter = "EPSON_2 on Ne00:" 'プリンターを切り替える ActiveSheet.PrintOut 'シートFormの印刷 Application.ActivePrinter = myPrinter 'プリンターを元に戻す End If If Worksheets("DeviceRead-Write").Cells(6, 13).Value = 1 Then 'I6が1ならEPSON LPプリンターに印刷する(D10000上位2ビットが1) ActiveSheet.PrintOut 'シートFormの印刷 End If End Sub

  • エクセル マクロ ファイルの再起動

    ネットワークプリンター2台にワークシートを出力するコードで悩んでいます。 下記のコードを繰り返すと110枚前後でリソース不足が発生することが分かりました。 保存しないで終了し再度開くとリセットされることも分かりました。 保存しないで終了は出来るのですが、同じファイルを再度開くことはマクロで出来ますか? 宜しくお願い致します。 =================================== '全ての Book を保存しないで閉じる '最後に Excel も終了する Sub excel_Quit() Dim w As Workbook '全ての Book を保存したことにする (保存はしない) For Each w In Workbooks w.Saved = True Next 'Excel を終了する Application.Quit 'Book を閉じる ThisWorkbook.Close False End Sub ============================== Sub チェンジプリンター() '印刷切り替え処理 If Worksheets("DeviceRead-Write").Cells(6, 13).Value = 1 Then 'I6 が1ならEPSON_Aに印刷する(D10000上位2ビットが1) プリンターA出力 ElseIf Worksheets("DeviceRead-Write").Cells(6, 13).Value = 2 Then 'I6 が1ならEPSON_Bに印刷する(D10000上位2ビットが2) プリンターB出力 Else DoEvents End If End Sub Sub プリンターA出力(): 'プリンターAに印刷 Application.ActivePrinter = "EPSON_A on Ne01:" 'プリンターAを指定 Worksheets("form").PrintOut 'シートFormの印刷 Exit Sub End Sub Sub プリンターB出力(): 'プリンターBに印刷 Application.ActivePrinter = "EPSON_B on Ne00:" 'プリンターBを指定 Worksheets("form").PrintOut 'シートFormの印刷 Exit Sub End Sub

  • 【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

  • Excel2003 VBAで印刷 セル指定

    よろしくお願いします。 ボタン5をクリックしてある範囲を印刷したいのですが、私が知っているものはセル指定でActiveSheet.PageSetup.PrintArea = Range("A90:K130") であれが印刷可能なのですが最後の行までにしたいのですがどうしてもうまくいきません。 ActiveSheet.PageSetup.PrintArea = Range(Cells(90, 1), Cells(r, 11)) それと同時に11列全部(文字は小さくてもいいのですが)一枚に印刷したのですが よろしくお願いします。 Private Sub CommandButton5_Click() res = MsgBox("決済記録を印刷します", vbYesNo + vbQuestion) If res = vbYes Then r = Range("A65536").End(xlUp).Row + 1 'Range(Cells(90,1),Cells(r,11)) '印刷したい範囲 ActiveSheet.PageSetup.PrintArea = Range("A90:K130") ActiveSheet.PrintOut preview:=True End If End Sub

  • エクセルのマクロでのプリンタ自動切替について

    エクセルのマクロ初心者ですが、ご教示いただければ幸いです。 業務で日々使用する様式をボタン一つで印刷できるよう、マクロを作成中です。 エクセルのファイルは共有ファイルサーバーに保存していて、各端末(例:WS0001、WS0002、WS0003…)から印刷したいと考えています。 各端末の「通常使うプリンタ」はPR0001なのですが、この様式はWS0001のUSBポートに繋がったPR0002から出力する必要があります。 WS0001とWS0002他から見た場合にプリンタのパスが異なるため、現状では ActiveSheet.PrintOut ActivePrinter:="pr0002" ActiveSheet.PrintOut ActivePrinter:="\\Ws0001\pr0002" と2つのマクロを別々のボタンに割り当てていますが、ボタンを押し間違えることがあり、何とか1つのマクロにできないかと考えています。 例えば「"pr0002"が無い場合は"\\Ws0001\pr0002"から出力しなさい」といような記述は可能でしょうか? On Error でできるのかと考え、 On Error GoTo 0 ActiveSheet.PrintOut ActivePrinter:="pr0002" On Error GoTo 0 ActiveSheet.PrintOut ActivePrinter:="\\Ws0001\pr0002" あるいは On Error GoTo 0 ActiveSheet.PrintOut ActivePrinter:="pr0002" ActiveSheet.PrintOut ActivePrinter:="\\Ws0001\pr0002" と記述してみましたが、何故かPR0001とPR0002と2枚出力されて、上手くいきません。 ネットワーク上のプリンタ出力先の記述は、 Application.ActivePrinter = "\\Ws0001\pr0002 on NeXX:" ExecuteExcel4Macro _ "PRINT(1,,,1,,,,,,,,2,"""\\Ws0001\pr0002 on NeXX:"",,TRUE,,FALSE)" と記述した方が確実なようですが、端末によってXXの数字が異なるようで、エラーになることがあります。 何卒よろしくお願いいたします。

  • マクロでネットワーク経由の印刷をしたいのですが

    Excel2002を使用しています。2人の人間が各々のPCから 指定のプリンター(通常使うプリンターではない)で 印刷出来るようにしたいのですが、うまくいきません。 プリンターが接続されている「山田太郎」は印刷出来るのですが、 ネットワークを介している「田中花子」は、通常使うプリンターから 出力されてしまいます。 何が原因なのか、ご教授願います。 Sub 印刷確認() タイトル = "印刷確認" メッセージ = "今日の日付で印刷してよろしいですか?" スタイル = vbYesNo + vbQuestion + vbDefaultButton1 + vbApplicationModal yesno = MsgBox(メッセージ, スタイル, タイトル) If yesno = vbYes Then ユーザー名 = Application.UserName Select Case ユーザー名 Case "山田太郎" プリンター = "EPSON PM-840C on Ne03:" Case "田中花子" プリンター = "\\yamada\EPSON PM-840C on Ne0:5" End Select   Application.ActivePrinter = プリンター   ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:= _   プリンター, Collate:=True ThisWorkbook.Worksheets("住所録").Select Range("A3:A10000").ClearContents End If    Range("G14,I14").ClearContents Exit Sub End Sub

  • Excel VBA 連番印刷

    昨日以下の質問をさせていただいた者です。 http://okwave.jp/qa/q8349562.html こちらで教えていただいた以下のコードに、 J2のセルに連番を振るコードを付け足したいと思い、 同じくこちらのサイトの過去の履歴にあった以下コードを参考にとやってみているのですが、 Next で指定された変数の参照が無効です。と言われてしまいます… 印刷部数の指定はいらず、sheet印刷のJ2セルに1から始まる連番を振りたいのです。 どのように修正をしたらいいのかご教示願います。 Sub Sample4() Dim i As Long, endRow1 As Long, endRow2 As Long, myArea1 As Range, myArea2 As Range Dim wS1 As Worksheet, wS2 As Worksheet, wS3 As Worksheet Set wS1 = Worksheets("DB") Set wS2 = Worksheets("印刷") Set wS3 = Worksheets("Sheet3") endRow1 = wS1.Cells(Rows.Count, "A").End(xlUp).Row Range(wS1.Cells(1, "A"), wS1.Cells(endRow1, "A")).AdvancedFilter Action:=xlFilterInPlace, unique:=True wS1.Range("A:A").Copy wS3.Range("A1") wS1.ShowAllData For i = 2 To wS3.Cells(Rows.Count, "A").End(xlUp).Row endRow2 = wS2.Cells(Rows.Count, "B").End(xlUp).Row If endRow2 > 9 Then Range(wS2.Cells(10, "B"), wS2.Cells(endRow2, "H")).ClearContents Range(wS2.Cells(10, "J"), wS2.Cells(endRow2, "J")).ClearContents End If wS1.Range("A1").AutoFilter field:=1, Criteria1:=wS3.Cells(i, "A") wS2.Range("B6") = wS3.Cells(i, "A") Set myArea1 = Range(wS1.Cells(2, "B"), wS1.Cells(endRow1, "H")).SpecialCells(xlCellTypeVisible) Set myArea2 = Range(wS1.Cells(2, "I"), wS1.Cells(endRow1, "I")).SpecialCells(xlCellTypeVisible) myArea1.Copy wS2.Activate ActiveSheet.Range("B10").Select Selection.PasteSpecial Paste:=xlPasteValues myArea2.Copy wS2.Activate ActiveSheet.Range("J10").Select Selection.PasteSpecial Paste:=xlPasteValues endRow2 = wS2.Cells(Rows.Count, "B").End(xlUp).Row 'Range(wS2.Cells(1, "A"), wS2.Cells(endRow2, "J")).PrintOut Next i wS1.AutoFilterMode = False wS3.Cells.Clear End Sub 連番印刷のコード Sub NumberPrint() Dim idx As Integer Dim res  res = Application.InputBox("印刷部数を入力してください", Type:=1)  If res > 0 Then   For idx = 1 To res    Range("AW3").Value = idx    ActiveSheet.PrintOut   Next idx  End If End Sub

  • VBAで印刷処理の設定

    メインシートで、印刷ボタンを押した際に、 設定値に基づいて、条件分岐するには、どうすればいいでしょうか。 ご教授お願いいたします。 ★シート名 ・メインシート ・名簿 ・設定 の3つのシートがあります。 メインシートには、入力項目があります。 名簿には、 No. 会社名 担当 印刷 ・ ・ ・ のセルがあります。 印刷列は、 「0」or「1」の指定がされています。 0の場合は、印刷しない。 1の場合は、印刷する。 設定シートには、 項目 値 列があります。 項目1には、「プレビュー表示」があり、 値には、「プレビュー表示する」or「プレビュー表示しない」が 設定されます。 Sub 連続印刷() Dim i As Integer Dim LastRow As Integer Worksheets("メインシート").Select With Worksheets("名簿") LastRow = .Range("A65536").End(xlUp).Row For i = 2 To LastRow Range("A4").Value = .Range("A" & i).Value ' プレビュー表示分岐 With Worksheets("設定") ' Cells(行番号, 列番号) If Cells(2, 2).Value = "1" Then ' プレビュー確認 ActiveSheet.PrintPreview ElseIf Cells(2, 2).Value = "プレビュー表示しない" Then ' 確認なしで印刷 ActiveSheet.PrintOut Else ' プレビュー確認 ' ActiveSheet.PrintPreview MsgBox ("test") End If End With Next End With End Sub

  • EXCEL2007 VBAでのプリンタ切り替えについて

    いつもお世話になっております。 EXCELで帳票出力をする場合にプリンタを切り替えて(通常使うプリンタを変更して) 行おうと、いろいろ調べまして下記のようなプログラムを作成して実行しました。 Dim OldPrinter As String OldPrinter = Application.ActivePrinter With CreateObject("WScript.Network") .SetDefaultPrinter "EPSON LP-6100" End With ~~~~印刷処理~~~~ Application.ActivePrinter = OldPrinter WSHによるデフォルトプリンタの切り替えはうまく行くのですが、その後に もともとの通常使うプリンタに戻す処理がうまくいかず、プリンタが切り替わったまま になってしまいます。 いろいろと調べましたが、わかりませんでした。 参考になるサイトなどでも構いませんのでお願いいたします。

専門家に質問してみよう