Excel VBA ダイアログボックスで指定したファイルを読み込む

ExcelVBA-基礎編

今回はダイアログを開いて指定されたファイルを読み込む方法をご説明します。

別のファイルに入力されているデータを転記するのではなく、シートをそのままコピーします。

他のファイルを集計する際などに、別ファイルを操作するよりもVBAが書かれたファイルのみで操作が出来るため、コードが簡素になります。

ダイアログを開いて指定されたファイルを開く方法は「ダイアログでファイルを指定してファイルを開く」をご覧ください。

その他のファイルを読み込む方法は次の記事をご覧ください。

1.ダイアログボックスの表示

ダイアログボックスを表示させるには、Applicationオブジェクトの「GetOpenFilename」を使用します。

「GetOpenFilename」は引数は以下の通りです。

GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)

Sub Sample1()

    Dim FileName As String
    
    FileName = Application.GetOpenFilename("Excelブック,*.xlsx")
    
    Workbooks.Open FileName
    
End Sub

2.表示するファイルの種類(拡張子)を指定する

ダイアログボックスに表示するファイルの種類(拡張子)を指定する方法です。

種類(拡張子)とはExcelだと「.xls」、「.xlsx」、CSVだと「.csv」、テキストだと「.txt」のようにファイルの形式を識別した文字列の事です。

FileFilter:=”任意のファイルの種類の文字列,*.拡張子”」と書きます。

引数名の「FileFilter:=」は省略できます。

Excelを指定する場合は次のように書きます。

GetOpenFilename(“Excelブック,*.xls?”)」となり、Excelの部分は任意で指定できます。

末尾の「?」はワイルドカードで「.xls/.xlsx/.xlsm」などが表示されます。

注意点が「”任意のファイルの種類の文字列,*.拡張子”」をまとめて””で括ります

省略した場合は引数一覧にもありますように「すべてのファイル」が規定値となります。

Sub Sample2()

    Dim FileName As Variant
    
    FileName = Application.GetOpenFilename("Excelブック,*.xlsx,Excelマクロ,*.xlsm,テキスト,*.txt")
    
    Workbooks.Open FileName
    
End Sub

4.キャンセル処理

GetOpenFilename」メソッドで開いたダイアログボックスをファイルを選択せず「×」で閉じたり、キャンセルを押した場合、処理を組み込んでいないとエラーになります。

GetOpenFilenameメソッドはキャンセルや閉じられた場合は「False」を返します。

ですので、False判定で処理を分岐できます。

Sub Sample3()

    Dim FileName As Variant
    
    FileName = Application.GetOpenFilename("Excelブック,*.xlsx,Excelマクロ,*.xlsm,テキスト,*.txt")
    
    If FileName <> "False" Then
    
        Workbooks.Open FileName
        
    End If
    
End Sub

5.ダイアログで指定したファイルを読み込む

ダイアログを表示して、指定されたパスから「FileName = Dir(FilePass)」でファイル名を取得します。

Worksheets(1).Copy」で指定されたファイルをVBAが書かれたファイルに読み込みます。

Workbooks(FileName).Close savechanges:=False」で読み込むために開いたファイルを閉じます。

ActiveSheet.Name = “データ”」は任意ですが、読み込んだシートのシート名を変更します。

また、「Worksheets(1).Copy」のWorksheets(1)をWorksheetsに変更する事で、全てのシートを読み込むことが出来ます。

Sub Sample4()

    Dim FilePass    As Variant
    Dim FileName    As String
    Dim ShCount     As Long

    ShCount = ThisWorkbook.Worksheets.Count 'VBAの書かれたファイルのシート数
    
    'ダイアログを開いてファイルを指定
    FilePass = Application.GetOpenFilename("Excelブック,*.xlsx,Excelマクロ,*.xlsm,テキスト,*.txt")
    
    If FilePass <> "False" Then
    
        FileName = Dir(FilePass) 'ファイル名を取得
    
        Workbooks.Open FilePass 'ファイルを開く
        
        Worksheets(1).Copy after:=ThisWorkbook.Worksheets(ShCount) '一番最後に追加
    
        Workbooks(FileName).Close savechanges:=False
        
        ActiveSheet.Name = "データ" '読み込んだシート名を変更する
        
    End If
    
End Sub
タイトルとURLをコピーしました