拙著『すぐわかる Excel マクロ&VBA マネして使える作例集 Excel 2010/2007/2003 (すぐわかるシリーズ)』のステップ39(P190) では、キーワードとして指定した語句をファイル名に含むExcelブックをまとめて開くマクロを取り上げています。

先日、読者の方から、「Excelブックではなく、PDFファイルをまとめて開くことは可能ですか?」という質問をいただきました。 そこで今回は、指定した語句をファイル名に含むPDFファイルをまとめて開くマクロを紹介します。

今回のマクロでやろうとしていること

今回は、Hドライブ直下の「MyDoc」フォルダー以下にある「地区別報告書」フォルダーの中に、次の画面のように8つのファイルが格納されているという前提とします。

▼Windows 7では、アドレスバーをクリックすると、パスが表示されます。
ev120604-1

このフォルダー内について、たとえばキーワードに「渋谷」を指定したら、ファイル名に「渋谷」を含むPDFファイルのみをまとめて開けるようにします。具体的には、「バックアップ_渋谷201204.pdf」と「渋谷201204.pdf」と「渋谷201205.pdf」の3つのファイルを開きます。「渋谷メモ.txt」はPDFファイルではないので、開かないようにします。同様に、キーワードに「新宿」を指定すると、ファイル名に「新宿」を含む3つのPDFファイルだけを開きます。

マクロのコード

指定した語句を含むPDFファイルをまとめて開くマクロのコードは下記の通りです。キーワードとなる語句は「渋谷」を指定しています。Subプロシージャ名は「PDFをまとめて開く」としています(うっ、センスないネーミングですね・・・涙)。

Sub PDFをまとめて開く()
  Dim keyword As String
  Dim myPath As String
  Dim fName As String

  keyword = "渋谷"
  myPath = "H:\MyDoc\地区別報告書\"
  fName = Dir(myPath & "*" & keyword & "*" & ".pdf")

  If fName = "" Then
    MsgBox ("該当するファイルが存在しません。")
    Exit Sub
  End If

  Do Until fName = ""
    Shell ("explorer.exe " & myPath & fName)
    fName = Dir()
  Loop
End Sub


では、本書と多少かぶる部分もありますが、コードのポイントを解説していきます。ポイントはDir関数ワイルドカードである「*」(アスタリスク)、Shell関数です。以下、解説中に登場するコードの行番号は、空白行を抜いても入れてカウントしたものになっています。

指定した語句を含むPDFファイルを見つけるには

String型変数keywordには、キーワードとなる語句の文字列を入れます。6行目で「渋谷」を代入しています。
String型変数myPathには、対象となるフォルダーのパスの文字列を入れます。7行目で「H:\MyDoc\地区別報告書\」を代入しています。

8行目では、Dir関数が登場します。Dir関数は引数にパス付きでファイル名を指定すると、そのファイルが存在するなら、そのファイル名のみを返します。存在しなければ、空の文字列を返します。8行目では、Dir関数の引数は次のように指定しています。「&」は文字列連結演算子です。

myPath & “*” & keyword & “*” & “.pdf”

 

まずは前半の「myPath &」を除いた「”*” & keyword & “*” & “.pdf”  」の部分だけを見ていきましょう。変数keywordの前後に、ワイルドカード*」を連結しています。ワイルドカードとは、任意の文字列を意味する特殊な記号のことです。Excel VBAでは「*」(アスタリスク)になります。そして、最後にPDFファイルの拡張子である「.pdf」を連結します。

変数keywordには「渋谷」という文字列が入っているので、「”*” & keyword & “*” & “.pdf”  」は「*渋谷*.pdf」となります。キーワードである「渋谷」の前後をワイルドカード「*」で挟むことで、「渋谷」が含まれる文字列を表し、さらに拡張子「.pdf」を付けることで、ファイル名に「渋谷」を含むPDFファイルを表します。ちなみに、「渋谷*」 とすると「渋谷」で始まる文字列のみに、「*渋谷」とすると「渋谷」で終わる文字列のみとなります。

よって、Dir関数の引数に指定している「myPath & “*” & keyword & “*” & “.pdf”」は、変数myPathに入っている文字列「H:\MyDoc\地区別報告書\ 」が「*渋谷*.pdf」 の前に連結され、「H:\MyDoc\地区別報告書\*渋谷*.pdf 」となります。

実際の8行目のコードは下記です。Dir関数の戻り値をString型変数fNameに代入しています。

fName = Dir(myPath & “*” & keyword & “*” & “.pdf”)

 

「H:\MyDoc\地区別報告書\*渋谷*.pdf」をDir関数で調べた結果、最初のPDFファイルである「バックアップ_渋谷201204.pdf」が見つかり、そのファイル名がDir関数の戻り値として得られ、変数fNameに代入しているのです。

▼デバッグ機能をご存じの方は、変数fNameの値を確認してみるとよいでしょう。ご存じない方はMsgBoxで値を表示すれば確認できます。
ev120604-2

 

