スポンサーリンク

ダウンロードしたCSVや別のエクセルファイルを開くVBAコード

ファイルダイアログ作成事例

データ処理をする時に他のエクセルファイルにあるデータを取り込みたいことありませんか?

ファイル名が固定されてたり、保存場所が決まっている場合などは直接保存先のフルパスとファイル名をVBAで書き込めば可能ですが、保存場所が変わったりファイル名が分からないと実行できません。

また、ダウンロードしたCSVファイルなどはその都度ファイル名が異なります。

そこで、次のような手順でCSVファイルや他のエクセルファイルのデータを取り込みましょう。

  1. ファイルを選択するようにメッセージを出す
  2. 取り込み先エクセル VBAコードを書き込んであるエクセルファイルをを開く
  3. 取り込み先エクセル データ取り込みVBAコード記述したコマンドボタンを押す
  4. ファイルを開くダイアログを表示する
  5. 元データとなるエクセル(CSVファイル)などを選択する
  6. 元データエクセル 元データとなるエクセルファイルが開きます
  7. 元データエクセルに画面が切り替わらないように元データエクセルファイルを最小化する
  8. 元データエクセルから取り込み先エクセルに必要データ(セルの値を)繰り返し取り込む(コピーする)
  9. データ取得したら元データエクセルを閉じる
  10. データ取り込みが終了したとメッセージを表示する
スポンサーリンク

GetOpenFilenameメソッドなどを組み合わせる

一般的にエクセルファイルを開く時は、マイドキュメントなどのフォルダからエクセルファイルを選択して開きます。

その時に表示される「ファイルを開く」画面をダイアログボックスと言いますので、名前は知らなくてもよく見る画面です。

ファイルを開くダイアログボックス
ファイルを開くダイアログボックス

この作業をVBAコードで行う時は、GetOpenFilenameメソッドを使います。

そして、この一連の作業を行うには、MsgBoxやDimやLoopやIfなどを作業順に並べるだけなので簡単にVBAコードを書くことができます。

ここでは、ユーザーフォームに配置したコマンドボタン1にVBAコードを書いた例になります。

ファイルを開いてデータ取り込みをするVBA

Private Sub CommandButton1_Click()
MsgBox “元データエクセルを選択してください”
Range(“A1:C100”).ClearContents
Dim fileopen As Variant
fileopen = Application.GetOpenFilename(“Microsoft Excelブック,*.csv?”)
If fileopen <> False Then
Workbooks.Open fileopen
ActiveWindow.WindowState = xlMinimized
Dim i As Long
i = 1
Do Until Workbooks(2).Sheets(1).Cells(i, 1).Value = “”
Cells(i, 1).Value = Workbooks(2).Sheets(1).Cells(i, 1).Value
Cells(i, 2).Value = Workbooks(2).Sheets(1).Cells(i, 2).Value
Cells(i, 3).Value = Workbooks(2).Sheets(1).Cells(i, 3).Value
i = i + 1
Loop
Workbooks(2).Close
MsgBox “元データから取り込みました”
End If
End Sub

VBA解説
  1. コマンドボタン1がクリックされたら
  2. 「元データエクセルを選択してください」とメッセージを表示する
  3. A1~C100のセルに入力済み値を消去する
  4. fileopenという名の変数で様々なデータを格納する
  5. 変数fileopenは「ファイルを開く」ダイアログを表示して、エクセルブックのCSVのみを表示します
  6. もしファイルを選択しないでダイアログを閉じなかった時(ファイルを選択したら)
  7. 選択されたエクセルファイルを開く
  8. ActiveWindowのファイル(今開いた最前面のエクセル)を最小化する
  9. iという名の変数で整数を格納する
  10. 変数iは1とする
  11. 2番目に開いたエクセル(元データエクセル)の1番目のシートのセルi行目・1列目が空欄になるまで、下記作業を行う。
  12. セルi行目の1列目(セルA1)に2番目に開いたエクセル(元データエクセル)の1番目のシートのセルi行目・1列目の値を取得する
  13. セルi行目の2列目(セルB1)に2番目に開いたエクセル(元データエクセル)の1番目のシートのセルi行目・2列目の値を取得する
  14. セルi行目の3列目(セルC1)に2番目に開いたエクセル(元データエクセル)の1番目のシートのセルi行目・1列目の値を取得する
  15. 変数iはi+1
  16. 空欄が見つかるまで繰り返し処理する
  17. 2番目に開いたエクセル(元データエクセル)を閉じる
  18. 「元データから取り込みました」とメッセージを表示する
  19. Ifステートメント終了
  20. マクロ記録終了

2行目・18行目のメッセージは無くてもいいのですが、データ取り込みの作業が行われたのか?終了したのか分からないので、あえて表示させています。

8行目の開いた元データのエクセルファイルが最前面になってしまうので、最小化することで作業の邪魔にならないので入れておいた方がいいです。

ちなみに、ファイルを開くダイアログ表示だけならば、たった1行のVBAコードで完成です。

スポンサーリンク

ここで使用している VBAコード