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

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

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

印刷とは、インキを用いて紙などの被印刷物に機械的に複製することを指します。現在は紙などの2次元の媒体だけでなく、3次元の曲面にも直接印刷する技術など様々な開発が進んでいます。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

1回答

2978閲覧

【 EXCELーVBA 】助けて下さい! リストの順にPDFファイルを印刷したい。

RANDS_CHANP

総合スコア18

印刷

印刷とは、インキを用いて紙などの被印刷物に機械的に複製することを指します。現在は紙などの2次元の媒体だけでなく、3次元の曲面にも直接印刷する技術など様々な開発が進んでいます。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

1クリップ

投稿2022/05/17 09:46

編集2022/05/20 23:53

現在、サンプルコードを参考にさせて頂いて、フォルダ内のPDF図面を自動で印刷するというVBAを作っています。

EXCELアクティブシートにA1からA2,A3…と下にファイル名が並んでおり、そのリストの上から1件ずつ順にフォルダ内にファイルがあるかを検索し、ファイルがあれば印刷してエクセルにあるファイル名を赤字に変更、ファイルがなければエクセルにあるファイル名に取り消し線を入れる。リストが空白になったらVBA終了という流れです。(その画面のイメージを下に添付致します)

[VBE]-[ツール]-[参照設定]で「Windows Script Host Object Model」にもチェックを入れてshell機能を使えるように設定し、下記コード的にもほぼ完成に近いところまできている状態と思っているのですが、マクロを実行するとリストのファイル名に取り消し線が入るだけで、肝心の印刷が実行されず困っております。

何か不要なコードが邪魔をしているのでしょうか。構文endまで有効にするにはどこを変えれば良いか、もしこれをご覧になってお判りになられる方いらっしゃいましたら、どうか添削やご教示お願い致します!

Sub ListPrint() '図面印刷VBA 'Shell実行用の変数設定 Dim wshShellObj As IWshRuntimeLibrary.WshShell 'Shellオブジェクト Set wshShellObj = New IWshRuntimeLibrary.WshShell Dim strShellCommand As String 'Shellコマンド Const folderPath = "C:\Users\Desktop\サンプル" 'フォルダパス(定数) Dim printFolderPath As String 'フォルダパス Dim printFileName As String 'ファイル名 Dim printFilePath As String 'ファイルパス Dim activePrinter As String '通常使うプリンターを取得 Dim printerName As String 'プリンタ名 Dim listname As String '印刷リスト Dim listFolder As String '印刷リストフォルダ名 Dim intPoint1 As Long 'プリンタ名を切り出す為の文字数 Dim i As Integer '印刷行カウンター '通常使うプリンターを取得 activePrinter = Application.activePrinter '取得できなかった時の処理 If activePrinter = "" Then MsgBox "プリンター情報が取得できませんでした" & Chr(13) & "プリンターが接続されていることを確認してください" End Exit Sub End If 'ファイル名(" on"の前まで)とポート名("on "の後から最後まで)を切り出す intPoint1 = InStr(activePrinter, "on") - 2 'プリンター名を指定 printerName = Left(activePrinter, intPoint1) 'ポートを除いたプリンタ名 'カウンターをセット A列1行目から i = 1 '行 '表紙の最初の図番を取得 listname = Cells(i, 1).Value Do While listname <> "" 'PDFファイルパスを設定 printFolderPath = folderPath & listFolder & listname '印刷するPDFフォルダパス 'PDFファイル名を取得(拡張子などをワイルドカードで検索して変数へ取込む) printFileName = Dir(printFolderPath & "*") 'ファイルがあるかを判定 If printFileName <> "" Then 'ファイルパスを指定 printFilePath = folderPath & listFolder & printFileName 'Shellコマンドを設定 strShellCommand = "AcroRd32.exe /t " & printFilePath & " " & printerName '設定画面を表示 'Shellコマンドを実行 wshShellObj.Run (strShellCommand) '文字を赤色に変更 Cells(i, 1).Font.Color = RGB(255, 0, 0) Else '文字に取り消し線を設定 Cells(i, 1).Font.Strikethrough = True End If '1行下がる i = i + 1 '次のリストを取得 listname = Cells(i, 1).Value Loop 'オブジェクトを強制開放 Set wshShellObj = Nothing End Sub

実行画面
イメージ説明

図面のあるフォルダ
イメージ説明

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

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

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

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

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

guest

回答1

0

この部分、

VBA

1 printFolderPath = folderPath & listFolder & listname '印刷するPDFフォルダパス 2 'PDFファイル名を取得(拡張子などをワイルドカードで検索して変数へ取込む) 3 printFileName = Dir(printFolderPath & "*")

printFolderPath に想定した文字列が入っているか確認してください。

話は変わりますが、Dir 関数を実行すると、ヒットするファイルあるいはフォルダがある場合、フォルダが開いたままになります。
空文字が返ってくるまで、引数なしで Dir 関数を呼び出すとフォルダが閉じられます。

また、ファイルでなく、フォルダが存在していてもヒットした形になるので、GetAttr 関数で取得した属性に vbDirectory フラグが立っていないことも確認したほうが良いです。

投稿2022/05/17 10:48

編集2022/05/17 21:43
KOZ6.0

総合スコア2626

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

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

xail2222

2022/05/17 17:59

ファイル完全名?である必要はないのでは? \(エンマーク)が正しく設定されているかが、私は気になります。
KOZ6.0

2022/05/17 21:48

そうですね。ご指摘ありがとうございます。
RANDS_CHANP

2022/05/18 08:58

ご回答有難うございます。初心者でまだまだ分からない領域のためお手数お掛け致しますが、 引き続きアドバイス頂きたいです。 まず、「printFolderPath に想定した文字列が入っているか」というのは、どのように対処すると良いでしょうか? また「GetAttr 関数で取得した属性に vbDirectory フラグが立っていないことも確認」の方法も朝から色々調べてみましたが、正直少し私の理解が付いて行けてないレベルでございます。 しかし、何とかこのVBAが動くようにして現在の手作業業務から脱却しなければならず、とても困っております。 非常にお手間掛けますが、どうかご教示お願いできますでしょうか。
KOZ6.0

2022/05/18 09:38

まずはデバッグの方法からですかね? 「【超初心者向け】エクセルVBAでデバッグをする方法を解説します」 https://www.excelspeedup.com/vbadebug/ それから、それぞれの関数について調べてみてください。 「Dir 関数」 https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/dir-function 「GetAttr 関数」 https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/getattr-function 業務としてやっているのであれば、人をやとう、外部に発注する、というのもひとつの手と思います。
RANDS_CHANP

2022/05/20 23:50 編集

参考URL有難うございます。一応printFolderPathのほうは問題無さそうです。 GetAttr 関数のほうも見てみたのですが、情けないですがまだ私が十分に理解できるレベルにありませんでした。 色々とすみませんでした。現状では人を雇うことが出来ず、厚かましいお願いですがもしも可能であれば添削頂けると非常に有難く思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問