• 締切済み

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

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

みんなの回答

  • DreamyCat
  • ベストアンサー率56% (295/524)
回答No.1

まったく門外漢なのと、印刷のVBAは使ったことがないので 見当違いかもしれませんが、気になった点を書いてみます。 最後の行の印刷実行しないようにすると何回繰り返してもフリーズしないのですね。 ActiveSheet.PrintOut 'シートFormの印刷 だとすれば、5秒に1回の印刷が終わらないうちに次の指示が入り、たくさんたまっててメモリー不足になるのでは? ・5秒ごとになっているのを、1秒ごとにしてみるとか20秒ごとにしてみるとか ・プリンターにプリントバッファーを取り付けてみるとか ・無関係だと思いますが、以下の場所にDoEventsを入れてみるとか ActiveSheet.PrintOut 'シートFormの印刷 'ここにDoEvents For wcnt = 0 To 511 .Cells(6 + wcnt, 4).Value = wdata(wcnt) 'セルD6~D6+512まで繰り返す Next wcnt 'ここにDoEvents

mgm_0
質問者

お礼

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

mgm_0
質問者

補足

チェンジプリンタの後の行及び 御指南頂いたところにもDoEvents を 入れてみましたが効果なしでし。 Office2003,2010でも同じ結果です。 Office2007で現在検証中・・・ なぜ100枚を超えるとフィリーズするのかがわからないです。

