基礎から学ぶVBAプログラミング教室

もりさんのお題を解きながら楽しく勉強しよう

スポンサーリンク

【ExcelVBA】処理対象のファイルをダイアログボックスで指定して開きたい(自由に選択したい)

f:id:excel-accounting:20180501170952p:plain:w400


Excel手作業をマクロ化したい!でも、処理対象のExcelブックにマクロは含ませたくない!ってことありますよね。


私が実際に経験した例では、

最終成果物のExcelブックが「社内規定で定められているドキュメント」なので、少しでも変更をする場合は管理部署の承認を得る必要がありました。

マクロ化するために更新手続きの申請書を書いて承認を得るなんて面倒くさいので、処理対象のブックとは別に新たにマクロを作っちゃいました。

【イメージ】

f:id:excel-accounting:20180823150050p:plain:w450

それ以外にも、

「上司からマクロを禁止された。最終成果物のExcelブックにマクロを含ませたら拡張子が変わってバレちゃうからこっそり使いたい…」

なんて人も、この「ダイアログボックス」を使いましょう!

1ファイルのみ選択可能にする場合

Sub FILE_OPEN()

    Dim OpenFileName As String
    OpenFileName = Application.GetOpenFilename _
        (FileFilter:="Microsoft Excelブック,*.xls*", MultiSelect:=False)

    If OpenFileName <> "False" Then 'ファイルが選択されたら
        Workbooks.Open FileName:=OpenFileName
    Else
        MsgBox "キャンセルしました。"
        End '★★★これ重要★★★
    End If
    
End Sub

Workbooks.Openメソッドの引数は色々ありますが、ここでは省略しています。

このマクロを実行すると、下記のようなダイアログボックスが出現します。

「どのパスのどのファイルに対して処理を行うか」をユーザが自由に選択できます。
f:id:excel-accounting:20180301212855p:plain


さて、ここで重要なのが、If文のEndです。

このFILE_OPENが一つの部品で、メインプロシージャから呼ばれるケースを考えてみましょう。

【解説】Exit Sub End の違い

Exit Sub
→FILE_OPENプロシージャは強制終了するが、呼び出し元プロシージャに処理が戻る。

End
→FILE_OPENプロシージャは強制終了し、呼び出し元にも処理が戻らない。その時点でマクロの実行が終了する。

Exit Subの場合、
メインプロシージャを実行してFILE_OPENでダイアログが出現したものの、

「あっ、違った」「やっぱりや~めた」

と思ってキャンセルボタンを押しても、メインプロシージャに処理が戻ってしまうんですね。

処理対象のファイルがないので当然エラーになります。

1つのプロシージャで完結するマクロであればどちらでも同じですが、複数プロシージャにまたがる場合は意味を理解したうえで使い分けると便利です。

複数ファイルを選択可能にする場合

【イメージ】

f:id:excel-accounting:20180823150036p:plain:w450

MultiSelect:=Trueで複数ファイルを選択できるようにします。

Sub FILE_OPEN2()

    Dim OpenFileName As Variant
    OpenFileName = Application.GetOpenFilename _
        ("Microsoft Excelブック,*.xls*", MultiSelect:=True)
    If Not IsArray(OpenFileName) Then
        MsgBox "キャンセルしました。"
        Exit Sub
    End If

    Dim n As Integer '選択したファイル数
    Dim wb As Workbook '選択したファイルを格納するオブジェクト
    
    '選択したブックの数、処理を繰り返す
    For n = LBound(OpenFileName) To UBound(OpenFileName)
    
        Set wb = Workbooks.Open(OpenFileName(n)) 'ファイルオープン
        
        '~~~ここに処理内容を記述~~~
        '~~~ファイルクローズ処理も~~~

        Set wb = Nothing 'いったん解放
    
    Next n

End Sub

Ctrlキー、Shiftキーを使用して複数ファイルが選択可能になります。
f:id:excel-accounting:20180301213556p:plain

Variant型の変数(OpenFileName)に、選択されたファイル名を配列として格納し、 LBoundとUBoundで1つずつ取り出してFor文処理しています。


複数のブックに対して同じ処理を行いたいときに便利なワザです!

ぜひお持ちの知識と組み合わせて使ってみてくださいね


オフィスワーク効率化のネタ厳選集もご覧ください!
www.excel-prog.com

スポンサーリンク