ゆんの業務改善ブログ

①生産性向上 ②業務改善 ③自動化 について情報発信しています。VBAプログラムは本当の初心者から他のアプリケーションを呼び出して使う上級者的な使い方まで幅広いレベルで解説していきます。

VBA GetOpenFilenameメソッドの使い方

VBA自動化ツールを開発するときに使い勝手の良いユーザーにファイルを選択してもらうGetOpenFilenameメソッドについて解説します。

目次

GetOpenFilenameメソッドでファイルをユーザーに選択させる

操作するファイルの対象をユーザーに選択させるファイル選択ダイアログボックスを表示するGetOpenFilenameメソッドを解説します。GetOpenFilenameと言ってもこのメソッドはダイアログボックスを開いてユーザーが選択したファイルのフルパスを取得するのみで開くところまで自動で行うわけではありません。次項から解説していきます。

単にファイルを開く方法の復習

まず、ファイルを開く方法について復習しておきます。エクセルブックを開くにはWorkbooksクラスのOpenメソッドを使います。サンプルコードは以下の通りです。

Sub ファイルを開く例()

    Workbooks.Open Filename:="..." ' エクセルブックの場合
    
End Sub

上のサンプルで"..."に当たる部分を取得するのがGetOpenFilenameメソッドの目的です。"..."の部分はフォルダのパスとファイル名を結合したいわゆるフルパスと呼ばれる文字列が入ります。

GetOpenFilenameメソッドの文法

GetOpenFilenameメソッドの文法は以下のようになっています。

大事なのは第一引数だけ
GetOpenFilenameメソッドの文法

ファイルのフルパスを代入する為の変数を用意しておき、GetOpenFilenameメソッドで取得したフルパスを代入するようにしておきます。GetOpenFilenameメソッドにおいて知っておくべきは第1引数と第3引数だけです。他の引数を覚える必要はありません。第1引数だけは大事なので良く覚えておきましょう。

なお、引数は【ひきすう】と読み、渡す値という意味です。GetOpenFilenameメソッドにおいては第1引数にFileFilterとして文字列を引数にとり、第3引数にTitleとして文字列を引数にとる、と言う言い方をします。

GetOpenFilenameメソッドの2つの引数|FileFilterとTitle

前項で説明したようにGetOpenFilenameメソッドでは第1引数のFileFilterと第3引数のTitleが重要です。順に解説します。

第1引数FileFilter

第1引数のFileFileterは文字通りユーザーがファイルを選択する際にフィルタをかける機能です。ユーザーが選択できる拡張子を限定して、予期せぬファイルが選択される確率を減らす事ができます。書式は以下のようにします。

データの説明と拡張子にアスタリスクを付けたものをカンマ区切りで記述する
GetOpenFilenameメソッドの第1引数の書式

慣れない記述なので気合で覚えてしまいましょう。まず、文字列で指定するので””(ダブルクォーテーション)が囲みます。そしてその中身はファイルの種類の説明, *.xlsxの様にファイルの種類の説明と拡張子の先頭にアスタリスクを付けたものをカンマ区切りにします。サンプルコードを掲載すると以下のようになります。

Sub1引数しかない例()
    
    Dim フルパス As String
    フルパス = Application.GetOpenFilename("元データ,*.xlsx")
    
End Sub

このプログラムを実行すると、ファイルを開くダイアログボックスが表示されます。ダイアログボックスの下の部分を見ると下図のようになっています。

”元データ,*.xlsx”という文字列を第1引数として渡した
第1引数にファイルの説明と拡張子を指定した例

開く、キャンセルの2つのボタンの上に元データ(*.xlsx)と表示されています。ここの部分が第1引数で指定した部分です。「元データ」の部分は「売上データ」なり「商品マスタ」なりユーザーにとってわかりやすい実際のデータの種類を書けばOKです。

