「あぁ、まただ…。ファイル名が今日の日付に変わったから、マクロのコードの中身を書き換えないと動かないや。面倒くさいなぁ…」
こんな経験はありませんか?
せっかくマクロを作っても、対象のファイルが変わるたびにVBAの画面を開いて「ファイルパス(保存場所)」を書き換えているようでは、本当の効率化とは言えませんよね。
そこで登場するのが、今回ご紹介する「GetOpenFilename」です。
これは、Excelで「ファイルを開く」ボタンを押したときに出てくる、あの「ファイル選択画面(ダイアログ)」を、自分のマクロ内に呼び出す便利な仕組みです。
なぜ「パスの直接書き込み」は避けるべきなのか?
例えばデスクトップにある「売上データ.xlsx」を読み込むマクロを作ったとします。
しかし、このマクロを上司や同僚に共有しても正しく動きません。
理由はシンプルで、他者のパソコンのデスクトップにはそのファイルがなかったり、異なるファイル名になっていたりするからです。
このように、特定のファイル場所をコードに直接書き込むこと(ハードコーディング)は、「誰がどこで使っても迷わず動くツール」を作る上での大きな障害になります。
GetOpenFilenameはユーザーの「御用聞き」
このメソッドは、例えるなら「買い物へ行く前に『今日は何を買ってきましょうか?』と確認してくれる御用聞き」のようなものです。
つまり、マクロが自動でファイルを探しに行くのではなく、「どのファイルを使用しますか?」とユーザーに問いかけてくれるようになります。
それでは、コピペで使えるコードを見てみましょう。
Sub SelectFileSample()
' 変数の宣言
Dim filePath As Variant
' ファイル選択ダイアログを表示(御用聞き機能の呼び出し)
' 引数のFileFilterで、エクセルファイルだけを見えるように制限しています
filePath = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xlsx;*.xls")
' 「キャンセル」が押されたときの対策
' 何も選択されなかった場合、filePathには False が格納されます
If filePath = False Then
MsgBox "キャンセルされました。処理を中断します。"
Exit Sub
End If
' 選択されたファイルのパスを表示(実際はここにファイルを開く処理などを記述します)
MsgBox "あなたが選んだのはこれですね!:" & vbCrLf & filePath
' 参考:実際に開く場合は以下のように書きます
' Workbooks.Open Filename:=filePath
End Sub
おわりに
VBAは一見「難しそう」と思われがちですが、完成したツールはこうした「使い手へのちょっとした気遣い」の積み重ねで成り立っています。
この GetOpenFilename をマスターすれば、私たちの作成するツールは一気に「プロ仕様」へと進化します。ぜひ、今日から自分のマクロに組み込んでみてください!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント