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

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

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

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

Q&A

解決済

1回答

1343閲覧

同じディレクトリの中に複数ファイルがある場合のループ処理

pegy

総合スコア245

VBA

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

0グッド

0クリップ

投稿2021/02/01 02:26

下記のコードのように、 strFolderPath = Cells(2, 6).Valueの中に「見積」というキーワードが含まれるPDFファイルについて、印刷するような仕組みを作成しております。ここでDo While strPDFName <> ""のループを加えるまでは実装ができたのですが、このループを加えることで、PDF処理が永久ループしてしまいます。
意図としては、 strFolderPath = Cells(2, 6).Valueの中に「見積」というキーワードが含まれるPDFファイルが複数存在する可能性があり、これらを全て出力するためにループさせたいということになるのですが、Do While strPDFName <> ""でうまく実装ができず、ご相談させて頂きました。
アドバイスを頂けると幸いです。
宜しくお願い申し上げます。

vba

1Sub openFile() 2 3 Dim strPDFName As String 4 Dim strFolderPath As String 5 Debug.Print (Application.activePrinter) 6 7 8 Dim wshShellObj As IWshRuntimeLibrary.WshShell 'Shellオブジェクト 9 Set wshShellObj = New IWshRuntimeLibrary.WshShell 10 Dim strShellCommand As String 'Shellコマンド 11 Dim printFilePath As String 12 13 'Printerの処理------------------------------------------------ 14 Dim activePrinter As String 15 activePrinter = Application.activePrinter 16 If activePrinter = "" Then 17 MsgBox "プリンター情報が取得できませんでした" & Chr(13) & "プリンターが接続されていることを確認してください" 18 End 19 End If 20 Dim intPoint1 As Long 21 intPoint1 = InStr(activePrinter, "on") - 2 22 Dim usePrinter As String 23 usePrinter = Left(activePrinter, intPoint1) 24 Debug.Print (userPrinter) 25 '------------------------------------------------ 26 27 'Loop処理------------------------------------------------ 28 strFolderPath = Cells(2, 6).Value 29 strPDFName = Dir(strFolderPath & "*見積*") 30 31 If strPDFName = "" Then 32 Cells(2, 7).Value = "×" 33 Else 34 Do While strPDFName <> "" 'Folder内に複数の「見積」ファイルがある場合のループ 35 printFilePath = strFolderPath & "\" & strPDFName 36 strShellCommand = "AcroRd32.exe /t " & printFilePath & " " & userPrinter 37 wshShellObj.Run (strShellCommand) 38 Cells(2, 7).Value = "○" 39 Loop 40 End If 41 '------------------------------------------------ 42 43 44 'オブジェクトを強制開放 45 Set wshShellObj = Nothing 46 47 48End Sub

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

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

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

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

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

guest

回答1

0

ベストアンサー

Do ~loop内で**Dir()**していないから、strPDFNameの値は永久に変化しません。
loop の直前に以下を追加して下さい。

VBA

1strPDFName = Dir()

投稿2021/02/01 02:40

sazi

総合スコア25327

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

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

pegy

2021/02/01 03:04

コメント頂き有難うございます。 今Dir()でから引数の場合どのような挙動をするのかを調べていた(https://www.tipsfound.com/vba/05dir)のですが、結果的に永久ループはしなくなりました。 ただしながら、もともと意図していた2件以上「見積」キーワードを含む場合の複数回印刷出力をしてほしいという点では、仮に2件入れたディレクトリで実行したところ、1件しか出力できていなういという点で正しくループしていないことがわかりました。あまり、シェルオブジェクト等には明るくないのですが、印刷するたびにオブジェクトを作成して開放するループをしなくてはいけないのでしょうか? If strPDFName = "" Then Cells(2, 7).Value = "×" Else fileCount = 1 Do While strPDFName <> "" 'Folder内に複数の見積がある場合のループ printFilePath = strFolderPath & "\" & strPDFName strShellCommand = "AcroRd32.exe /t " & printFilePath & " " & userPrinter wshShellObj.Run (strShellCommand) Cells(2, 7).Value = "○" Cells(2, 8).Value = fileCount fileCount = fileCount + 1 strPDFName = Dir() Loop fileCount = 1 End If '------------------------------------------------ 'オブジェクトを強制開放
sazi

2021/02/01 03:22

RunコマンドでWaitOnReturn=Trueを指定すると同期処理となり完了を待ってから次の実行になると思いますが、AcroRd32.exeは起動しても閉じないっぽいので、ダメかもしれませんね。 Adobe Acrobat Reader DCで自動印刷する https://qiita.com/takiru/items/f38e94e666e802fa9a25 何れにしても、質問とは逸れていますから、こちらは閉じて、駄目なようなら別質問にした方が、知見のある人が見てくれると思います。
pegy

2021/02/01 03:29

コメントありがとうございます。おっしゃるとおり、本旨からそれてしまいますので、別質問として投稿をさせて頂きます。 お力添えに御礼申し上げます。
pegy

2021/02/01 04:05

調べた結果、Dir()※からの引数※メソッドを実行することで、複数のファイルやフォルダと一致するときに、次のパスを取得できることがわかりました。従ってループの末尾にこれを加えたものを変数strPDFNameに格納することで <>""になるまで意図するループが実行できることが理解できました。備忘のためにclose後の案件ですが付記させて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問