【簡単エクセル/Excel VBA マクロ】ユーザーに開くファイル(ワークブック)を選択させて開く方法|GetOpenFilename|ファイル操作 #003


いつもありがとうございます!
皆さん、こんにちは。ご覧いただきありがとうございます。
“日々の業務にちょうどいい自動化を”──
業務改善アプリケーションの作成を行っている「ソフトデザイン工房」 です。
この記事では、ユーザーに開くファイル(ワークブック)を選択させて開く方法を解説します。
この記事が、あなたのVBAマクロの価値をさらに高める一助となれば幸いです。
VBAを活用して、自分自身や身近なコミュニティに合ったアプリケーションを作成し、仕事量は半分に、成果は2倍に──そんな未来を目指すあなたを応援しています。
VBAにおけるファイル操作の全体像
VBAにおける「ファイル操作」の全体像は以下の記事で解説しています。
この記事では、「ファイル操作」の一部である「ファイル名を指定してファイル(ワークブック)を開く方法」を解説します。
VBAで「ユーザーに開くファイル(ワークブック)を選択させて開く」方法

GetOpenFilename メソッドの基本構文
ユーザーに開くファイル(ワークブック)を選択させて開くには、GetOpenFilename メソッドを使用します。GetOpenFilename メソッドの 構文を以下に示します。
Sub Sample()
'変数宣言
Dim fp As Variant ' ファイルパス
' ファイル選択ダイアログを表示し、選択されたファイルのパスを変数 fp に代入
fp = Application.GetOpenFilename
' ファイルパスが False(キャンセルされた)でない場合、fp に代入されたファイルを開く
If fp <> False Then
Workbooks.Open fp
End If
End Subこのコードを実行すると以下のダイアログが開きます。

このダイアログの中から開きたいファイルを選択し「開く」を押すと、ファイルが開きます。
GetOpenFilename は上述のように引数を指定しなくても機能しますが、以下のように引数を設定することができます。
Application.GetOpenFilename( _
[FileFilter], _
[FilterIndex], _
[Title], _
[ButtonText], _
[MultiSelect] _
)各引数の意味は下表の通りです。
| 引数 | 意味 |
|---|---|
| FileFilter | ダイアログに表示するファイルの種類を指定します。省略すると、Excelはもちろん、ワードやパワーポイント、画像、テキストファイルなど、すべてのファイルが表示されます。 |
| FilterIndex | FileFilter で指定したフィルタの中で、デフォルトで選択されるフィルタをインデックス(番号)で指定します。 例えば、FileFilter にExcel、CSVの順番で指定した場合、インデックスはExcelが1、CSVが2となります。省略した場合は1が適用されます。 |
| Title | ダイアログボックスのタイトルです。省略すると標準のタイトルが適用されます。 |
| ButtonText | ダイアログボックスのボタンに表示されるテキストの指定ですが、これは Macintosh でのみ使用可能です。 |
| MultiSelect | 複数のファイルの選択を可能にするかどうかの指定です。True or False で指定します。省略すると False が適用されます。 |
GetOpenFilename の具体例と解説
ButtonText を除くすべての引数を実装した例を以下に示します。
Sub Sample2()
'変数宣言
Dim fp As Variant ' ファイルパス
' ファイル選択ダイアログを表示し、選択されたファイルのパスを変数 fp に代入
fp = Application.GetOpenFilename( _
"エクセル, *.xlsx;*xlsm, CSV, *.csv", _
1, _
"開くファイルを選択してください", _
False _
)
'↑の引数の解説
'fp = Application.GetOpenFilename( _
' "エクセル, *.xlsx;*xlsm, CSV, *.csv", _ <-- ファイルの種類を指定
' 1, _ <-- デフォルトで選択されるフィルタのインデックスを指定
' "開くファイルを選択してください", _ <-- ダイアログボックスのタイトルを指定
' False _ <-- 複数のファイルの選択を可能にするかどうかの指定
')
' ファイルパスが False(キャンセルされた)でない場合、fp に代入されたファイルを開く
If fp <> False Then
Workbooks.Open fp
End If
End Sub解説していきます。
'変数宣言
Dim fp As Variant ' ファイルパス変数の宣言です。データ型は Variant が好ましいです。
GetOpenFilename メソッドでユーザーがファイルを選択した場合は戻り値が "文字列型" のファイルパスになりますが、キャンセルした場合は "Boolean 型"の Falese を返します。
つまり、文字列型もBoolean型も扱える Variant 型が適しています。
' ファイル選択ダイアログを表示し、選択されたファイルのパスを変数 fp に代入
fp = Application.GetOpenFilename( _
"エクセル, *.xlsx;*xlsm, CSV, *.csv", _
1, _
"開くファイルを選択してください", _
False _
)ファイルを選択するダイアログボックスを表示し、ユーザーにファイルを選択させます。
ユーザーに選択させたファイルのパスは変数 fp に代入します。ユーザーがファイルを選択せず、「キャンセル」を押した場合は、変数 fp に Boolean 型の False を代入します。

