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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 7

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

Q&A

解決済

3回答

9586閲覧

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

bbs

総合スコア16

Windows 7

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

0グッド

0クリップ

投稿2015/06/08 05:04

編集2015/06/08 07:39

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

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

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

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

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

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

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

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

![イメージ説明]WIDTH:600

![イメージ説明]WIDTH:600

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

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

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

![5個のドキュメント]WIDTH:600

![5個のドキュメント]WIDTH:600

![6個のドキュメント]WIDTH:600

[追記2]
印刷キュー登録中のメモリ状況
![イメージ説明]WIDTH:600

GDIオブジェクト数
![イメージ説明]WIDTH:528

予め空のEXCELファイルを開いた状態で印刷キューに登録すると通常より多くのドキュメントが登録される。
プロセスは予め開いていた1つのプロセスしか起動せず、印刷キュー登録が終わっても終了しない。
![イメージ説明]WIDTH:600

![イメージ説明]WIDTH:600

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tak1wa

2015/06/08 05:07

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

2015/06/08 05:11

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

回答3

0

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/08 08:26

S.Toyoda

総合スコア116

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bbs

2015/06/10 04:11

S.Toyoda さん ご回答ありがとうございます。 やはりPowerShellのようなもので印刷するしか無いのですかねぇ・・ ただ、エンドユーザの環境が情シスによって結構管理されており 先方に確認した所やはりPowerShellは不可とのことでした・・・。 しかしエクセルのマクロなら使用できるようなので ActiveWorkbook.PrintOut を使用するマクロを作成した所 全てのドキュメントの登録ができました。 サンプルソースまでご提示頂きありがとうございました。
guest

0

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

Excel の仕様と制限

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

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

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

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

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

投稿2015/06/08 05:49

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bbs

2015/06/08 07:30

Tak1waさん 迅速なご回答ありがとうございました。 大変助かります。 頂いたご回答を元に再度検証を行っている所なのですが、やはり印刷動作が非常に不可解です。 メモリが問題というのが一番怪しいのですがリソースモニタ等を監視していても特別にメモリリークを起こしているわけでもなさそうなのです。 (プロセスごとにきちんと解放されている模様) 最大GDIオブジェクト数も(確認の方法があってるか自信ないですが)タスクマネージャを見る限り問題なさそうな気もします。 ※恥ずかしながら「GDIオブジェクト」というのを初めて聞いたので調べました。 個別でもトータルでも1万を超えていないように見えます。 とりあえずメモリ増設・・はできなさそうなのでもっとメモリを積んでいる別PCで検証してみようかと思います。 解決していないためにまだ回答は募集させていただきますが検証を進める上で大変参考になりました。 ありがとうございました。
guest

0

自己解決

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

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

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

Module1

lang

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

UserForm1

lang

