Sub TEST1()
Dim A
'ファイル選択用のダイアログを表示
A = Application.GetOpenFilename("Excel,*.xlsx", MultiSelect:=True)
'取得したファイルパスを出力
For i = 1 To UBound(A)
Debug.Print A(i)
Next
End Sub
では、実行してみます。
こんな感じで、複数ファイルを選択することができます。
複数ファイルを選択できる
開くをクリックすると、選択した複数ファイルのファイルパスを取得できます。
複数ファイルのパスを取得できた
選択した複数ファイルのファイルパスを取得できました。
キャンセルで処理を終了する
ただ、このままのVBAコードだと、キャンセルをクリックした場合にエラーとなってしまいます。
ちょっとやってみます。
キャンセルをクリックするとエラー
キャンセルをクリックしてみます。
キャンセルを押した場合は、配列ではないのでエラーとなります。
なので、キャンセルの場合は処理を終了するVBAコードを追加してあげます。
キャンセルの場合は処理を終了する
キャンセルを押した場合は、GetOpenFilenameで取得できる値は、配列ではなくなります。
なので、「配列ではない」場合に、処理を終了させます。
Sub TEST2()
Dim A
'ファイル選択用のダイアログを表示
A = Application.GetOpenFilename("Excel,*.xlsx", MultiSelect:=True)
'キャンセルの場合処理を終了
If IsArray(A) = False Then Exit Sub
'選択したファイルパスを出力
For i = 1 To UBound(A)
Debug.Print A(i)
Next
End Sub
上記のVBAコードを追加することで、キャンセルを押した場合に処理を終了させることができます。
最初に開くフォルダを設定
最初に開くフォルダを設定してみます。
最初に開くフォルダを設定するVBAコードは、次のようになります。
Sub TEST3()
'最初に開くフォルダを指定
With CreateObject("WScript.Shell")
.CurrentDirectory = ThisWorkbook.Path
End With
Dim A
'ファイル選択用のダイアログを表示
A = Application.GetOpenFilename("Excel,*.xlsx", MultiSelect:=True)
'キャンセルの場合処理を終了
If IsArray(A) = False Then Exit Sub
'選択したファイルパスを出力
For i = 1 To UBound(A)
Debug.Print A(i)
Next
End Sub
Sub TEST4()
'最初に開くフォルダを指定
With CreateObject("WScript.Shell")
.CurrentDirectory = ThisWorkbook.Path
End With
Dim A
'ファイル選択用のダイアログを表示
A = Application.GetOpenFilename("Excel,*.xlsx", MultiSelect:=True)
'キャンセルの場合処理を終了
If IsArray(A) = False Then Exit Sub
'1つ目のブックを開く
Workbooks.Open A(1)
Dim B
'貼り付け先のセル
Set B = ThisWorkbook.Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp)
With ActiveWorkbook.Sheets(1).Range("A1").CurrentRegion
'データを取得
.Resize(.Rows.Count - 1).Offset(1, 0).Copy B.Offset(1, 1)
'ブック名を取得
B.Resize(.Rows.Count - 1).Offset(1, 0) = ActiveWorkbook.Name
End With
ActiveWorkbook.Close False 'ブックを閉じる
End Sub
では、実行してみます。
ファイル選択用ダイアログで、ファイルを選択して「開く」をクリックします。
ファイル選択用ダイアログでファイルを選択
選択したファイルの値を取得できます。
選択したファイルの値を取得できた
選択したファイルの値を取得できました。
選択した複数ファイルから値をまとめる
次は、複数ファイルを選択して、選択した複数ファイルから値をまとめてみます。
複数ファイルを選択して値を取得したい
複数ファイルを選択して、複数ファイルの値を取得してみます。
こちらのファイルの値を取得します。
現在作業しているファイルに、値をコピーします。
選択した複数ファイルをまとめるVBAコードです。
Sub TEST5()
'最初に開くフォルダを指定
With CreateObject("WScript.Shell")
.CurrentDirectory = ThisWorkbook.Path
End With
Dim A
'ファイル選択用のダイアログを表示
A = Application.GetOpenFilename("Excel,*.xlsx", MultiSelect:=True)
'キャンセルの場合処理を終了
If IsArray(A) = False Then Exit Sub
'選択したファイル分ループ
For i = 1 To UBound(A)
Workbooks.Open A(i) 'ファイルを開く
Dim B
'貼り付け先のセル
Set B = ThisWorkbook.Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp)
With ActiveWorkbook.Sheets(1).Range("A1").CurrentRegion
'データを取得
.Resize(.Rows.Count - 1).Offset(1, 0).Copy B.Offset(1, 1)
'ブック名を取得
B.Resize(.Rows.Count - 1).Offset(1, 0) = ActiveWorkbook.Name
End With
ActiveWorkbook.Close False 'ブックを閉じる
Next
End Sub