10~13行目は、8行目のDir関数で該当するファイルが見つからなかった場合のエラー処理です。

ファイルが見つからないとDir関数は空の文字列を返すのでした。10行目のIfステートメントで、Dir関数の戻り値が代入されたfNameが空の文字列かどうか判定し、もしそうなら11行目でメッセージを表示した後、12行目の「Exit Sub」でSubプロシージャを終了しています。こういったエラー処理はついついサボリがちですが、しっかりと記述しておきたいものです。

PDFファイルを開くには

PDFファイルを開く処理のコードは、15~18行目のDo Until Loopループになります。実際に開く処理は16行目のShell関数で行っています。Shell関数は引数に「アプリケーションの実行ファイル名 パスおよびファイル名」という書式の文字列を指定すると、そのアプリケーションでそのファイルを開くことができます。
「アプリケーションの実行ファイル名 」と「パスおよびファイル名」の間には、必ず半角スペースが入るので注意してください。

16行目では、Shell関数の引数に下記を指定しています。

“explorer.exe ” & myPath & fName

 

「”explorer.exe “」の部分は、エクスプローラーの実行ファイル名である「explorer.exe 」と、その後に半角スペースを加えた文字列になります。そして、その文字列に、変数myPathに入っているパスと、変数fNameに入っているPDFファイル名を連結して、「”explorer.exe H:\MyDoc\地区別報告書\*渋谷*.pdf」という文字列を生成しています。この文字列をShell関数の引数に渡すことで、指定したPDFファイルをエクスプローラーで開きます。すると、規定のPDF閲覧ソフトで「バックアップ_渋谷201204.pdf」が開きます。

17行目には、次のようなコードが記述してあります。

fName = Dir()

 

これぞDir関数の真骨頂!という使い方ですね。実はDir関数は引数に何も指定しないと、前回と同じ条件で再びファイルが存在するか調べます。その際、前回見つけたファイルは除外してくれます。従って今回の例の場合、最初に見つけたPDFファイル 「バックアップ_渋谷201204.pdf」ではなく、「渋谷201204.pdf」を返すことになり、その戻り値を変数fNameに再び代入しています。そして、ループによって再び16行目に戻り、今度は「渋谷201204.pdf」 をShell関数で開きます。

以降、同じ仕組みで「渋谷201205.pdf」も開きます。その後、ファイル名に「渋谷」を含むPDFファイルはフォルダー名にもう存在しないので、17行目のDir関数は空の文字列を返して変数fNameに代入されます。すると、Do Until Loopループの条件式が成立し、ループが終了します。

応用アイディアあれこれ

Subプロシージャ「PDFをまとめて開く」は、以上のような仕組みで、指定した語句を含むPDFファイルをまとめて開いています。Shell関数を軸に、ワイルドカード「*」とDir関数を効果的に利用しています。

なお、ファイル名に「渋谷」ではなく「新宿」を含むPDFファイルをまとめて開きたいなら、6行目で変数keywordに代入する文字列を「新宿」に変更してください。あわせて、キーワードの文字列を直接代入するのではなく、RangeやCellsのValueプロパティでセルに入っている文字列を代入したり、フォームやInputBox関数で入力した文字列を代入したりするようコードを変更してもよいでしょう。

また、別のフォルダーに変更したければ、7行目で変数myPathに代入しているパスの文字列を変更してください。

さらに、8行目で指定している拡張子を変更すれば、別の種類のファイルにも対応できます。たとえば「.doc」に変更すれば、Wordのファイルを開くことができます。いろいろ応用できそうですね。

あっ、そもそもExcelブックを開くには、16行目はShell関数ではなく、WorkbooksコレクションのOpenメソッドを使って、「Workbooks.Open Filename:=myPath & fName」と記述してくださいね。もちろん、ファイルの拡張子はExcelのものに。

これからもExcel VBAネタを本ブログにちょくちょく書いていければと思います。

蛇足: 最後に少々宣伝を

最後に少々宣伝させて下さい。
Excel VBAのキホンの「キ」から学びたい方は、下記の拙著をどうぞ。

  

また、前者の拙著をテキストとしたセミナー「Excel VBAがゼッタイにわかる1日セミナー」を東京・名古屋・大阪で開催しています。まったくの初心者だったのに、1日受講しただけで、自分の手でExcel VBAのプログラムを書けるようになったなど、受講者の皆さまからご好評いただいております。

seminar_logo

Excelを使った仕事を効率化したい方、よろしければどうぞご受講ください! また同拙著はVBAエキスパート推薦図書にもなったので(2012年6月より)、資格試験対策の一環にもなりますよ。

宣伝は以上です・・・・・ ぜんぜん「少々」ではなかったですね(^_^;) 初心者卒業後のオススメ書籍等は下記の過去エントリを参照下さい。

Excel VBA初心者を卒業した人にオススメの厳選書籍&Web