似たようなフォルダーやファイルが並んでいて、取り違えてしまったことはありませんか?
ファイルを開く/保存する際のダイアログボックスをカスタマイズして、そのようなミスを避けやすくする方法を紹介します。例えば、通常使うフォルダーを初期表示したり、実行前にチェックして確認メッセージを表示したりできます。
ファイルの選択/保存ダイアログボックスをカスタマイズ
初期フォルダーを特定してダイアログボックスを起動するマクロ
ダイアログボックス起動時の初期状態を変更する例です。
年度ごとのフォルダーに月ごとのファイルを管理している場合を想定しています。所定の場所の当年フォルダーが初期表示されます。他の年のフォルダーは意識的に選択し直すことで利用できます。
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
のほうが使い勝手として有利です。