ファイルの選択/保存ダイアログボックスをカスタムする

似たようなフォルダーやファイルが並んでいて、取り違えてしまったことはありませんか?

ファイルを開く/保存する際のダイアログボックスをカスタマイズして、そのようなミスを避けやすくする方法を紹介します。例えば、通常使うフォルダーを初期表示したり、実行前にチェックして確認メッセージを表示したりできます。

ファイル保存カスタム

ここで紹介するマクロはWordでも使えます。Wordの場合は、拡張子をdocxやdocmに、ActiveWorkbookActiveDocumentに変更してください。

ファイルの選択/保存ダイアログボックスをカスタマイズ

初期フォルダーを特定してダイアログボックスを起動するマクロ

ダイアログボックス起動時の初期状態を変更する例です。

年度ごとのフォルダーに月ごとのファイルを管理している場合を想定しています。所定の場所の当年フォルダーが初期表示されます。他の年のフォルダーは意識的に選択し直すことで利用できます。

Sub カスタムオープン()
    Const pathBase As String = "D:\@報告書\"
    With Application.FileDialog(msoFileDialogOpen)
        'ダイアログボックスの初期値を設定
        .InitialFileName = pathBase & Year(Date) & "\"
        .AllowMultiSelect = True
        .Title = "月次報告書を開く"
        .Filters.Add "報告書ブック", "*.xlsx; *.xlsm", 1
        'ダイアログボックスの起動と実行
        If .Show = True Then
            .Execute
        End If
    End With
End Sub

ユーザー指定のファイル名を一部改変して保存するマクロ

ダイアログボックスでの指定内容の取得だけをして機能は実行しない例です。

ユーザーが指定したファイル名に yyyymmdd形式の日付数字を付加して保存します。タイプミスでおかしな日付が付けられたりしないようマクロで付けてしまおうというわけです。

Sub カスタム保存()

    Const pathBase As String = "D:\@報告書\"
    Dim pathSave As String
    Dim i As Long
    
    With Application.FileDialog(msoFileDialogSaveAs)
        .InitialFileName = pathBase & Year(Date) & "\" & ActiveWorkbook.Name
        .Title = "月次報告を保存する"
        'ダイアログボックスの起動と値の取得
        If .Show = True Then
            pathSave = .SelectedItems(1)
        End If
    End With
    ' ファイルの保存
    If pathSave <> "" Then
        i = InStrRev(pathSave, ".")
        pathSave = Left(pathSave, i - 1) & _
                   Format(Date, "yyyymmdd") & _
                   Right(pathSave, Len(pathSave) - i + 1)
        ActiveWorkbook.SaveAs Filename:=pathSave
    End If
    
End Sub

解説

ダイアログボックスの種類選択

Application.FileDialog の引数でファイル操作ダイアログボックスの種類を指定します。

  • msoFileDialogOpen: ファイルを開く
  • msoFileDialogSaveAs : 名前を付けて保存
  • msoFileDialogFilePicker : ファイルを選択
  • msoFileDialogFolderPicker : フォルダーを選択
起動時に表示するフォルダーやファイル

FileDialog.InitialFileName で、ダイアログボックス起動時に選択するファイルまたはフォルダーのパスを指定します。\\で始まるネットワーク上のパスも指定できます。ここでは、実行日に応じて該当フォルダー名を特定しています。
末尾を\とするとフォルダーの指定となり、ファイル名欄は空欄になります。この指定がないかフォルダーが存在しない場合は、カレントフォルダーが開きます。

FileDialog.Filters.Add で、表示対象のファイル種別をしぼりこみます。1を指定すると、[ファイルの種類]のフィルター項目の先頭に追加されダイアログボックスの起動時に適用されます。

ダイアログボックスの起動とユーザー操作

FileDialog.Show メソッドで、ダイアログボックスを起動し、ユーザーがクリックしたボタンを取得します。[開く]などのコマンドの場合はTrue、[キャンセル]の場合はFalseが返ります。ここでダイアログボックスの表示は消えますが、指定された値などは下のEnd Withまで有効です。

ユーザーの選択や指定は、FileDialog.SelectedItems で取得できます。SelectedItems(n)は個々の指定ファイルのフルパスです。ここで指定ファイルのチェックなどをはさむこともできます。

ダイアログボックス本来の制御は機能します。例えばファイル保存の場合、入力されたファイル名に拡張子がなければ補われますし、空欄なら[保存]ボタンのクリックには反応しません。

Excuteで機能実行

FileDialog.Excuteメソッドで、ダイアログボックスの指定内容に従って機能を実行します。このメソッドは必須ではなく、ダイアログボックスを閉じた後の個別処理で対応することもできます。

ダイアログボックスを起動するその他の方法

組み込みのダイアログボックスをマクロから起動する方法はほかにもあります。それらについても紹介しておきます。

Application.GetOpenFilename、Application.GetSaveAsFilename メソッド

Application.FileDialog とほとんど同等のことができます。ただ、GetOpenFilenameメソッドでは、ネットワークパスを初期値として指定できないため、共有データを前提とした用途には向きません。

正確にいうと、GetOpenFilenameメソッドは初期フォルダーを指定できず、カレントパスが開きます。そして、カレントパスを変更するChDirステートメントは、ネットワークパスには非対応という構図です。

Application.Dialogsプロパティ

すべての組み込みダイアログボックスについて、独自の初期値を指定した状態で起動できます。起動後は通常と同様、ユーザーが必要に応じて項目を指定してコマンドを実行します。

ファイル操作の場合は、専用のApplication.FileDialogのほうが使い勝手として有利です。

 

タイトルとURLをコピーしました