スポンサーリンク

Excel VBA(マクロ)で指定したフォルダからファイルを選択して開く方法


Excel でマクロ(VBA)を使って、選択したファイルを開きたい場合があります。

CSV ファイルを選択して開く方法を以前こちらの記事で紹介しました ↓

マクロを実行して CSVファイルを選択すると、CSVファイルの中身が「CSVデータ読込み」というシートの中に取り込まれるマクロです。

以下の VBA コードになります。

マクロを実行するとウインドウが出てくるので、ここで開きたい CSV ファイルを選択します。

ファイル選択

すると、CSVファイルの中身が「CSVデータ読込み」というシートの中に取り込まれます。

CSVデータ読込み

さて、CSV ファイルを選択して開くために Application オブジェクトの GetOpenFilename メソッドを使いますが、

毎回マクロを実行する毎に異なるフォルダが開かれることが欠点です。

異なるフォルダが開かれる

*なお1回マクロを実行してファイルを選択したすぐ後に、もう一度同じマクロを実行すれば同じフォルダが開かれます。開かれるフォルダの法則はよく分かりません。

このような状況であるため、例えば毎回同じフォルダ内の違うファイルを選択したい場合などにファイル選択の作業が面倒です。

毎回同じフォルダを開きたい

今日はこの問題を解決して、効率よくファイルを選択できるようにするため GetOpenFilename メソッドを使った以下の方法についてお話しします。

毎回同じフォルダを開く方法
前回取り込んだファイルと同じフォルダを開く方法

についてお話しします。

スポンサーリンク

1、GetOpenFilename メソッドを使って毎回同じフォルダを開く方法

CSV ファイルを選択する際に、開かれるフォルダを毎回同じにしたいと思います。

①ローカルフォルダを開く場合
②ネットワークフォルダを開く場合

の両方についてお話しします。

①②とも GetOpenFilename メソッドを使う前にフォルダを指定することになります。

①ローカルフォルダを開く場合

全 VBA コード

コード説明

コード全体の説明は以前に書いたこちらの記事を参考にして頂ければと思います。

今回のポイントは追加で加えた6行目の ChDir ステートメントです。

これは現在のドライブの既定のフォルダを変更するためのものです(変更先のフォルダはローカルフォルダ)。

次のように記述して使います。

ChDir フォルダパス

フォルダパスは “” で囲うことを忘れないようにしましょう。

今回は、ある PC の「ドロップボックス」の「月別データ」というフォルダを指定しています。

このフォルダパスの部分 ↑ を変更して使ってみて下さい。

②ネットワークフォルダを開く場合

さて次にネットワークフォルダを開く場合についてお話しします。

この場合、先のローカルフォルダのように ChDir ステートメントではうまく行きません。

全 VBA コードを以下に示します。

全 VBA コード

コード説明

今回のポイントは Win32 API の SetCurrentDirectory 関数を使っているところです。

これは既定のフォルダをネットワークフォルダに変更するためのものです。

この関数を使うためには、宣言セクション(標準モジュールの一番上)に以下の記述が必要になります。

コピペして下さい。呪文みたいなものです。

7行目の SetCurrentDirectory 関数は以下のように記述して使います。

Call SetCurrentDirectory(ネットワークフォルダパス)

ネットワークフォルダパスは “” で囲うことを忘れないようにしましょう。

パスは「\\」から始まるものになります。

この部分 ↑ のネットワークフォルダパスを変更して使ってみて下さい。

2、GetOpenFilename メソッドを使って前回取り込んだファイルと同じフォルダを開く方法

次に前回開いたのと同じフォルダを開く方法についてお話しします。

ある工夫をすることでそれが可能になります。

なお、ローカルフォルダを開く場合もネットワークフォルダを開く場合もやることは変わらないので、ローカルフォルダの場合のみをお話ししておきますね。

次のシートは黄色の「CSVデータ取込み」ボタンを押すと、マクロが実行して取り込みたい CSVファイルを選択できるものとします。

ボタンを押す

そして、選択した CSV ファイルのパスをセル「A1」に入れておくようにしています。

セルにファイルのパスを入れる

次にまたこのシートを使うときには、セル「A1」に入れてあるファイルのパスと同じフォルダを開くようにしています。

つまり、マクロを実行すると、常に前回読み込んだファイルが入っていたフォルダを開くようになっているということです。

VBA コードを以下に示します。

全 VBA コード

コード説明

ChDir ステートメントについては先に説明したとおりです。

InStrRev 関数

さて、前回選択したファイルのパスをセル「A1」に入れてあるので、それと同じフォルダを開きたいわけです。

セル「A1」に入れてあるファイルのパスが以下だった場合

C:\Users\aaa\Dropbox\ブログ\190519 Excel VBA(マクロ)でファイルを選択するために前と同じフォルダを開く方法\171211 CSVファイル取込み

上記パスの中の

C:\Users\aaa\Dropbox\ブログ\190519 Excel VBA(マクロ)でファイルを選択するために前と同じフォルダを開く方法

までがフォルダのパスになるわけです。

ファイル名の部分を上手く取り除く必要があるわけです。

そのために InStrRev 関数を使っています。

InStrRev 関数は、以下のように記述して使います。

InStrRev(文字列1, 文字列2)

これは文字列1 を後方から数えてはじめて出てくる文字列2の位置を把握するための関数です。

把握する位置は、文字列1を最初から数えた位置(最初から何番目か)になります。

今回は

と記述することで

「Range(“A1”).Value」を後方から数えてはじめて出てくる「\」の位置(下の太赤字の位置)を取得しています。

C:\Users\aaa\Dropbox\ブログ\190519 Excel VBA(マクロ)でファイルを選択するために前と同じフォルダを開く方法\171211 CSVファイル取込み

とすることで、取得した位置を変数「a」に入れ込んでいます。

Left 関数

Left 関数は 以下のように記述して使います

Left(文字列, 文字数)

「文字列」を左から「文字数」分だけ取り出します。

例えば、

Left(“abcde”, 3)

とすれば「abcde」を左から3文字分「abc」を取り出すことになります。

とすることで、Range(“A1”) を左から a文字分取り出して、変数「FilePath」に入れています。

これで、ファイルのフォルダパスを取得しました。

18行目の

によって、セルA1 に取り込んだ CSV ファイルのパスを入れています(次にこのマクロを実行するときに、同じフォルダを開けるようにするため)。

3、まとめ

Excel VBA(マクロ)で指定したフォルダからファイルを選択して開く方法についてお話しさせて頂きました。

ファイルを選択して使うことはありますが、フォルダを指定した方が効率が良い場合が多いです。

参考にして頂ければと思います。

編集後記

週末はぎっくり腰の回復のため、基本的には安静にしていました。