マクロの実行中に、ユーザーに任意のブックを選択させ、そのブックを直接開きたい場合があります。VBAには、この「ダイアログの表示」と「ファイルを開く」という2つの動作を、一度に実行してくれるシンプルなメソッドがあります。
それがApplication.FindFile
メソッドです。しかし、このメソッドは古いバージョンのExcelで使われていたもので、現在では非推奨とされています。
この記事では、Application.FindFile
の基本的な使い方と、なぜ現在では利用が推奨されないのか、そして今使うべき代替方法を合わせて解説します。
Application.FindFile
の基本的な使い方
Application.FindFile
は、引数なしで実行すると「ファイルを開く」ダイアログボックスを表示します。ユーザーがファイルを選択して「開く」をクリックすると、そのファイルが実際に開かれ、メソッドはTrue
を返します。
完成したVBAコード
Sub OpenBookWithFindFile()
' Application.FindFileを実行
' ユーザーがファイルを選択して開くと、Trueが返る
If Application.FindFile = True Then
' ファイルが正常に開かれた後の処理
MsgBox "新しいブック「" & ActiveWorkbook.Name & "」を開きました。"
Else
' 「キャンセル」が押された場合
MsgBox "ファイルの選択がキャンセルされました。"
End If
End Sub
このように、コードは非常にシンプルです。前回の記事で紹介したGetOpenFilename
と異なり、ファイルを開くためのWorkbooks.Open
を別途記述する必要がありません。
【重要】Application.FindFile
は古い、非推奨の機能です
このメソッドは非常にシンプルで便利に見えますが、Microsoftによって公式に「古い(Deprecated)」機能と位置付けられています。
- 動作の保証がない: 最近のExcelバージョンでは、この機能が削除されていたり、意図通りに動作しなかったりする可能性があります。
- 互換性の問題: 将来のExcelのアップデートで、完全に使えなくなる可能性があります。
このような理由から、新しくVBAコードを作成する際に、このApplication.FindFile
メソッドを利用することは強く推奨されません。
【推奨】現代的な代替方法: GetOpenFilename
を使う
現在、ユーザーにファイルを選択させて開く処理を実装する最も標準的で確実な方法は、前回の記事でも紹介した**GetOpenFilename
とWorkbooks.Open
を組み合わせる**方法です。
Sub OpenBook_RecommendedWay()
Dim filePath As Variant
' 1. まず、GetOpenFilenameで「ファイルパス」だけを取得
filePath = Application.GetOpenFilename(FileFilter:="Excel ブック (*.xlsx; *.xlsm),*.xlsx;*.xlsm")
' 2. キャンセルされなかった場合、取得したパスを使ってブックを開く
If filePath <> False Then
Workbooks.Open Filename:=filePath
MsgBox "「" & ActiveWorkbook.Name & "」を開きました。"
Else
MsgBox "ファイルの選択がキャンセルされました。"
End If
End Sub
なぜこちらの方法が良いのか?
- 信頼性と互換性: すべてのExcelバージョンで確実に動作し、今後もサポートされる標準的な方法です。
- 柔軟性: ファイルを開く前に、取得したファイルパス(
filePath
)を使って、ファイル名のチェックやログの記録など、追加の処理を挟むことができます。
まとめ
メソッド | 特徴 | 信頼性 | 推奨度 |
Application.FindFile | 1行で「選択とオープン」ができてシンプル。 | 低い(古い機能で非推奨)。 | 低 |
GetOpenFilename | 「パスの取得」と「開く」を2段階で行う。 | 高い(標準機能)。 | 高 |
Application.FindFile
は、古いコードをメンテナンスする際に目にすることがあるかもしれませんが、これから新しくマクロを作成する場合は、その存在は忘れて、必ずApplication.GetOpenFilename
とWorkbooks.Open
を組み合わせる方法を使いましょう。
これが、将来にわたって安定して動作する、プロフェッショナルなVBAコードの書き方です。