また、第1引数はダブルクォーテーション内に【ファイルの説明,*.拡張子】の組み合わせをカンマ区切りで複数記述することによって、複数の拡張子を指定することも可能です。

Sub 複数種類の拡張子の例()
    
    Dim フルパス As String
    フルパス = Application.GetOpenFilename("元データ,*.xlsx,古い元データ,*.xls")
    
End Sub

このプログラムを実行するとファイルを開くダイアログボックスが表示されます。その下の部分に着目すると以下のようになっています。

複数のファイルの種類と拡張子の組み合わせが表示された
ファイルの説明,*.拡張子 の組み合わせを2つ記述した例

あくまで第1引数全体が一つの文字列なので"元データ,*.xlsx,古い元データ,*.xls"の様になります。間違いやすいので注意しましょう。覚え方は第1引数には【ファイルの説明,*.拡張子】の組み合わせを書く。【ファイルの説明,*.拡張子】の組み合わせを複数書くこともできる、と言う具合です。

さらに、拡張子の部分にアスタリスクを使うこともできます。

Sub 複数種類の拡張子の例2()
    
    Dim フルパス As String
    フルパス = Application.GetOpenFilename("元データ,*.xls*")
    
End Sub

このプログラムで表示されたファイルを開くダイアログボックスには.xlsファイル、.xlsxファイル、.xlsxファイルのいずれもが表示されます。

第3引数Title

第3引数Titleは表示されるダイアログボックスの上部に表示させるメッセージを指定します。省略可能で、省略すると、【ファイルを開く】という文字列が表示されます。

第3引数を省略すると【ファイルを開く】と表示される
ダイアログボックス上部

Sub3引数を指定するサンプル()

    Dim フルパス As String
    フルパス = Application.GetOpenFilename("元データ,*.xlsx", , "元データを選択してください", , True)
    
End Sub

このプログラムを実行すると上部のタイトル部分に【元データを選択してください】と表示されたダイアログボックスが表示されます。

第3引数で与えた文字列が表示されている
タイトル部分に指定した文字列が表示されたダイアログボックス

キャンセルが押された場合の対応

ファイルを開くダイアログボックスの右下にはキャンセルボタンも用意されています。このボタンを押すとGetOpenFilenameメソッドはFalseを返します。

フルパスが”False”と言うことはあり得ないため、これを開こうとするとそんなファイルありません、と言うエラーになります。そこで、キャンセルを押されたときの対策をすることが必要です。

Sub 適切にエラーを処理するサンプル()

    Dim フルパス As String
    フルパス = Application.GetOpenFilename("元データ,*.xlsx", , "元データを選択してください", , True)
    
    If フルパス = "False" Then
        MsgBox "処理を中断しました"
        End
    End If
    
End Sub

Falseは本来は特殊な値ですが、VBAでは文字列として取り扱うこともできるため、上のようなサンプルコードでトラップすることができます。

GetOpenFilenameメソッドでファイルをユーザーに選択させるまとめ

この記事の内容をまとめます。

  • GetOpenFilenameメソッドはフルパスを取得するだけでファイルを開くわけではない
  • GetOpenFilenameメソッドは第1引数と第3引数だけ覚えておけばほとんどの場合は事足りる
  • 第1引数はファイルの説明と拡張子をセットにした【ファイルの説明,*.拡張子】と言う書式で書く
  • 第1引数は【ファイルの説明,*.拡張子】のセットを複数書くこともできる
  • 【ファイルの説明,*.拡張子】のセットを複数書く場合でも、ダブルクォーテーションは全体を囲む
  • 第3引数はダイアログボックスのタイトルを指定する
  • 「キャンセル」を押されたときはFalseが変えるので適切に処理を行う必要がある

<関連記事>


<お知らせ>
Excel VBAでクラスやオブジェクトの概念と使い方を丁寧に解説し、ワンランク上の実力を目指すガイドが電子書籍になりました。この本で本物の実力を身に付けて一皮むけてみませんか?
books.rakuten.co.jp