関連するQ&A

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

  • 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

  • 印刷後のVBAの実行 (3)

    Private Sub Workbook_BeforePrint(Cancel As Boolean) If ActiveSheet.Name = "Sheet1" Then If Range("D6").Value = "" Then Cancel = True MsgBox ("名前を入力してください") Range("D6").Select Exit Sub End If Else If ActiveSheet.Name = "Sheet2" Then If Range("C11").Value = "" Then Cancel = True MsgBox ("受付時間を入力してください") Range("C11").Select Exit Sub End If Else Exit Sub End If End If If Worksheets("Sheet1").Range("D5") = "不要" Then GoTo P1 ActiveSheet.Range("A70:Y70").Copy If Worksheets("Sheet3").Range("A1").Value = "" Then Worksheets("Sheet3").Range("A1").PasteSpecial Paste:=xlPasteValues Else Worksheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial _ Paste:=xlPasteValues End If Application.CutCopyMode = False P1: ActiveSheet.Range("A1").Select End Sub sheet1のD5に「不要」と入っていたら 24~33行目の作業がキャンセルになりますが sheet2のD5にも「不要」と入っていたら、同じ様にキャンセルできる様に出来ますでしょうか? ご回答お願いします

  • 印刷後のVBAの実行 (2)

    Private Sub Workbook_BeforePrint(Cancel As Boolean)   If ActiveSheet.Name = "Sheet1" Then     If Range("D6").Value = "" Then       Cancel = True       MsgBox ("名前を入力してください")       Range("D6").Select       Exit Sub     End If   Else     If ActiveSheet.Name = "Sheet2" Then       If Range("C11").Value = "" Then         Cancel = True         MsgBox ("受付時間を入力してください")         Range("C11").Select         Exit Sub       End If     Else              Exit Sub     End If   End If   ActiveSheet.Range("A70:Y70").Copy   If Worksheets("Sheet3").Range("A1").Value = "" Then     Worksheets("Sheet3").Range("A1").PasteSpecial Paste:=xlPasteValues   Else     Worksheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial _       Paste:=xlPasteValues   End If   Application.CutCopyMode = False   ActiveSheet.Range("A1").Select End Sub 先日、上記のコードを回答者の方から教えてもらい、とても助かっていますが sheet1のD5に「不要」という文字が入っていた場合、 sheet3への貼り付け(23~30行目の作業)をキャンセルして、最後にsheet1のA1を選択するようにはどの様にしたらいいでしょうか?

  • 休暇願をVBA作成し両面印刷する方法を教えてほしい

    VBAで休暇願を作成し印刷時は差し込み印刷方法でA4用紙に両面印刷したいのですが書き方が判りません。 マクロの内容を添付しますので両面印刷できるようにするにはどのように書けばよいのか教えてください。 下記のマクロで片面印刷は可能です。 Sub 印刷() Dim LastRow As Long Dim i As Long Dim myNo As Long If vbNo = MsgBox("印刷を開始していいですか?", vbYesNo) Then Exit Sub With Worksheets("名簿マスター") LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row For i = 1 To LastRow myNo = .Range("A" & i).Value With Worksheets("印刷シート") .Range("f7").Value = myNo .PrintOut Copies:=1, Collate:=True End With Next i End With MsgBox "印刷が終わりました" End Sub

  • 印刷後のVBAの実行(4)

    Private Sub Workbook_BeforePrint(Cancel As Boolean) If ActiveSheet.Name = "顧客データー1" Then If Range("D1").Value = "" Then Cancel = True MsgBox ("名前を入力してください") Range("D1").Select Exit Sub End If Else Exit Sub End If End If If Worksheets("顧客データー1").Range("D6") = "不可" Or _ Worksheets("顧客データー2").Range("D6") = "不可" Then GoTo P1 ActiveSheet.Range("F650:O650").Copy If Worksheets("日報").Range("F5").Value = "" Then Worksheets("日報").Range("F5").PasteSpecial Paste:=xlPasteValues Else Worksheets("日報").Range("F65536").End(xlUp).Offset(1, 0).PasteSpecial _ Paste:=xlPasteValues End If Application.CutCopyMode = False P1: ActiveSheet.Range("A1").Select End Sub 現在上記コードを使っていますが、ワークシート日報への値のみ貼り付けの部分で少し変更したいのですが、印刷するシートのセルM1の値が1ならそのシートのRangeF650:O650をコピーしてワークシート日報のF5に値のみで貼り付け、M1の値が2ならF6に、M1の値が3ならF7に・・・という感じでM1の数字の値によってワークシート日報へ貼り付け先を変えていくようしたいのですが、どのようにコードを変更したらいいでしょうか?

  • エクセルVBAを教えて下さい

    エクセルの表で -AB C D E F 1年月--1801 2------ 3------ 4------ (-)は空欄でセルE1=18、F1=1とします。 コントロールボックスをつかって Private Sub Command登録_Click() Dim d1 As Long Dim d2 As Long Dim ret As Variant Dim FindValue As String Dim TotalAddress As String If Range("E1").Value = "" Or Range("F1").Value = "" Then MsgBox "該当する場所にデータが入っていません。", vbCritical Exit Sub End If d1 = Range("A65536").End(xlUp).Offset(1).Row d2 = Range("B65536").End(xlUp).Offset(1).Row FindValue = """" & Range("E1").Value & Range("F1").Value & """" TotalAddress = Range("A1").Resize(d1).Address & "&" & Range("B1").Resize(d1).Address ret = Evaluate("MATCH(" & FindValue & "," & TotalAddress & ",0)") If IsError(ret) Then Cells(d1, 1) = Range("E1").Value Cells(d2, 2) = Range("F1").Value Else MsgBox "既に同じ組み合せがあります。", vbInformation End If End Sub というものを作ったのですが、E1=18、F1=1及びコマンドボタンを別シートに作成し、上記の表への登録をできるようにしたいのですが、なにかいい方法はありませんか?

  • Execl2007のVBAの質問です

    度々申し訳ありませんが、何卒またお教えください。 下記の様なコードを書いたのですが、 オートフィルタの解除ができません。 何故なんでしょうか? ちなみに、ある任意の日付の行だけを抽出して 別のシートにコピー・プリントアウト を自動化するマクロを作りたいと思っています。 他にもコードに問題などありましたら 指摘いただけると幸いです。 よろしくお願いします。 ---------------------------------------------------------------- Sub macro2() 'macro test 2 Dim yyyymmdd As Date yyyymmdd = InputBox("印刷したい日付を入力して下さい。", "印刷日入力") With Worksheets("結果") .ListObjects("リスト1").Range.AutoFilter Field:=1, Criteria1:=yyyymmdd .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _ Worksheets("貼り付け用紙").Range("A1") End With 'ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)" Worksheets("結果").AutoFilterMode = False Application.CutCopyMode = False Worksheets("貼り付け用紙").Range("A1:AM100").ClearContents End Sub

  • VBA CHANGEイベントに複数イベントを

    いつもお世話になっています。 色々しらべて試してみたんですが、うまくいかないんで教えてください。 CHANGEイベントに複数のイベントを書き込みたいんですが。 今現在、問題なく動いている以下のイベントがあります。 (1) Private Sub Worksheet_Change(ByVal Target As Range) Dim rang3 As Range Dim rang4 As Range Dim ■■ As String Dim LastRow1 As Long LastRow1 = Worksheets("○○").Cells(Rows.Count, "b").End(xlUp).Row Set rang4 = Worksheets("○○").Range("b:I" & LastRow) Set rang3 = Range("h4") If Intersect(Target, rang3) Is Nothing Then Exit Sub On Error Resume Next ■■ = WorksheetFunction.VLookup(Target.Value, rang4, 2, 0) If Err.Number > 0 Then MsgBox Target.Value & "はありません。基本情報台帳に入力してください。" Range("h4").Select Else Application.EnableEvents = False Range("I4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 2, False) Range("j4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 3, False) Range("k4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 7, False) Range("l4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 8, False) Range("m4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 5, False) Application.EnableEvents = True Range("K4").Select End If End Sub このシートにもう一つ、イベントを入れたいのですが。 (2) If Target.Count > 1 Then Exit Sub If Intersect(Target, Range("E4")) Is Nothing Then Exit Sub Else If Range("e4").Value = "1" Then Target.Offset(0, 19).Value = "☆" End If どこに入れればいいのかわかりません。 (3) また、(2)のイベントの他に、 (1)のVLOOLUPが実行され、尚且つ(2)のイベントのE4が値が1だった場合、Y4にH4の値を入れたいのですが・・・。 (2)のみなら動くことは確認できましたが、(1)のexit sub の直前に入れたり、end ifの前に入れたりしましたが、片方は動くが、もうひとつが動かないです。 (3)については、まったくわかりません。 マクロについて、自分でネットで勉強した程度なので、基本がわかっていないからなのでしょうが・・・。 どなたか、教えてください。 お願いします。

  • 型が一致しません・・・VBA

    困っています、、 このコードを実行するとなぜか 「型が一致しません」と言われてしまいます しかしF8を使い順番にやっていくとそのまま実行されます Option Explicit Dim wsDetail As Worksheet Dim wsData As Worksheet Dim wsMES As Worksheet Public Sub meisai() Call 基本 Call 職務 Call 時間外 Call 補助 Call その他 Call 通勤 End Sub Private Sub 基本() Set wsDetail = Worksheets("給与明細") Set wsData = Worksheets("データ入力") Set wsMES = Worksheets("MES歩率表") wsDetail.Range("D10") = wsData.Range("C5").Value End Sub Private Sub 職務() Set wsDetail = Worksheets("給与明細") Set wsData = Worksheets("データ入力") Set wsMES = Worksheets("MES歩率表") wsDetail.Range("H10") = wsData.Range("C8").Value * Range("C5").Value End Sub Private Sub 時間外() Set wsDetail = Worksheets("給与明細") Set wsData = Worksheets("データ入力") Set wsMES = Worksheets("MES歩率表") wsDetail.Range("L10") = wsData.Range("C14").Value _ * Range("C16").Value * wsMES.Range("C4").Value End Sub Private Sub 補助() Set wsDetail = Worksheets("給与明細") Set wsData = Worksheets("データ入力") Set wsMES = Worksheets("MES歩率表") wsDetail.Range("P10") = wsData.Range("C19").Value End Sub Private Sub その他() Set wsDetail = Worksheets("給与明細") Set wsData = Worksheets("データ入力") Set wsMES = Worksheets("MES歩率表") wsDetail.Range("AB10") = wsData.Range("C21").Value End Sub Private Sub 通勤() Set wsDetail = Worksheets("給与明細") Set wsData = Worksheets("データ入力") Set wsMES = Worksheets("MES歩率表") wsData.Range("C27") = Application.RoundUp(wsData.Range("C25").Value * 2 * 0.083 * _ Range("C24").Value * Range("C23").Value, 1) wsDetail.Range("D13") = Application.WorksheetFunction.Round _ (wsData.Range("C27").Value * Range("C26").Value * 1.08, 0) End Sub 原因がさっぱりわからないのでどなたかよろしくお願いいたします<m(__)m>

専門家に質問してみよう