Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 11 Home : Excel 2021)
パソコンを新しくしたら印刷ができなくなった
投稿日時: 22/10/02 12:27:33
投稿者: ひっちん1

お世話になります
 
パソコンを買い替えて印刷ができなくなってしまいました
どなたか。ご教授お願いいたします
 
以前はExcel 2002と2003のバージョンでした
 
症状としては今まで印刷のマクロを実行すると
すべて問題なく該当する枚数を印刷できましたが
パソコンを変えてから2枚分しか印刷を行わず終了をしてしまいます
 
AAAシートの該当するセルに 1が入っている場合は印刷シートで該当分印刷を行うのですが、
以前は対象の1のセルが20件あれば10枚の印刷を行っていましたが、
パソコンを変えてからは対象が10件でも20件でも2枚(対象4件分)の印刷を行い終了してしまいます
以前問題なく動いていたマクロは下記となります
印刷2()
    Dim i As Long
    Dim k As Long
    Dim LastRow As Long
 
    Worksheets("AAA").Select
    LastRow = Cells(Rows.Count, 3).End(xlUp).Row
 
    For i = 7 To LastRow
        If Cells(i, 1).Value = 1 Then
            k = k + 1
            If k = 1 Then
                With Worksheets("印刷シート")
                    .Range("E12").Value = Cells(i, 3).Value
                End With
            Else
                With Worksheets("印刷シート")
                    .Range("E51").Value = Cells(i, 3).Value
                    .PrintOut
                   '.PrintPreview'(確認用)
                    .Range("E12:G12,E51:G51").ClearContents
                End With
                k = 0
            End If
        End If
    Next i
    '奇数個の場合の対応
    If k = 1 Then
        Worksheets("印刷シート").PrintOut
        'Worksheets("印刷シート").PrintPreview
    End If
        MsgBox "印刷が終了〜だよ お疲れ様 "
    End Sub
 
 
原因のご指導をお願いいたします
 
 
 
因みに下記のマクロ
対象の1のセルが何件あっても
1枚に1件のみの印刷を行うと問題なく対象件数すべて印刷を行い終了します
 
Sub 印刷()
      Dim i As Long
      Dim LastRow As Integer
 
      Worksheets("AAA").Select
       LastRow = Cells(Rows.Count, 3).End(xlUp).Row
        
       For i = 7 To LastRow
          If Cells(i, 1).Value = 1 Then
             With Worksheets("印刷シート")
                 .Range("E12").Value = Cells(i, 3).Value
                 .PrintOut
                  
                 '.PrintPreview
             End With
           End If
        Next i
         
        MsgBox "印刷が終了〜だよ お疲れ様 "
End Sub
 
症状の改善方法を
よろしくお願いいたします

回答
投稿日時: 22/10/02 13:18:26
投稿者: WinArrow
投稿者のウェブサイトに移動

コードだけ眺めて、解析することは無理です。
  
ステップ実行で、流れを確認してみましょう。
  
意図した、流れになっていないとき、データを確認しましょう。

投稿日時: 22/10/02 14:02:21
投稿者: ひっちん1

WinArrowさん
ご返事ありがとうございます
 
一行づづマクロ実行を行うと
問題なく該当対象1の入ったセル分印刷を全て行えることができますが
一気に実行すると該当セル4つ分(用紙2枚)しか認識できないのか?
印刷終了となります
 
原因が分かりましたらご教授お願いいたします

回答
投稿日時: 22/10/02 15:04:33
投稿者: WinArrow
投稿者のウェブサイトに移動

印刷シートの印刷範囲は、どの様に指定していますか?
印刷範囲の指定が原因かは分かりませんが・・・・

回答
投稿日時: 22/10/02 15:19:06
投稿者: WinArrow
投稿者のウェブサイトに移動

 
掲示のコードで
こちらでも実行していましたが、異常はありません。
 
取り敢えずの回答です。

回答
投稿日時: 22/10/02 15:43:50
投稿者: ライスマン

的はずれな回答かもしれません。
今使っているプリンターはWin11の対応ドライバーが提供されていますか?

投稿日時: 22/10/02 16:28:59
投稿者: ひっちん1

 WinArrowさん
ライスマンさん
 
ご返事ありがとうございます
 
印刷シートの印刷範囲は、どの様に指定していますか?については
以前問題なく動いていた時と一切触っていません
また記載させいてただきました
 
 印刷2() と印刷()のマクロは
同じ印刷シートで動かしていますが
印刷2()だけ4件(2枚で)終了します
 
ちなみに、印刷範囲を解除してもまた印刷を1枚に縮小するも解除しましたが
4件2枚の印刷で終了します
 
今使っているプリンターはWin11の対応ドライバーについては
パソコン購入時にエプソンのホームページから半月ぐらい前に
再インストールしましたので最新版だと思います M-770プリンターです
今プリンターのアップグレードを確認しましたが最新で必要ないとなっていました
 
ご指導よろしくお願いします

回答
投稿日時: 22/10/02 16:43:01
投稿者: WinArrow
投稿者のウェブサイトに移動

ステップ実行では、問題ない・・・ということでしたら、
 
途中に
Debug.print などを挿入し、
何処で、スキップしているか確認してみましょう。

回答
投稿日時: 22/10/03 12:02:50
投稿者: QooApp

印刷したい範囲を一時的に手動で全件出力してみてはいかがか?
だいたい1回手動で成功すればマクロからプリントリクエストしても正常に処理できるようになったりする
(この場合、印刷用のテンプレート的な設定が未設定ないし未対応の設定だったために印刷が正常終了していないということになる)
 