第1引数の "エクセル, .xlsx;xlsm, CSV, *.csv", _ はダイアログボックスに表示させるファイルの種類の指定です。全体を " " で囲って記述します。
まず、エクセル, .xlsx;xlsm の部分ですが、コンマの左側がダイアログに表示される文字列情報、右側が拡張子の指定です。
この例のようにエクセルとCSVの2種のファイルを扱う場合は、エクセルとCSVの間をコンマ(" , ")で区切って記述します。
エクセルの中でも異なる拡張子のファイルを複数扱う場合は、セミコロン(" ; ")で区切って記述します。
第2引数の 1, _ は、デフォルトで選択する FileFilter のインデックス(番号)です。FileFilter は、エクセル、CSVの順番で指定していますので、インデックスはエクセルが1、CSVが2となります。つまり、この場合はインデックス 1 を指定していますので、エクセルがデフォルトとして適用されます。
第3引数の "開くファイルを選択してください", _ はダイアログボックスに表示させるタイトルです。

第4引数の False _ は、複数のファイルの選択を可能にするかどうかの指定です。この場合は False ですので、単一ファイルのみの選択となります。
' ファイルパスが False(キャンセルされた)でない場合、fp に代入されたファイルを開く
If fp <> False Then
Workbooks.Open fp
End Ifファイルパスが False でない場合、つまり、ユーザーが「キャンセル」ではなく、正常にファイルを選択している場合に、選択したファイルを開きなさい、というコードです。
"<>" は論理演算子の一種です。論理演算子とは、真偽値(True or False)を返すための評価に使われる記号のことです。論理演算子の代表的なものには、And や Or などがありますが、 "<>" は「等しくない」を意味します。つまり、 fp <> False は、fp が False に等しくない、を意味します。
したがって、If fp <> False Then は、「もし fp が False でなければ」を意味します。
Workbooks.Open は、指定したファイルを開くメソッドです。こちらの記事で詳しく解説しています。
以上が、GetOpenFilename メソッドの具体例と解説です。
【違いを生み出す工夫】デフォルトディレクトリの設定
さて、前述の内容だけでも悪くはないのですが、実際の場面ではもう一工夫あった方が喜ばれます。
GetOpenFilename メソッドで開く"デフォルトのディレクトリの設定"です。
デフォルトのディレクトリを指定しない場合、GetOpenFilename は、その時のカントディレクトリを開きます。通常、カレントディレクトリは、ユーザーが最後にアクセスしたディレクトリなどになっていると思います。
一方で、実際の仕事では、開きたいファイルの置き場所はある程度決まっていることが多いと思います。
つまり、ユーザーのカレントディレクトリ(例えば、マイドキュメント)から、開きたいファイルがあるところまでをポチポチクリックして移動させることは好ましくありません。
そのため、デフォルトのディレクトリは、コードの中で指定してあげることが好ましい場合が多いです。
デフォルトのディレクトリを指定するには、GetOpenFilename が実行される前にカレントディレクトリを指定のディレクトリに変更してあげれば良いのです。
カレントディレクトリの変更には、以下の2つのケースがあります。
1. デフォルトディレクトリをローカルのパスに設定する場合
デフォルトのディレクトリをローカルのパスにする場合には、ChDrive と ChDir ステートメントを使用して、ドライブとディレクトリの2つを変更する必要があります。
' デフォルトのディレクトリをローカルのパスに設定
ChDrive "C" ' 例としてCドライブに設定しますが、皆さんのドライブに変更してください
ChDir "C:\your_directory" 2. デフォルトディレクトリを共有サーバーのパスにする場合
デフォルトのディレクトリを共有サーバーのパスに設定する場合には、ChDirを使用してディレクトリのみを変更します。
' デフォルトのディレクトリを共有サーバーのパスに設定
ChDir "\\server_name\shared_directory" コード全文
以上を踏まえて、コード全文を以下に示します。デフォルトのディレクトリをローカルのパスに設定する場合のコードを代表として示します。
Sub Sample3()
'変数宣言
Dim fp As Variant ' ファイルパス
' デフォルトのディレクトリをローカルのパスに設定
ChDrive "C" ' 例としてCドライブに設定しますが、皆さんのドライブに変更してください
ChDir "C:\your_directory"
' ファイル選択ダイアログを表示し、選択されたファイルのパスを変数 fp に代入
fp = Application.GetOpenFilename( _
"エクセル, *.xlsx;*xlsm, CSV, *.csv", _
1, _
"開くファイルを選択してください", _
False _
)
'↑の引数の解説
'fp = Application.GetOpenFilename( _
' "エクセル, *.xlsx;*xlsm, CSV, *.csv", _ <-- ファイルの種類を指定
' 1, _ <-- デフォルトで選択されるフィルタのインデックスを指定
' "開くファイルを選択してください", _ <-- ダイアログボックスのタイトルを指定
' False _ <-- 複数のファイルの選択を可能にするかどうかの指定
')
' ファイルパスが False(キャンセルされた)でない場合、fp に代入されたファイルを開く
If fp <> False Then
Workbooks.Open fp
End If
End Subユーザーの皆さんにとって少しでも使い勝手の良いシステムとなることを願っております。
【ワンポイントテクニック】コード内の改行について
本稿では、あえてコード内に改行を入れて、可読性を上げる工夫をしました。この部分です。
' ファイル選択ダイアログを表示し、選択されたファイルのパスを変数 fp に代入
fp = Application.GetOpenFilename( _
"エクセル, *.xlsx;*xlsm, CSV, *.csv", _
1, _
"開くファイルを選択してください", _
False _
)コードの途中に " _"(半角スペースとアンダースコア)を入れることにより、コード内で改行することができます。
これは、VBAの文法上は改行を入れる必要はありません。以下のように記述しても良いのです。
' ファイル選択ダイアログを表示し、選択されたファイルのパスを変数 fp に代入
fp = Application.GetOpenFilename("エクセル, *.xlsx;*xlsm, CSV, *.csv", 1, "開くファイルを選択してください", False)これでも良いのですが、()内の引数の部分が、コンマやピリオド、セミコロンなどが入り組んでおり、一見して構文が読み取りづらいです。
そこで、本稿では可読性を上げるために以下のように改行を入れました。
' ファイル選択ダイアログを表示し、選択されたファイルのパスを変数 fp に代入
fp = Application.GetOpenFilename( _
第1引数, _
第2引数, _
第3引数, _
第4引数 _
)いかがでしょうか。コードの書き方は個人の好みが反映されることもありますが、このような工夫を凝らすことで可読性と保守性が向上します。これは後任の方がコードの改修や保守を行う際にも、非常に役立つでしょう。

