Excel でマクロ(VBA)を使って、選択したファイルを開きたい場合があります。
CSV ファイルを選択して開く方法を以前こちらの記事で紹介しました ↓
マクロを実行して CSVファイルを選択すると、CSVファイルの中身が「CSVデータ読込み」というシートの中に取り込まれるマクロです。
以下の VBA コードになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub Csv_Import() Dim A_Sheet 'Excelファイルのシート名を入れ込む変数' Dim Csv_Import_File 'Excelファイルに取り込むCSVファイルの名前を入れ込む変数' A_Sheet = ActiveSheet.Name '現在アクティブなシート名を変数 A_Sheet に入れ込む' Csv_Import_File = Application.GetOpenFilename("CSVファイル,*.csv") 'CSVファイルを選択する' If Csv_Import_File = "False" Then Exit Sub 'キャンセルなら終了' ThisWorkbook.Sheets("CSVデータ取込み").Range("A1:ZZ100000").ClearContents '「CSVデータ取込み」シートのセル「A1~ZZ100000」をクリアする' With Workbooks.Open(Csv_Import_File) .Sheets(1).Cells.Copy ThisWorkbook.Sheets("CSVデータ取込み").Range("A1") '全てのデータをこのブックの「CSVデータ取込み」シートにコピー' .Close 'CSVファイルを閉じる' End With Worksheets(A_Sheet).Activate 'A_Sheet という名前のシートをアクティブにする' End Sub |
マクロを実行するとウインドウが出てくるので、ここで開きたい CSV ファイルを選択します。
すると、CSVファイルの中身が「CSVデータ読込み」というシートの中に取り込まれます。
さて、CSV ファイルを選択して開くために Application オブジェクトの GetOpenFilename メソッドを使いますが、
毎回マクロを実行する毎に異なるフォルダが開かれることが欠点です。
*なお1回マクロを実行してファイルを選択したすぐ後に、もう一度同じマクロを実行すれば同じフォルダが開かれます。開かれるフォルダの法則はよく分かりません。
このような状況であるため、例えば毎回同じフォルダ内の違うファイルを選択したい場合などにファイル選択の作業が面倒です。
今日はこの問題を解決して、効率よくファイルを選択できるようにするため GetOpenFilename メソッドを使った以下の方法についてお話しします。
●毎回同じフォルダを開く方法
●前回取り込んだファイルと同じフォルダを開く方法
についてお話しします。
1、GetOpenFilename メソッドを使って毎回同じフォルダを開く方法
CSV ファイルを選択する際に、開かれるフォルダを毎回同じにしたいと思います。
①ローカルフォルダを開く場合
②ネットワークフォルダを開く場合
の両方についてお話しします。
①②とも GetOpenFilename メソッドを使う前にフォルダを指定することになります。
①ローカルフォルダを開く場合
全 VBA コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub Csv_Import() Dim A_Sheet 'Excelファイルのシート名を入れ込む変数' Dim Csv_Import_File 'Excelファイルに取り込むCSVファイルの名前を入れ込む変数' ChDir "C:\Users\aaa\Dropbox\月別データ" A_Sheet = ActiveSheet.Name '現在アクティブなシート名を変数 A_Sheet に入れ込む' Csv_Import_File = Application.GetOpenFilename("CSVファイル,*.csv") 'CSVファイルを選択する' If Csv_Import_File = "False" Then Exit Sub 'キャンセルなら終了' ThisWorkbook.Sheets("CSVデータ取込み").Range("A1:ZZ100000").ClearContents '「CSVデータ取込み」シートのセル「A1~ZZ100000」をクリアする' With Workbooks.Open(Csv_Import_File) .Sheets(1).Cells.Copy ThisWorkbook.Sheets("CSVデータ取込み").Range("A1") '全てのデータをこのブックの「CSVデータ取込み」シートにコピー' .Close 'CSVファイルを閉じる' End With Worksheets(A_Sheet).Activate 'A_Sheet という名前のシートをアクティブにする' End Sub |
コード説明
コード全体の説明は以前に書いたこちらの記事を参考にして頂ければと思います。
今回のポイントは追加で加えた6行目の ChDir ステートメントです。
これは現在のドライブの既定のフォルダを変更するためのものです(変更先のフォルダはローカルフォルダ)。
次のように記述して使います。
フォルダパスは “” で囲うことを忘れないようにしましょう。
今回は、ある PC の「ドロップボックス」の「月別データ」というフォルダを指定しています。
1 |
ChDir "C:\Users\aaa\Dropbox\月別データ" |
このフォルダパスの部分 ↑ を変更して使ってみて下さい。
②ネットワークフォルダを開く場合
さて次にネットワークフォルダを開く場合についてお話しします。
この場合、先のローカルフォルダのように ChDir ステートメントではうまく行きません。
全 VBA コードを以下に示します。
全 VBA コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Private Declare PtrSafe Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long Sub Csv_Import2() Dim A_Sheet 'Excelファイルのシート名を入れ込む変数' Dim Csv_Import_File 'Excelファイルに取り込むCSVファイルの名前を入れ込む変数' Call SetCurrentDirectory("\\bbb\月別データ") A_Sheet = ActiveSheet.Name '現在アクティブなシート名を変数 A_Sheet に入れ込む' Csv_Import_File = Application.GetOpenFilename("CSVファイル,*.csv") 'CSVファイルを選択する' If Csv_Import_File = "False" Then Exit Sub 'キャンセルなら終了' ThisWorkbook.Sheets("CSVデータ取込み").Range("A1:ZZ100000").ClearContents '「CSVデータ取込み」シートのセル「A1~ZZ100000」をクリアする' With Workbooks.Open(Csv_Import_File) .Sheets(1).Cells.Copy ThisWorkbook.Sheets("CSVデータ取込み").Range("A1") '全てのデータをこのブックの「CSVデータ取込み」シートにコピー' .Close 'CSVファイルを閉じる' End With Worksheets(A_Sheet).Activate 'A_Sheet という名前のシートをアクティブにする' End Sub |
コード説明
今回のポイントは Win32 API の SetCurrentDirectory 関数を使っているところです。
これは既定のフォルダをネットワークフォルダに変更するためのものです。
この関数を使うためには、宣言セクション(標準モジュールの一番上)に以下の記述が必要になります。
コピペして下さい。呪文みたいなものです。
1 |
Private Declare PtrSafe Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long |
7行目の SetCurrentDirectory 関数は以下のように記述して使います。
ネットワークフォルダパスは “” で囲うことを忘れないようにしましょう。
パスは「\\」から始まるものになります。
1 |
Call SetCurrentDirectory("\\bbb\月別データ") |
この部分 ↑ のネットワークフォルダパスを変更して使ってみて下さい。
2、GetOpenFilename メソッドを使って前回取り込んだファイルと同じフォルダを開く方法
次に前回開いたのと同じフォルダを開く方法についてお話しします。
ある工夫をすることでそれが可能になります。
なお、ローカルフォルダを開く場合もネットワークフォルダを開く場合もやることは変わらないので、ローカルフォルダの場合のみをお話ししておきますね。
次のシートは黄色の「CSVデータ取込み」ボタンを押すと、マクロが実行して取り込みたい CSVファイルを選択できるものとします。
そして、選択した CSV ファイルのパスをセル「A1」に入れておくようにしています。
次にまたこのシートを使うときには、セル「A1」に入れてあるファイルのパスと同じフォルダを開くようにしています。
つまり、マクロを実行すると、常に前回読み込んだファイルが入っていたフォルダを開くようになっているということです。
VBA コードを以下に示します。
全 VBA コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Sub Csv_Import3() Dim A_Sheet 'Excelファイルのシート名を入れ込む変数' Dim Csv_Import_File 'Excelファイルに取り込むCSVファイルの名前を入れ込む変数' Dim a 'フォルダパスの特定の文字が文字列の左から何番目か' a = InStrRev(Range("A1").Value, "\") '文字列の最後からカウントして最初の\が、先頭から数えて何番目にあるか' FilePath = Left(Range("A1"), a) ChDir FilePath A_Sheet = ActiveSheet.Name '現在アクティブなシート名を変数 A_Sheet に入れ込む' Csv_Import_File = Application.GetOpenFilename("CSVファイル,*.csv") 'CSVファイルを選択する' If Csv_Import_File = "False" Then Exit Sub 'キャンセルなら終了' Range("A1") = Csv_Import_File 'セルA1 に取り込んだ CSV ファイルのパスを入れる' ThisWorkbook.Sheets("CSVデータ取込み").Range("A1:ZZ100000").ClearContents '「CSVデータ取込み」シートのセル「A1~ZZ100000」をクリアする' With Workbooks.Open(Csv_Import_File) .Sheets(1).Cells.Copy ThisWorkbook.Sheets("CSVデータ取込み").Range("A1") '全てのデータをこのブックの「CSVデータ取込み」シートにコピー' .Close 'CSVファイルを閉じる' End With Worksheets(A_Sheet).Activate 'A_Sheet という名前のシートをアクティブにする' End Sub |
コード説明
ChDir ステートメントについては先に説明したとおりです。
InStrRev 関数
さて、前回選択したファイルのパスをセル「A1」に入れてあるので、それと同じフォルダを開きたいわけです。
セル「A1」に入れてあるファイルのパスが以下だった場合
C:\Users\aaa\Dropbox\ブログ\190519 Excel VBA(マクロ)でファイルを選択するために前と同じフォルダを開く方法\171211 CSVファイル取込み
上記パスの中の
C:\Users\aaa\Dropbox\ブログ\190519 Excel VBA(マクロ)でファイルを選択するために前と同じフォルダを開く方法
までがフォルダのパスになるわけです。
ファイル名の部分を上手く取り除く必要があるわけです。
そのために InStrRev 関数を使っています。
InStrRev 関数は、以下のように記述して使います。
これは文字列1 を後方から数えてはじめて出てくる文字列2の位置を把握するための関数です。
把握する位置は、文字列1を最初から数えた位置(最初から何番目か)になります。
今回は
1 |
InStrRev(Range("A1").Value, "\") |
と記述することで
「Range(“A1”).Value」を後方から数えてはじめて出てくる「\」の位置(下の太赤字の位置)を取得しています。
C:\Users\aaa\Dropbox\ブログ\190519 Excel VBA(マクロ)でファイルを選択するために前と同じフォルダを開く方法\171211 CSVファイル取込み
1 |
a = InStrRev(Range("A1").Value, "\") |
とすることで、取得した位置を変数「a」に入れ込んでいます。
Left 関数
Left 関数は 以下のように記述して使います
「文字列」を左から「文字数」分だけ取り出します。
例えば、
Left(“abcde”, 3)
とすれば「abcde」を左から3文字分「abc」を取り出すことになります。
1 |
FilePath = Left(Range("A1"), a) |
とすることで、Range(“A1”) を左から a文字分取り出して、変数「FilePath」に入れています。
これで、ファイルのフォルダパスを取得しました。
18行目の
1 |
Range("A1") = Csv_Import_File |
によって、セルA1 に取り込んだ CSV ファイルのパスを入れています(次にこのマクロを実行するときに、同じフォルダを開けるようにするため)。
3、まとめ
Excel VBA(マクロ)で指定したフォルダからファイルを選択して開く方法についてお話しさせて頂きました。
ファイルを選択して使うことはありますが、フォルダを指定した方が効率が良い場合が多いです。
参考にして頂ければと思います。
編集後記
週末はぎっくり腰の回復のため、基本的には安静にしていました。