また、VB側の印刷リクエストが正常に動作していない可能性もあるのでコマンドプロンプトからプリンターへ印刷リクエストするコマンドがある場合、VB内の印刷処理部分をそっち用に書き換える必要が出てくるかも。
(本当に苛立たしいような例外だけど、某印刷機メーカーの家庭用モデルでそのような事件が実際にあった)

回答
投稿日時: 22/10/03 16:17:31
投稿者: WinArrow
投稿者のウェブサイトに移動

QooAppさんのレスにもあるように、
コードの問題ではない・・・と思います。
 
それを確かめるためにも、
Printout
及び
PrintPrevuew
が実行できているか確認し、
実行できているのに、印刷できないとすれば、
原因がプリンタドライバとOSとの間にある・・・と切り分けができるのではないでしょうか?
 
 

投稿日時: 22/10/14 00:49:23
投稿者: ひっちん1

WinArrowさん
QooAppさん
ご指導ありがとうございます
 
一行ずつマクロ確認で問題なく印刷ができて
1枚ずつのマクロは問題がなく印刷ができる状態ですが
 
QooAppさんのご指導頂いた
VB側の印刷リクエストが正常に動作していない可能性もあるのでコマンドプロンプトからプリンターへ印刷リクエストするコマンドがある場合、VB内の印刷処理部分をそっち用に書き換える必要が出てくるかも・・・私のスキルではご指導いただいた内容が理解できない状態なので申し訳ございません(具体的にマクロ文等でご指導いただければと勝手に思っております)
 
またWinArrowさんのご指導いただいた
PrintPrevuewが実行できているか確認し、実行できているのに、印刷できないとすれば、
原因がプリンタドライバとOSとの間にある・・・と切り分けができるのではないでしょうか?
の意味も申し訳ございません、私のスキルでは今一つ理解できない状況です
 
でも、WinArrowさん、QooAppさんご指導ありがとうございます、助かります
 
ネットを調べていましたら
処理が追い付かないと言う記載記事がありましたので
 
マクロの中に
 Application.Wait Now + TimeValue("00:00:01") '1秒止める  
を追記して動かしたら、問題なく・・・?  印刷ができました
 
パソコンの性能が上がり、マクロの実行スピードに処理(プリンター?)が追い付かづ、エラーが発生したのかな?と私なりに勝手に想像しています。
 
下記は追記したマクロとなります
ub 印刷2()
    Dim i As Long
    Dim k As Long
    Dim LastRow As Long
 
    Worksheets("AAA").Select
    LastRow = Cells(Rows.Count, 3).End(xlUp).Row
 
    For i = 7 To LastRow
        If Cells(i, 1).Value = 1 Then
            k = k + 1
            If k = 1 Then
                With Worksheets("印刷シート")
                    .Range("E12").Value = Cells(i, 3).Value
                End With
                 
              Application.Wait Now + TimeValue("00:00:01") '1秒止める
                 
            Else
                With Worksheets("印刷シート")
                    .Range("E51").Value = Cells(i, 3).Value
                    .PrintOut
                   '.PrintPreview
                    .Range("E12:G12,E51:G51").ClearContents
                End With
                k = 0
            End If
        End If
    Next i
    '奇数個の場合の対応
    If k = 1 Then
        Worksheets("印刷シート").PrintOut
        'Worksheets("印刷シート").PrintPreview
    End If
     
    MsgBox "印刷が終了〜だよ お疲れ様 "
     
End Sub
 
・・・でも・・・ぎこちない動きになったと感じています。
スムーズに処理する方法は・・・と悩んでいます
 

回答
投稿日時: 22/10/14 09:48:35
投稿者: QooApp

引用:
マクロの中に
 Application.Wait Now + TimeValue("00:00:01") '1秒止める  
を追記して動かしたら、問題なく・・・?  印刷ができました
  
パソコンの性能が上がり、マクロの実行スピードに処理(プリンター?)が追い付かづ、エラーが発生したのかな?と私なりに勝手に想像しています。

 
典型的なリクエスト速度が速すぎる場合に処理がスキップされるパターンの可能性があります。
プリンター側とマクロを実行しているパソコン側それぞれの印刷キューの実行ログを調べることを推奨します。
 
▼Microsoft公式の印刷キュー確認方法
https://support.microsoft.com/ja-jp/windows/windows-%E3%81%A7%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF%E3%83%BC-%E3%82%AD%E3%83%A5%E3%83%BC%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B-71505b3a-ba6b-14b2-b7f9-fd6204675ab5
 
だいたいの場合、エラーとして残っている可能性があります。
ただ、これらのキュー消化速度が追い付かない問題は基本的にプリンター側の処理速度の限界と思ってもらっていいと思います。
 
会社にあるような複合機レベルの場合、同時リクエスト数が過大な場合でもすべて受け付ける事ができる留保可能な容量が設定されており、Fujizerox系なら1000件程度同時に受け付けられます。
 
しかし、家庭用プリンターレベルになるとこのキューのスタック機能が実装されていないことがあります。
その場合、印刷機内部のメモリで受け付けられる最大容量を超過した場合は先のキューが印刷完了になるまでパソコン側でキューを保持しており、PCディスプレイにも印刷中(●件/●件)等の表示が残り続けると思います。
 
マクロで印刷リクエストした場合にこのキューの処理状況を無視して全リクエストをCPU側の処理レート速度でリクエストすることが原因じゃないかと思います。
つまり、先の印刷キューが完了状態にかかわらず強制でリクエストを出しているため、ログ含め印刷機側で受け付けられてないような気がします。
 
以下の記事ではない可能性もありますが、印刷が実行された(ないし実行が完了した)段階を判定として取得し、その結果をもって次の印刷リクエストを実行する形か、事前に修正されたような固定の待機時間を設けて実行するしか自分は思いつかなかったです。
https://www.officelabo.net/vbaskill/vba20.html

トピックに返信