VBA

【VBA初心者:とりあえずこれさえできれば、実務OK】GetOpenFilenameメソッドを使ってエクセルブックをダイアログを使って開く方法

記事内に商品プロモーションを含む場合があります

このページでわかること

GetOpenFilenameを簡単に使う方法とそれを使ってエクセルを開く方法がわかります。

覚えること
  1. ダイアログを開くには、Application.GetOpenFilename
  2. Application.GetOpenFilenameは戻り値がパス名+ファイル名
    なので、そのままWorkbooks.Openの引数にすればエクセルを開ける。
  3. 引数は最初は覚えなくてよい。
  4. カレントフォルダの変更にはChdirとChdriveを使う。

こんにちは、hokkyokunです。
マクロを動かすとき、開くブックを確認して選びたい場面て多いと思います。

でもファイル操作全般に言えることですが、
分かりづらく、解説している本やサイトも少ないんですよね。

ファイル操作するためには、
GetOpenFilenameメソッドを使いましょう。
とりあえずこれさえ出来れば、目で見てファイルを選んで操作できるって方法を解説しました。

とりあえずこれでOK

難しいことは考えなくていいです。これさえ組み込めば何とかなります。

Sub ダイアログ()

'ダイアログで選択したファイルのパス名プラスファイル名を取得
Dim openFile As String
openFile = Application.GetOpenFilename

End Sub

GetOpenFilenameでパス名プラスファイル名の戻り値が得られるので、
それをそのままブックを開く引数に利用すればファイルを開くことが出来ます。

以下にダイアログを開いてブックを開くマクロをご紹介します。

Sub ダイアログからブック開く()

'ダイアログで選択したファイルのパス名プラスファイル名を取得
Dim openFile As String
openFile = Application.GetOpenFilename


Workbooks.Open fileName:=openFile

End Sub

構文

とりあえず上記で充分ですが、構文を少し見てみましょう。

構文:Application.GetOpenFilename([FileFilter],[FilterIndex],[Title],[Button Text],[MultiSelect])

Applicationは省略不可能ですので、注意してください。
GetOpenFilenameメソッドは引数は全て省略可能です。
FileFilterがちょっとややこしいので実際の図をつけてご説明します。

FileFilter
ダイアログを開いたときの右下のフィルターを指定できます。
例:
「テスト」という名目で「.xlsm」の抽出、
「テスト2」という名目で「.xlsx」の抽出を行いたい場合、

Filefilter:="テスト,.*xlsm, テスト2,.*xlsx"

その他の引数
FilterIndex:FileFilterで指定した項目のうち何番目を規定値とするか、数値で指定します。
Title:ダイアログの左上に任意の文字列を表示できます。省略すると「ファイルを開く」になります。
Button Text :Macintoshでのみ指定します。
MultiSelect:ブール型です。Trueにすると複数指定出来ます。

・・・・・いかがでしょうか?
・・これ、いります?
引数無しでも全く問題ないと思います。
確かにファイル数が多い場合はフィルターをかけたほうが検索しやすいと思いますが、
特殊な理由がない限り、フォルダを細かく分けたほうが日々の整理もつきやすいと思います。

キャンセル時の処理

使っていると分かると思いますが、
ダイアログのキャンセルボタンを押すと、コードを作っておかないとエラーが発生します。
よって、下記のコードを追加しておくとよいと思います。

このとき注意必要です!!
キャンセルボタンを押す=ブール値でFalseとなるので、

  • Application.GetOpenFilenameの戻り値を入れる変数をVariantにするか、
  • If分のFalseを”False”として文字列にしてください。

どっちでも動きますが、Variantにしたほうがスマートかもしれないですね。

Sub キャンセル時の処理Stringバージョン()
'変数をStringに指定した場合

'ダイアログで選択したファイルのパス名プラスファイル名を取得
Dim openFile As String
openFile = Application.GetOpenFilename

'キャンセルボタンを押したらプロシージャを終了させる。
If openFile = "False" Then
    Exit Sub
End If

Workbooks.Open fileName:=openFile

End Sub
Sub キャンセル時の処理Variantバージョン()
'変数をVariantに指定した場合

'ダイアログで選択したファイルのパス名プラスファイル名を取得
Dim openFile As Variant
openFile = Application.GetOpenFilename

'キャンセルボタンを押したらプロシージャを終了させる。
If openFile = False Then
    Exit Sub
End If

Workbooks.Open fileName:=openFile

End Sub

任意のフォルダをデフォルトで開く

任意のフォルダを開くためにはChdirとChdriveを使う必要があります。

コンピューターにはカレントディレクトリという概念があり、
ダイアログを開いて最初に表示されるフォルダ(ディレクトリ)のことを指します。
chdirはカレントディレクトリを変更することが出来、
chdriveはドライブを変更するときに使用できます。

例えば現在のカレントディレクトリがCドライブの場合、dドライブのフォルダを開きたい場合はchdriveでドライブを先ず変更する必要があります。

ここまででもイヤーな感じですが、ネットワークにあるフォルダを開くときはもっと大変です。。。
chdriveではネットワークドライブに変更することはできません。

このあたりoffice TANAKAさんのサイトで詳しく解説してくれてます。
そこからコードを勉強させていただきましたので、それを使いたいと思います。

ネットワークドライブに変更する方法
CreateObject("WScript.Shell").CurrentDirectory = ActiveWorkbook.Path

Sub カレントフォルダを変更_ネットワークドライブバージョン()

'ネットワークドライブに変更、CurrentDirectioryに開きたいフォルダを指定
CreateObject("WScript.Shell").CurrentDirectory = ActiveWorkbook.Path


'ダイアログで選択したファイルのパス名プラスファイル名を取得
Dim openFile As Variant
openFile = Application.GetOpenFilename

'キャンセルボタンを押したらプロシージャを終了させる。
If openFile = False Then
    Exit Sub
End If

Workbooks.Open fileName:=openFile

End Sub

まとめ

GetOpenFilenameメソッドは実はとても簡単に使えます。
ダイアログでファイルを選ぶのは賛否が分かれるところですが、
用途によってはこの方がUIが優れているので、適宜使用してください。

ただ、引数は深追いすると結構ややこしいので、
ほどほどにして、ファイルの整理などを日ごろから意識したほうが良いと思います。

カレントフォルダの変更はchDir,ChDriveを使い、
ネットワークドライブはCreateObject(“WScript.Shell”).CurrentDirectory=パス名
で指定しましょう。

ではでは。