質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • Excel

    2099questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • Windows 7

    427questions

    Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

印刷ジョブのキューに一部のファイルしか登録されない

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,383

bbs

score 15

「コントロールパネル」>「デバイスとプリンター」
「iR-ADV C5045」を右クリック>「印刷ジョブの表示」

で表示される印刷ジョブウインドウに
67個のExcelファイルをまとめてドラッグ&ドロップしても
67個のドキュメントがキューに登録できず、数個のドキュメントしか登録されません(何回やってもだめでした)

印刷ジョブに登録する際にExcelを開いていなければいちいち自動的にExcelが立ち上がっては消え、その後キューに登録される動きをしているので
予め空のExcelを立ち上げた状態でやってみたのですが、登録される数は増えますがやはり全てのドキュメントは登録されず一部のドキュメントだけ登録されてしまいます。

ちなみにファイルの中身は異なるのですが、53個のpdfのドキュメントについては問題なく印刷キューに登録出来ました。
ただ、エンドユーザの要件がExcelファイルなのでpdfファイルにすることが出来ません。

Excelファイルは数かサイズが大きくなると印刷キューに一回で全てのドキュメントは登録されないのでしょうか?
それともWindowsやExcelのバグなのでしょうか?
調べてみてもその辺の情報が少なく困っています。
ツール等は使えない為、できるだけWindowsの機能で解決させたいと思ってます。

あと、コンテキストメニュー(右クリック)からの印刷でも同じ結果でした。

どなたかご存知の方がいらっしゃいましたらよろしくお願いします。

上記の方法以外でも大量のファイルを確実に印刷できる(プリンタのスプールに貯まる)方法があればあわせて教えていただきたいです。

イメージ説明
イメージ説明
/* 環境 */
OS            Windows7 Pro SP1 (32bit)
メモリ          2.0GB
プリンタ       Canon iR-ADV C5045
ソフトウェア  Excel 2010

[追記]
キューに登録される件数は以下のようにまちまちです。
登録されないファイルについては単体だと問題なく登録されます。
キューに登録されるファイルはランダム?規則性がつかめませんでした。

/**
   ファイルに番号をつけてみました。
*/

5個のドキュメント
5個のドキュメント
6個のドキュメント
[追記2]
印刷キュー登録中のメモリ状況
イメージ説明
GDIオブジェクト数
イメージ説明
予め空のEXCELファイルを開いた状態で印刷キューに登録すると通常より多くのドキュメントが登録される。
プロセスは予め開いていた1つのプロセスしか起動せず、印刷キュー登録が終わっても終了しない。
イメージ説明
イメージ説明



  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Tak1wa

    2015/06/08 14:07

    現状何件まで登録されますか?
    また、登録されないExcelファイルは単体でも必ず登録されないですか?
    それとも数の問題のみですか?

    キャンセル

  • bbs

    2015/06/08 14:11

    ありがとうございます。
    8件だったり4件だったり5件だったりとまちまちです。
    登録されないExcelファイルについても単体では登録されます。

    キャンセル

回答 3

+3

PowerShellで自動化してしまうのがよいかと思います。

ファイル一覧の取得以降であれば、以下のようにすれば、プロセスが自動的に走って
印刷されると思います。
$excel = New-Object -comobject Excel.Application
$workbook = $excel.Workbooks.Open("c:\test.xls")
$workbook.PrintOut()
$excel = $null
[GC]::Collect()

※C:\test.xlsの部分を、PowerShellで一覧取得したファイル名変数として全体を
Foreachでループさせるイメージです。
オブジェクト作るので、ほんとに大量に行うと遅かったりリソース食いつぶすかも
しれないですが、適宜10回に一回Sleepいれるとか、適当な制御いれれば、そうい
う部分も回避できると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/10 13:11

    S.Toyoda さん

    ご回答ありがとうございます。

    やはりPowerShellのようなもので印刷するしか無いのですかねぇ・・

    ただ、エンドユーザの環境が情シスによって結構管理されており
    先方に確認した所やはりPowerShellは不可とのことでした・・・。

    しかしエクセルのマクロなら使用できるようなので

    ActiveWorkbook.PrintOut

    を使用するマクロを作成した所
    全てのドキュメントの登録ができました。
    サンプルソースまでご提示頂きありがとうございました。

    キャンセル

+2

