
非常に困っています。
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
A 回答 (1件)
- 最新から表示
- 回答順に表示
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
この回答への補足
チェンジプリンタの後の行及び
御指南頂いたところにもDoEvents を
入れてみましたが効果なしでし。
Office2003,2010でも同じ結果です。
Office2007で現在検証中・・・
なぜ100枚を超えるとフィリーズするのかがわからないです。
ご意見ありがとうございました。
いろいろ実験をした結果、
プリンター切替にはリソースを費やすようです。
定期的にExelを保存しないで再起動することで
継続的に出力できます。
定期的にExelを保存しないで再起動する方法を探します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) 他のシートからコピーする下記マクロで貼付け位置をWorksheets(1).Range("A3")の 8 2023/01/30 18:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ドコモメールをプリンターで印...
-
PCLとPSプリンタドライバーどっ...
-
削除済みのプリンターの印刷ジ...
-
Windows11でプリントできません
-
緊急です アイビスペイントで絵...
-
自宅から会社のプリンターで印...
-
パソコンとプリンターをUSBケー...
-
インターネットエクスプローラ...
-
ページ数多いPDFを印刷しようと...
-
Windows10のプリンターPX-1...
-
EXECL VBAにて自動印刷100...
-
印刷開始までに時間がかかります
-
【EXCEL2013】条件付書式で文字...
-
1ページしか印刷しないのですが
-
至急!! 実習中で印刷が必要で...
-
喪中葉書を薄く印刷したい(E...
-
プリンターの印刷待ちの解除方...
-
印刷時一枚目が白紙で排出
-
ワードやエクセルで印刷をデフ...
-
【pdfファイル】縁なし印刷でき...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ドコモメールをプリンターで印...
-
PCLとPSプリンタドライバーどっ...
-
至急!! 実習中で印刷が必要で...
-
削除済みのプリンターの印刷ジ...
-
【EXCEL2013】条件付書式で文字...
-
Windows11でプリントできません
-
1ページしか印刷しないのですが
-
自宅から会社のプリンターで印...
-
Word プレビューと実際の印刷が...
-
ワードに貼り付けた図の印刷バ...
-
グラフの目盛り線が一部印刷さ...
-
印刷時一枚目が白紙で排出
-
パソコンとプリンターをUSBケー...
-
印刷開始までに時間がかかります
-
緊急です アイビスペイントで絵...
-
Windows11で印刷できないので質...
-
エクセルの罫線が印刷できない
-
excel VBAで、プリンターの印刷...
-
PDFは印刷が遅い
-
プリンターの印刷待ちの解除方...
おすすめ情報