ご覧いただきありがとうございました!
VBAスキルアップの参考情報
近年は、ChatGPTをはじめとするAIの登場によって、学習のスタイルが大きく変わりました。
分からないことがあれば、AIに尋ねれば答えがすぐに見つかる時代です。
とはいえ、AIを使いこなすには、自分自身の基本的な知識や理解力が欠かせません。
全体像をつかむためには、やはり書籍などで体系的に学んでおくことが今でも有効です。
そのうえでAIを活用すれば、自分の理解度に合わせた的確な解説や、応用のヒントを得ることができます。
「学んで基礎を築く → AIで補い発展させる」──このサイクルを重ねることで、VBAスキルは着実に高まっていくでしょう。
VBAのスキルアップ
VBAを学び始めるなら
入門書は、どれを選んでも大きな差はないように感じます。
どれを選ぶかに悩むことに時間をかけるよりも、まずは手頃な一冊を手に取って進めてみるのがおすすめです。
もし迷ったときには、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
基礎を超えて力をつけたいなら
私は上級者を目指していましたので、入門書にとどまらず、このような内容の濃い一冊を選んで学んでいました。
今は誰でもAIを活用できる時代になりましたが、上級者を目指す方にとっては、AIをより上手に活用するという意味でも、こうした本は今なお価値があります。
このレベルの本を一冊持っておくことに、損はないでしょう。
資格で能力を証明したいなら
VBAのプログラミング能力を客観的に示したい場合には「VBAエキスパート試験」があります。
特に「スタンダード」の方は上級者向けです。
あなたが社内業務の改善を行う立場であっても、VBAで作成したシステムをお客様に納める立場であっても、この資格は信頼や安心につながるでしょう。
以下の公式テキストが販売されています。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。
これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
今はAIにコードを尋ねれば、答えが返ってくる時代です。
しかし、この本からは「コード」以上に、プログラミングに向き合う姿勢や考え方を学ぶことができるでしょう。
こちらの記事でも紹介しています。もしよろしければご覧ください。
【初心者歓迎】無料相談受付中