明確な資料は見当たりませんでしたがExcelは「使用可能メモリとシステムリソースに依存」系の制限が多いです。

Excel の仕様と制限

開けるブック数に引っかかっているか微妙な解釈になりますが、リソース関連の制限に引っかかっているものと予想します。
この場合、これはプリンタの仕様ではなくExcelの仕様なのでおそらく標準機能での回避は難しいでしょう。

代替案としてはExcelプロセスを制御しながら順次印刷処理していくようなバッチ系アプリケーションを用意する方向になるのではないかと思います。

可能であればメモリを増設して検証してみたいです。
その結果印刷可能数が若干上がるようであれば、ほぼリソース制限で間違いないでしょう。
また、ブックの最大GDIオブジェクト数の制限もあったような気がするのでメモリに限った話ではないかもしれません。

ピンポイントな回答を出来ず見解のみで、すみません。
また、もし可能だった場合は更にすみません。

他の方からの回答も待って頂けたら。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/08 16:30

    Tak1waさん

    迅速なご回答ありがとうございました。
    大変助かります。

    頂いたご回答を元に再度検証を行っている所なのですが、やはり印刷動作が非常に不可解です。
    メモリが問題というのが一番怪しいのですがリソースモニタ等を監視していても特別にメモリリークを起こしているわけでもなさそうなのです。
    (プロセスごとにきちんと解放されている模様)

    最大GDIオブジェクト数も(確認の方法があってるか自信ないですが)タスクマネージャを見る限り問題なさそうな気もします。
    ※恥ずかしながら「GDIオブジェクト」というのを初めて聞いたので調べました。
    個別でもトータルでも1万を超えていないように見えます。

    とりあえずメモリ増設・・はできなさそうなのでもっとメモリを積んでいる別PCで検証してみようかと思います。

    解決していないためにまだ回答は募集させていただきますが検証を進める上で大変参考になりました。
    ありがとうございました。

    キャンセル

check解決した方法

+1

印刷ジョブへドラッグアンドドロップして印刷する方法は
Excelの仕様やハードウェアスペック等が絡む原因から実現するのが極めて困難と判断し
以下のExcelマクロで対応しました。

印刷以外の機能としては
・ファイルの先頭にある番号順(昇順)に登録
・除外ファイル名を含むファイルを印刷対象としない

Tak1waさん S.Toyodaさん ありがとうございました。

Module1
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

UserForm1
'''
''' キャンセルフラグ
'''
Private IsCancel As Boolean

'''
''' フォームロード
'''
Private Sub UserForm_Initialize()
    Dim CellText As New Collection
    Dim MaxRowNumber As Integer
    Dim i As Integer
    If Worksheets(2).Range("A1").Text <> "" Then
        MaxRowNumber = Worksheets(2).Cells(Rows.Count, 1).End(xlUp).Row
        For i = 0 To MaxRowNumber - 1
            ListBox1.AddItem Worksheets(2).Cells(i + 1, 1).Value
        Next i
        SetListData
    End If
End Sub

