[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ファイル名に同じ文字列があれば、ファイルを結合したい』(初心者)
ID1234_1.pdf
ID1234_2.pdf
ID1234_3.pdf
ID1234_4.pdf
ID1234_5.pdf
ID1234_6.pdf
ID1234_7.pdf
ID1234_8.pdf
ID1234_9.pdf
ID1234_10.pdf
ID0000_1.pdf
ID0000_2.pdf
ID0000_3.pdf
ID0000_4.pdf
ID0000_5.pdf
ID9876_1.pdf
上記のようなファイル名のPDFが同じフォルダ内にはいっており、同じIDであれば12345といった後ろ側の番号順でPDFファイルを1つのファイルに結合し、ID番号のみで新しいPDFファイルを作成したいです。ID番号は毎月かわります。
例:
ID0000_1.pdf
ID0000_2.pdf
ID0000_3.pdf → ID0000.pdf
ID0000_4.pdf
ID0000_5.pdf
以下が途中のソースコードです。
ここからどのように書けばよいのかおおしえください。。
acrobatを使用するようにしていますが、違う方法でもかまいません。
Public Sub Sample()
Dim v As Variant '結合元PDFファイル
v = Array( _ "C:\Users\Username\Desktop\PDF\ID0000_1.pdf", _ "C:\Users\Username\Desktop\PDF\ID0000_2.pdf", _ "C:\Users\Username\Desktop\PDF\ID0000_3.pdf" _ "C:\Users\Username\Desktop\PDF\ID0000_4.pdf" _ "C:\Users\Username\Desktop\PDF\ID0000_5.pdf" _
) MergePDF v, "C:\Users\Username\Desktop\PDF\\ID0000.pdf" End Sub
Private Sub MergePDF(ByVal InputFilePath As Variant, _
ByVal OutputFilePath As String) 'Acrobatを利用してPDFファイルを結合する Dim pdoc As Object Dim i As Long Const PDSaveFull = &H1 set
With CreateObject("AcroExch.PDDoc") If .Create = True Then Set pdoc = CreateObject("AcroExch.PDDoc") For i = LBound(InputFilePath) To UBound(InputFilePath) If pdoc.Open(InputFilePath(i)) = True Then .InsertPages .GetNumPages() - 1, pdoc, 0, pdoc.GetNumPages() - 1, True pdoc.Close End If Next .Save PDSaveFull, OutputFilePath .Close End If End With End Sub
< 使用 Excel:Excel2016、使用 OS:Windows10 >
で、ファイル名の問題点があるので、ロジックが難しくなるのですが、ファイル名の命名規則は変えられませんか? つまり、ファイル名は文字列なので、以下を単純にソートすると…。
ID0000_1.pdf
ID0000_2.pdf
ID0000_10.pdf
↓
ID0000_1.pdf
ID0000_10.pdf
ID0000_2.pdf
こうなってしまうのですよ。だから、番号部分だけ抜き出して、本来のファイル名とは別に考えないといけない。
しかし、ID0000_0001.pdf のように、十分な桁数の前ゼロが付いていれば、文字列のソートで済むので、簡単なのです。いかがですか?
(???) 2017/08/25(金) 09:20
おそくなり申し訳ありません。コメントくださり有難うございます。
なるほど、色々さがしていたのでどなたものか現状不明です。。ブログなどでソースをのせてくださっているかたには本当に頭が上がらない限りです。感謝しております。
ご教授くださり大変感謝いたします。勉強になります!
ID0000の部分が変わらなければ、ID0000_0001.pdfのようにファイル名のルールを変更することは可能です。
1の次は4などは現在ございません。
また、ファイル自体は500個程度ありますが、まとめるファイルは1つあたり最大15ファイルです。
(初心者) 2017/08/26(土) 00:00
Sub test() Dim AR As Object Dim cPath As String Dim cFile As String Dim iw As Long Dim cw1 As String Dim cw2 As String
Set AR = CreateObject("System.Collections.ArrayList") cPath = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\pdf\"
cFile = Dir(cPath & "*_*.pdf") While cFile <> "" iw = InStrRev(cFile, "_") If 0 < iw Then cw2 = Left(cFile, iw - 1) If cw1 <> cw2 Then If cw1 <> "" Then AR.Sort MsgBox Join(AR.toarray, vbLf), , cw1 & ".pdf" AR.Clear End If cw1 = cw2 End If AR.Add cPath & cFile End If cFile = Dir Wend
MsgBox Join(AR.toarray, vbLf), , cw1 & ".pdf" Set AR = Nothing End Sub (???) 2017/08/28(月) 09:07
対応するには、フォルダ内のファイルを全選択して、別フォルダに移動またはコピーすることで強制的に名前順に並べておくか、またはコードを変更して、もうひとつArrayListオブジェクトを用意し、全ファイル読み込んでからSortし、そこからファイルを取り出していくようにしてください。
(???) 2017/08/28(月) 09:28
ファイルはご指導いただいた通り、所定のフォルダで強制的に名前をいったん並べて実行してみました。
型をかえてはいないのですが、以下の部分で「実行時エラー13 型が一致しません」とエラーとなります。。。
For i = LBound(InputFilePath) To UBound(InputFilePath) cpathやcFile,iw,iなどの型をStringやVariantなどに変更しても同じエラーとなってしまいます。 ファイル名は全て、「ID1234_0001.pdf」のように修正済となります。
どこの型を揃える必要があるのでしょうか??
実行したのは以下のものです。
Sub test()
Dim AR As Object Dim cPath As String Dim cFile As String Dim iw As Long Dim cw1 As String Dim cw2 As String Set AR = CreateObject("System.Collections.ArrayList") cPath = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\pdf\" cFile = Dir(cPath & "*_*.pdf") While cFile <> "" iw = InStrRev(cFile, "_") If 0 < iw Then cw2 = Left(cFile, iw - 1) If cw1 <> cw2 Then If cw1 <> "" Then AR.Sort Call MergePDF(ByVal InputFilePath, ByVal OutputFilePath) 'MsgBox Join(AR.toarray, vbLf), , cw1 & ".pdf" AR.Clear End If cw1 = cw2 End If AR.Add cPath & cFile End If cFile = Dir Wend Call MergePDF(ByVal InputFilePath, ByVal OutputFilePath) 'MsgBox Join(AR.toarray, vbLf), , cw1 & ".pdf" Set AR = Nothing End Sub
Private Sub MergePDF(ByVal InputFilePath As Variant, _
ByVal OutputFilePath As String) 'Acrobatを利用してPDFファイルを結合する Dim pdoc As Object Dim i As Long Const PDSaveFull = &H1
With CreateObject("AcroExch.PDDoc") If .Create = True Then Set pdoc = CreateObject("AcroExch.PDDoc") For i = LBound(InputFilePath) To UBound(InputFilePath) If pdoc.Open(InputFilePath(i)) = True Then .InsertPages .GetNumPages() - 1, pdoc, 0, pdoc.GetNumPages() - 1, True pdoc.Close End If Next .Save PDSaveFull, OutputFilePath .Close End If End With End Sub
(初心者) 2017/08/29(火) 01:13
> Call MergePDF(ByVal InputFilePath, ByVal OutputFilePath) これは、呼ばれる側の書き方です。呼び側だと、以下のような感じ。 Call MergePDF(AR.toarray, cw1 & ".pdf")
これが書けないようならば、外部オブジェクトを扱うコードなんて、まだ貴方には無理、と思いますよ? 背伸びしすぎていると思います。
(???) 2017/08/29(火) 09:12
ArrayListをもう1つ加えて、一旦ソートしてから処理することで、ファイルの並び順がバラバラでも、新しいフォルダへの移動が不要なように変更した版を書いておきます。
Sub test() Dim AR1 As Object Dim AR2 As Object Dim cPath As String Dim cFile As String Dim cw1 As String Dim cw2 As String Dim i As Long Dim iw As Long
Set AR1 = CreateObject("System.Collections.ArrayList") Set AR2 = CreateObject("System.Collections.ArrayList") cPath = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\pdf\"
cFile = Dir(cPath & "*_*.pdf") While cFile <> "" AR1.Add cPath & cFile cFile = Dir Wend AR1.Sort
For i = 0 To AR1.Count - 1 iw = InStrRev(AR1(i), "_") If 0 < iw Then cw2 = Left(AR1(i), iw - 1) If cw1 <> cw2 Then If cw1 <> "" Then AR2.Sort MsgBox Join(AR2.toarray, vbLf), , cw1 & ".pdf" AR2.Clear End If cw1 = cw2 End If AR2.Add AR1(i) End If Next i
MsgBox Join(AR2.toarray, vbLf), , cw1 & ".pdf" Set AR2 = Nothing Set AR1 = Nothing End Sub (???) 2017/08/31(木) 16:30
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.