作成したエクセルファイルをpdf化してメールなどで送ったり、保存したりすることは仕事の上で意外とあります。
しかし、pdf化するファイルが複数あると、1つ1つ作業するって結構手間がかかりますよね。
そこで今回は、
複数のファイルを自動でpdf化する方法
についてVBAで、どのようにできるか書きたいと思います。
因みにですが、ここで紹介するVBAのコードは、
プロ顔負けといったすごいものではなく、こうすれば「一応できる」という初心者レベルでの解説となります。
あくまで個人レベルで作業することを想定していますのでご了承ください。
今回の作業イメージはこんな感じ。
pdfフォルダ内に、pdf化したいファイルを全部入れ込み、それを同階層にある「VBA.xlsm」ファイルからpdf化を実行します。
サンプルコード
では、いきなり全体のコードを書きたいと思います。
<サンプルコード>
Sub pdf化()
Dim WBPath As String
Dim myfile As String
Dim WB As Workbook
Dim WBName As String
WBPath = ThisWorkbook.Path ----------------------- ア
myfile = Dir(WBPath & “\pdf\” & “*.xlsx”) ----------------- イ
Do While myfile <> “”
Set WB = Workbooks.Open(WBPath & “\pdf\” & myfile) --------- ウ
WBName = WB.Name ------------------------ ウ
num = InStr(WBName, “.”) -------------------- エ
WB.ExportAsFixedFormat _ ---------------------- オ
Type:=xlTypePDF, _
Filename:=WBPath & “\pdf\” & Left(WBName, num – 1)
WB.Close
myfile = Dir() ----------------------------- カ
Loop
End Sub
■詳細説明
「ア」部分
これは、以前の記事でも書きましたが、VBAファイルを置いているフォルダを指します。
これにしておけば、フォルダがどの階層にあっても(移動しても)機能するので便利です。
【関連記事】
「イ」部分
今回は、Dir関数を使います。
Dir関数は、引数に指定したファイルが存在する時に、そのファイル名を返す関数です。
ファイル存在有無を確認する時には、このDir関数を使うのが一つの方法。
引数には、「*」(ワイルドカード)が使えます。
もし、xlsファイルと、xlsxファイルが混在しても大丈夫。
そんな場合は、「*xls*」にします。
ワイルドカードは任意の0文字以上なので、こうしておけば両方拾えます。
「ウ」部分
直前のコード「Set WB・・・」部分で、検索できたファイルを開いています。
この状態で、開いたファイル名を「WB.Name変数」で取得することが、下記「オ」部分で活きてきます。
「エ」部分
素人レベルのわたしが、今回一番苦労したのがココ。
なんせ、これ(InStr関数)を使わないと、pdf化されてもファイル名がおかしくなってしまう。
前述の「ウ」で、使った「WB.Name」だと拡張子まで含んだファイル名が付いてしまうのです。
例.
対象ファイル名 → 顧客リスト.xlsx
生成pdf → 顧客リスト.xlsx.pdf
で、この拡張子を抜いたファイル名を付けるために、今回「InStr関数」を使用しました。
<補足 : InStr関数について>
InStr関数は、対象となる文字列の先頭から、指定した文字列を検索して、最初に見つかった検索文字の位置を数値で返す関数です。
引数のベースはこんな具合(引数はこの他にもありますが、今回は省略し、下記のみとしています)。
InStr(検索元の文字列,検索する文字列)
今回で言うと、WBNameでファイル名を取得し、拡張子前の「.(ピリオド)」を捉え、先頭から何文字目に「.(ピリオド)」が来るかを数値で返します。
因みに、数値を返すわけですが、実際にどの数値が返されてるかを見るには、「イミディエイトウィンドウ」を使うと良いです。
「表示」→「イミディエイトウィンドウ」で表示ができるようになります。
使い方は、目的のセンテンスの前に「Debug.Print」を付ければOK。
実行すれば、ウィンドウに取得した数値が表示されます。
具体的には、
Debug.Print num = InStr(WBName, “.”)
とします。
「オ」部分
今回は、pdf化が目的なわけですが、この時使われるメソッドが、ExportAsFixedFormat。
舌を噛みそうなメソッドですが、これを使えばファイルをpdf化できます。
このメソッドにも、引数は多数存在しますが下記2つあれば今回の目的には充分。
Type , FileName
前者は、特に説明の必要はないと思います。
後者は、保存場所なので好きな場所を指定するだけ。
ポイントは、Left関数です。
Left(WBName, num – 1)
Left関数は、文字列の先頭から文字列の一部を取り出す関数。
※書式的には、Left(String,Length)となります
青文字部分(Length)が「num-1」となってますが、これは検索した文字である「.(ピリオド)」の左側(-1)を意味します。
なので、ファイル名だけを純粋に取得できるわけです。
仮にピリオドを検索し、右側の拡張子部分を取得するならRight関数を用います。
最後にCloseでファイルを閉じておきます。
「カ」部分
「ア」~「オ」までのセンテンスにより、1つのファイルをpdf化することが出来ます。
後は、これを繰り返す形になりますが、その場合は、Dir()を用います。
これは、同じ条件でファイルを検索するという意味です。
Do While ~ Loop構文で、同じように処理ができるようになります。
以上となります。