【簡単Excelマクロ・VBA】ユーザーに開くファイル(ワークブック)を選択させて開く方法|GetOpenFilename|ファイル操作 #003
いつもありがとうございます。
ノンプログラマー向け「Excelマクロ・VBA解説シリーズ」へようこそ。
本稿では、ユーザーに開くファイル(ワークブック)を選択させて開く方法を解説いたします。
ことばの意味
- ノンプログラマー
プログラミングを主な仕事にしていない人たちのことです。 - マクロ
VBAを使って作成される「機能」のことです。 - VBA
Visusal Basic for Application の略で、プログラミング言語のことです。 - ワークブック
Excelファイルのことです。
関連記事
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
の部分ですが、コンマの左側がダイアログに表示される文字列情報、右側が拡張子の指定です。
この例tのようにエクセルと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
メソッドの具体例と解説です。
ことばの意味
- Variant型
特定のデータ型を指定せずに任意の種類のデータを格納できるデータ型です。Variantは、柔軟性の高いデータ型ですが、VBAによる自動的な型変換が意図せぬ結果となったり、メモリ使用量の増加や処理速度の低下などのパフォーマンスの低下の原因になります。そのため、Variant型の使用は必要最小限にすることが推奨されます。
【違いを生み出す工夫】デフォルトディレクトリの設定
さて、前述の内容だけでも悪くはないのですが、実際の場面ではもう一工夫あった方が喜ばれます。
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使用経験約20年
実務に使用するマクロを多数作成してきました。 - Python 3 エンジニア認定基礎試験
経済産業省が定めたガイドライン「ITスキル標準(ITSS)」に掲載されている民間資格です。
VBAプログラミングスキルアップのための参考情報
ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。
VBAプログラミングのスキルアップ
学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。
入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるよりは、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。
甲乙つけがたい場合、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
\チェックしてみよう/
\チェックしてみよう/
\チェックしてみよう/
VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
こちらの記事でも紹介しております。もしよろしければご覧ください。