初心者のためのExcelマクロ超入門(絶対できるVBA開発)

マクロがまったくわからない人のためにエクセルマクロやVBAについてできるだけわかりやすく書いています。Twitter:@shuhhohhey

初心者のためのExcel(エクセル)マクロVBA入門-ブックを開く:その2(GetOpenFilenameメソッド)

GetOpenFilenameメソッドだけではファイルは開けない!?

今回はファイルを開く!というよりは開くファイルのフルパスを取得する。という方が正しいのですが、GetOpenFilenameメソッドのお話です。主にユーザーにファイルを選んで開いてもらう時に使ったり、読み込むファイルの参照を動的にマクロを使う人に設定してもらう時に使ったりします。

とりあえず、いきなりサンプルです。

Sub Test()
    
    '開いたファイルのオブジェクトを格納する変数を作成
    Dim fileName As String
    
    'GetOpenFilenameメソッドを実行する
    fileName = Application.GetOpenFilename("Microsoft Excelブック,*.xlsx")
    
    'ファイルを開く!
    Workbooks.Open fileName

End Sub

いじょ!GetOpenFilenameメソッドは選ばれたファイルのフルパス(絶対パス)を文字列で返します。ただしヘルプを見るとわかるとおり、戻り値はVariant型です。特に注意はいりませんが、一応覚えておきましょう。このサンプルでもString型を宣言してそこにファイルのフルパスが格納され、それを使ってブックを開いています。


注意しないといけないのはファイルのフルパスを返すだけでGetOpenFilenameメソッドだけでファイルを開くことはできません。ということです。結局ファイルを開くには前回やったOpenメソッドが必要です。


さて、引数を見ましょう。引数FileFilterには

  • ファイルの種類の説明(文字列でなんでもいい)
  • 表示するファイルの拡張子(ワイルドカード可)

の2つをセットで指定します。フィルターなので、表示するファイルを指定したものに限定するわけですね。

はて?ワイルドカード


ワイルドカードとはなんでしょうか?ワイルドカードとは、ポーカーで言うジョーカーみたいなやつで、どれにでもなれる。というような意味があります。上記の[*.xlsx]の[*]がワイルドカードです。このように書くことで、「xlsxファイルならどれでもOK」という意味になり、GetOpenFilenameメソッド上ではxlsxファイルを「すべて」表示する。になります。
じゃあ?xlsファイルも表示したい場合はというと、

    
    'GetOpenFilenameメソッドを実行する
    fileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
    

こうします。この「?」もワイルドカードの一種で、「なにかの0文字以上の1文字」を表します。ですのでxlsもxlsxも当てはまります。もちろんxlsaでもxlsbでもxlscでも当てはまります。(そんな拡張子はないのであまり意味ないですが)

じゃあ?まったく違うファイルのtxtファイルとかも表示したいんだけど!という場合は?

一度に表示するパターン

    
    'GetOpenFilenameメソッドを実行する
    fileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?;*.txt")
    


選択して表示できるパターン

    
    'GetOpenFilenameメソッドを実行する
    fileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?, テキストファイル,*.txt")
    

のように「;」セミコロンで区切るか、「,」カンマで羅列して記述します。

ワイルドカードはファイル名には使えない!


先のフィルターはとっても便利なのですが、ファイル名には使えないので注意してください。例えば「納品*.xls?」なんて風に納品で始まるエクセルファイル名のみ表示する。なんてことはできません。


これを実現するには別の方法が必要です。


後はファイルを複数選択したい場合はMultiSelectをTrueにすればOKです。ただしこれを使うと戻り値が配列になるのでご注意ください。そりゃそうですね。複数選択するのですから、複数のファイルパスを返さないといけないので必然的に配列になります。

んー今日はあんまりうまく書けてない。。。


ま、今日はここまで。

かしこ