いつもありがとうございます!
限られた時間をより良く使い、日本の生産性を高めたい──
みんなの実用学を運営するソフトデザイン工房では、業務整理や業務改善アプリケーション作成のご相談を承っております。
お気軽にご相談ください。
こちらの記事でも紹介しております。
おわりに


ご覧いただきありがとうございました!
この記事では、「ファイル操作」の中の「ユーザーに開くファイル(ワークブック)を選択させて開く方法」を解説しました。
お問い合わせやご要望がございましたら、「お問い合わせ/ご要望」フォームまたはコメント欄よりお知らせください。
この記事が皆様のお役に立てれば幸いです。
なお、当サイトでは様々な情報を発信しております。よろしければトップページもあわせてご覧ください。
この記事を書いた人
- ソフトデザイン工房|日々の業務にちょうどいい自動化を
- ■人生を追求する凡人 ■日本一安全で、気の向くままに自分の時間を過ごせる、こだわりのキャンプ場を作るのが夢 ■ソフトデザイン工房運営(個人事業者) - 業務改善アプリケーションをご提供 ■人生は時間そのもの。ひとりでも多くの人が「より良い人生にするために時間を使って欲しい」と願い、仕事のスキルの向上、余暇の充実、資産形成を追求。
最新の投稿
01|Excel VBA マクロ2026年2月8日【Excel VBA 再利用コード集】シフト表作成の基礎となる割当ロジック(辞書+配列)
01|Excel VBA マクロ2026年2月8日【Excel VBA 再利用コード集】ネストした辞書(Dictionary in Dictionary)を作成する
01|Excel VBA マクロ2026年2月7日【Excel VBA 開発用コード集】Excelにオリジナルのリボンを追加する方法
01|Excel VBA マクロ2026年2月6日【Excel VBA 再利用コード集】シートのデータを配列に格納する&取得した配列のサイズを確認(Debug.Print)する