1''' 2''' キャンセルフラグ 3''' 4Private IsCancel As Boolean 5 6''' 7''' フォームロード 8''' 9Private Sub UserForm_Initialize() 10 Dim CellText As New Collection 11 Dim MaxRowNumber As Integer 12 Dim i As Integer 13 If Worksheets(2).Range("A1").Text <> "" Then 14 MaxRowNumber = Worksheets(2).Cells(Rows.Count, 1).End(xlUp).Row 15 For i = 0 To MaxRowNumber - 1 16 ListBox1.AddItem Worksheets(2).Cells(i + 1, 1).Value 17 Next i 18 SetListData 19 End If 20End Sub 21 22''' 23''' 印刷ボタン 24''' 25Private Sub CommandButton1_Click() 26 Const cnsDIR = "*.xls" ' 対象ファイル名(ワイルドカード) 27 Dim strPathName As String ' ディレクトリPath 28 Dim strFullPath As String ' フルPath 29 Dim rc As Integer 30 Dim xlApp As Excel.Application 31 Dim Fso As Object 32 Dim ado As Object 33 34On Error GoTo ErrorHandler 35 IsCancel = False 36 With Application.FileDialog(msoFileDialogFolderPicker) 37 If .Show Then strPathName = .SelectedItems(1) 38 End With 39 rc = MsgBox("印刷ジョブに登録しますか?", vbYesNo + vbQuestion, "確認") 40 If rc = vbNo Then 41 MsgBox "処理をキャンセルしました。", vbInformation, "処理終了" 42 Exit Sub 43 End If 44 45 Set xlApp = CreateObject("Excel.Application") 46 Set ado = CreateObject("ADODB.Recordset") 47 Set Fso = CreateObject("Scripting.FileSystemObject") 48 49 ado.Fields.Append "FILENUMBER", 200, 300, 32 ' 番号 50 ado.Fields.Append "FILENAME", 200, 300, 32 ' ファイル名 51 ado.Open 52 53 ' GetFolderでパスを取得しAdoに格納 54 Dim file As Object 55 For Each file In Fso.GetFolder(strPathName).Files 56 ' 登録ファイルチェック 57 If IsOutPutFile(file) Then 58 ' ファイル名は以下の形式 59 ' (番号)_(○○○)_(×××).xls 60 ado.AddNew 61 ado.Fields(0) = padZero(CInt(Split(Dir(file), "_")(0)), 4) ' 番号(0埋) 62 ado.Fields(1) = file ' フルPATH 63 ado.Update 64 End If 65 Next 66 67 ado.Sort = "FILENUMBER ASC" ' FILENUMBERでソート 68 ado.MoveFirst 69 70 Do Until ado.EOF 71 xlApp.Workbooks.Open FileName:=CStr(ado.Fields(1)), UpdateLinks:=0 ' Excelを開く 72 DoEvents 73 If IsCancel Then 74 If IsOpenBook(CStr(ado.Fields(1))) And Not xlApp Is Nothing Then 75 xlApp.DisplayAlerts = False 76 xlApp.Workbooks.Close ' Excelを閉じる 77 xlApp.DisplayAlerts = True 78 End If 79 If Not Fso Is Nothing Then Set Fso = Nothing 80 If Not ado Is Nothing Then Set ado = Nothing 81 If Not xlApp Is Nothing Then Set xlApp = Nothing 82 MsgBox "処理を中断しました。", vbInformation, "処理中断" 83 Exit Sub 84 End If 85 xlApp.Visible = False ' 非表示 86 xlApp.ActiveWorkbook.PrintOut ' 印刷 87 xlApp.DisplayAlerts = False 88 xlApp.Workbooks.Close ' Excelを閉じる 89 xlApp.DisplayAlerts = True 90 Sleep 1 ' CPU使用率考慮 91 ado.MoveNext 92 Loop 93 94 ado.Close 95 Set xlApp = Nothing 96 Set ado = Nothing 97 Set Fso = Nothing 98 99 MsgBox "印刷ジョブに登録しました。", vbInformation, "処理終了" 100 Exit Sub 101ErrorHandler: 102 If Not Fso Is Nothing Then Set Fso = Nothing 103 If Not ado Is Nothing Then Set ado = Nothing 104 If Not xlApp Is Nothing Then Set xlApp = Nothing 105 MsgBox Err.Number & ":" & Err.Description, vbCritical & vbOKOnly, "例外発生" 106End Sub 107 108''' 109''' キャンセルボタン 110''' 111Private Sub CommandButton4_Click() 112 IsCancel = True 113End Sub 114 115''' 116''' 閉じるボタン 117''' 118Private Sub CommandButton2_Click() 119 Unload UserForm1 120End Sub 121 122''' 123''' 追加ボタン 124''' 125Private Sub CommandButton3_Click() 126 Dim i As Integer 127 For i = 0 To ListBox1.ListCount - 1 128 If ListBox1.List(i) = TextBox1.Text Then 129 MsgBox "既に登録済みです。", vbCritical & vbOKOnly, "重複エラー" 130 Exit Sub 131 End If 132 Next 133 ListBox1.AddItem TextBox1.Text 134 TextBox1.Text = "" 135 SetListData 136End Sub 137 138''' 139''' 削除ボタン 140''' 141Private Sub CommandButton5_Click() 142 Dim i As Integer 143 For i = 0 To ListBox1.ListCount - 1 144 If ListBox1.Selected(i) Then 145 ListBox1.RemoveItem (i) 146 Exit For 147 End If 148 Next 149 SetListData 150End Sub 151 152''' 153''' ゼロ埋め処理 154''' 155Private Function padZero(n As Integer, keta As Integer) 156 padZero = Right(n + 10 ^ keta, keta) 157End Function 158 159''' 160''' Bookが開かれているか判別 161''' 162Private Function IsOpenBook(strFullPath As String) As Boolean 163 On Error Resume Next 164 Open strFullPath For Append As #1 165 Close #1 166 IsOpenBook = Err.Number > 0 167End Function 168 169''' 170''' 除外ファイル名登録 171''' 172Private Sub SetListData() 173 Worksheets(2).Columns("A").Delete 174 For i = 0 To ListBox1.ListCount - 1 175 Worksheets(2).Cells(i + 1, 1).Value = ListBox1.List(i) 176 Next 177 ThisWorkbook.Save 178End Sub 179 180''' 181''' 登録ファイルチェック 182''' 183Private Function IsOutPutFile(file As Object) As Boolean 184 IsOutPutFile = True 185 For i = 0 To ListBox1.ListCount - 1 186 If Dir(file) Like ("*" & ListBox1.List(i) & "*") Then 187 IsOutPutFile = False ' 除外ファイル名が含まれていた場合は登録フラグOFF 188 Exit For 189 End If 190 Next 191End Function 192

投稿2015/06/10 04:31

編集2015/06/10 05:09
bbs

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問