こちらのサイトを参考にして特定のフォルダでpdfファイルを結合させるコードを作成しております。
PDF環境
Adobe Acrobat 2017
※サイト内でproが必要となっていますが、参照設定でacrobatが選択できており、問題はないと判断しています。
さて、以下のコードの通り、ループをさせて実行させるとCells(6,4)とCells(7,4)のパスにある_combined.pdfだけ4kbのファイルができて、クリックすると「この文書を開くときにエラーが発生しました。このファイルにはページがないため開けません」というメッセージボックスが出現し、結果としてうまくPDFが結合できていないことがわかりました。反対にCells(4,4)とCells(5,4)はうまく結合できております。それぞれpdfファイルが2つずつ入っており、特に権限等にも差がないように思われます。特に失敗しているpdfファイルだけが重いという特徴もございません、
試したこと
①前半がうまくいっていることから、以下のコードのように、waitで処理時間を待機させてみたのですが、特に効果はありませんでした。
②ループではなく直接Cells(7,4)だけを実行してみたのですが、結果は結合に失敗しました。
八方ふさがりな状況で、何か考えられる原因がわかる方、何卒、アドバイスを願えますでしょうか。
宜しくお願い申し上げます。
vba
1/* 2Cells(4,4) → C:\Users\re\Desktop\2.A会社\#213★1_202009AA 3Cells(5,4) → C:\Users\re\Desktop\2.B会社\#214★1_202009BB 4Cells(6,4) → C:\Users\re\Desktop\2.C会社\#215★3_202009CC 5Cells(7,4) → C:\Users\re\Desktop\2.D会社\#216★3_202009DD 6 7*/ 8Option Explicit 9Declare Function StrCmpLogicalW Lib "SHLWAPI.DLL" (ByVal lpStr1 As String, ByVal lpStr2 As String) As Long 10 11 12Sub combine() 13 Dim i As Integer 14 Dim cl As String 15 Dim fn As String 16 17 Dim startTime As Double 18 Dim endTime As Double 19 Dim processTime As Double 20 21 startTime = Timer 22 i = 4 23 Do 24 cl = Cells(i, 4).Value 25 fn = Mid(cl, InStr(cl, "_") + 1) 26 27 If cl = "" Then 28 Exit Do 29 End If 30 31 32 Debug.Print (cl) 33 Call Combine_All_PDF(cl, fn) 34 35 Application.Wait Now + TimeValue("00:00:05") 36 i = i + 1 37 38 Loop 39 endTime = Timer 40 processTime = endTime - startTime 41 MsgBox "処理が完了しました、経過時間は" & processTime & "です。" 42End Sub 43 44 45Sub Combine_All_PDF(filepath As String, filename As String) 46 47 Dim i As Long 48 Dim fs As FileSystemObject 49 Dim basefolder As Scripting.Folder 50 Dim savepath As String 51 Dim st() As String 52 Dim mysubfiles As Scripting.Files 53 Dim mysubfile As Scripting.File 54 55 Set fs = New Scripting.FileSystemObject 56 57 58 59 Set basefolder = fs.GetFolder(filepath) 60 Set mysubfiles = basefolder.Files 61 62 i = 0 63 64 For Each mysubfile In mysubfiles 65 66 If fs.GetExtensionName(Path:=mysubfile) = "pdf" Then 67 ReDim Preserve st(i) 68 st(i) = mysubfile.Path 69 Debug.Print st(i) 70 i = i + 1 71 End If 72 73 Next 74 75'---コード3|抽出したPDFファイルを配列を利用して、名前順に並び替える 76 Dim j As Long 77 Dim tmp As String 78 79 For i = 0 To UBound(st) 80 For j = i To UBound(st) 81 Debug.Print st(i), st(j) 82 If StrCmpLogicalW(StrConv(st(i), vbUnicode), StrConv(st(j), vbUnicode)) > 0 Then 83 tmp = st(i) 84 st(i) = st(j) 85 st(j) = tmp 86 Debug.Print tmp 87 Debug.Print st(i) 88 Debug.Print st(j) 89 End If 90 Next 91 Next 92 93 94'---コード4|名前順にPDFファイルを結合していく 95 Dim AcroPDDocNew As New Acrobat.AcroPDDoc 96 Dim AcroPDDocAdd As New Acrobat.AcroPDDoc 97 Dim acroid As Long 98 Dim acroGetPages As Long 99 Dim acroPages As Long 100 101 acroPages = 0 102 acroid = AcroPDDocNew.Create() 103 104 Dim f As Variant 105 106 For Each f In st 107 acroid = AcroPDDocAdd.Open(f) 108 acroGetPages = AcroPDDocAdd.GetNumPages() 109 acroid = AcroPDDocNew.InsertPages(acroPages - 1, AcroPDDocAdd, 0, acroGetPages, True) 110 acroid = AcroPDDocAdd.Close() 111 acroPages = acroPages + acroGetPages 112 Next 113 114 savepath = filepath & "\" & filename & "_combined.pdf" 115 116 '結合したPDFファイルを最後に保存する 117 118 acroid = AcroPDDocNew.Save(1, savepath) 119 acroid = AcroPDDocNew.Close() 120 121 'オブジェクトを強制開放する 122 123 Set AcroPDDocAdd = Nothing 124 Set AcroPDDocNew = Nothing 125 126End Sub 127