'''
''' 印刷ボタン
'''
Private Sub CommandButton1_Click()
    Const cnsDIR = "*.xls"      ' 対象ファイル名(ワイルドカード)
    Dim strPathName As String   ' ディレクトリPath
    Dim strFullPath As String   ' フルPath
    Dim rc As Integer
    Dim xlApp As Excel.Application
    Dim Fso As Object
    Dim ado As Object
    
On Error GoTo ErrorHandler
    IsCancel = False
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show Then strPathName = .SelectedItems(1)
    End With
    rc = MsgBox("印刷ジョブに登録しますか?", vbYesNo + vbQuestion, "確認")
    If rc = vbNo Then
        MsgBox "処理をキャンセルしました。", vbInformation, "処理終了"
        Exit Sub
    End If
    
    Set xlApp = CreateObject("Excel.Application")
    Set ado = CreateObject("ADODB.Recordset")
    Set Fso = CreateObject("Scripting.FileSystemObject")
    
    ado.Fields.Append "FILENUMBER", 200, 300, 32    ' 番号
    ado.Fields.Append "FILENAME", 200, 300, 32      ' ファイル名
    ado.Open
    
    ' GetFolderでパスを取得しAdoに格納
    Dim file As Object
    For Each file In Fso.GetFolder(strPathName).Files
        ' 登録ファイルチェック
        If IsOutPutFile(file) Then
            ' ファイル名は以下の形式
            ' (番号)_(○○○)_(×××).xls
            ado.AddNew
            ado.Fields(0) = padZero(CInt(Split(Dir(file), "_")(0)), 4)  ' 番号(0埋)
            ado.Fields(1) = file                                        ' フルPATH
            ado.Update
        End If
    Next
    
    ado.Sort = "FILENUMBER ASC" ' FILENUMBERでソート
    ado.MoveFirst
    
    Do Until ado.EOF
        xlApp.Workbooks.Open FileName:=CStr(ado.Fields(1)), UpdateLinks:=0  ' Excelを開く
        DoEvents
        If IsCancel Then
            If IsOpenBook(CStr(ado.Fields(1))) And Not xlApp Is Nothing Then
                xlApp.DisplayAlerts = False
                xlApp.Workbooks.Close                               ' Excelを閉じる
                xlApp.DisplayAlerts = True
            End If
            If Not Fso Is Nothing Then Set Fso = Nothing
            If Not ado Is Nothing Then Set ado = Nothing
            If Not xlApp Is Nothing Then Set xlApp = Nothing
            MsgBox "処理を中断しました。", vbInformation, "処理中断"
            Exit Sub
        End If
        xlApp.Visible = False                                       ' 非表示
        xlApp.ActiveWorkbook.PrintOut                               ' 印刷
        xlApp.DisplayAlerts = False
        xlApp.Workbooks.Close                                       ' Excelを閉じる
        xlApp.DisplayAlerts = True
        Sleep 1                                                     ' CPU使用率考慮
        ado.MoveNext
    Loop

    ado.Close
    Set xlApp = Nothing
    Set ado = Nothing
    Set Fso = Nothing
        
    MsgBox "印刷ジョブに登録しました。", vbInformation, "処理終了"
    Exit Sub
ErrorHandler:
    If Not Fso Is Nothing Then Set Fso = Nothing
    If Not ado Is Nothing Then Set ado = Nothing
    If Not xlApp Is Nothing Then Set xlApp = Nothing
    MsgBox Err.Number & ":" & Err.Description, vbCritical & vbOKOnly, "例外発生"
End Sub

'''
''' キャンセルボタン
'''
Private Sub CommandButton4_Click()
    IsCancel = True
End Sub

'''
''' 閉じるボタン
'''
Private Sub CommandButton2_Click()
    Unload UserForm1
End Sub

'''
''' 追加ボタン
'''
Private Sub CommandButton3_Click()
    Dim i As Integer
    For i = 0 To ListBox1.ListCount - 1
      If ListBox1.List(i) = TextBox1.Text Then
        MsgBox "既に登録済みです。", vbCritical & vbOKOnly, "重複エラー"
        Exit Sub
      End If
    Next
    ListBox1.AddItem TextBox1.Text
    TextBox1.Text = ""
    SetListData
End Sub

'''
''' 削除ボタン
'''
Private Sub CommandButton5_Click()
    Dim i As Integer
    For i = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(i) Then
            ListBox1.RemoveItem (i)
            Exit For
        End If
    Next
    SetListData
End Sub

'''
''' ゼロ埋め処理
'''
Private Function padZero(n As Integer, keta As Integer)
    padZero = Right(n + 10 ^ keta, keta)
End Function

'''
''' Bookが開かれているか判別
'''
Private Function IsOpenBook(strFullPath As String) As Boolean
    On Error Resume Next
    Open strFullPath For Append As #1
    Close #1
    IsOpenBook = Err.Number > 0
End Function

'''
''' 除外ファイル名登録
'''
Private Sub SetListData()
    Worksheets(2).Columns("A").Delete
    For i = 0 To ListBox1.ListCount - 1
        Worksheets(2).Cells(i + 1, 1).Value = ListBox1.List(i)
    Next
    ThisWorkbook.Save
End Sub

'''
''' 登録ファイルチェック
'''
Private Function IsOutPutFile(file As Object) As Boolean
    IsOutPutFile = True
    For i = 0 To ListBox1.ListCount - 1
        If Dir(file) Like ("*" & ListBox1.List(i) & "*") Then
            IsOutPutFile = False ' 除外ファイル名が含まれていた場合は登録フラグOFF
            Exit For
        End If
    Next
End Function

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Excel

    2099questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • Windows 7

    427questions

    Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。