Visio VBAの「名前を付けて保存」を支配せよ:FileDialogでUXを極限まで高める実装術
現場の業務自動化において、最も軽視されがちなのが「UI/UXの導線設計」だ。
多くのエンジニアは「とりあえず動くコード」を書くことに腐心するが、真の自動化ツールは、ユーザーの「迷い」を徹底的に排除しなければならない。
特に、Visioの標準的な `Application.DoCmd(visCmdFileSaveAs)` は、前回の保存場所を記憶してしまい、プロジェクトごとにファイルを切り替える業務では生産性を大きく阻害する。
本記事では、`FileDialog` オブジェクトを駆使し、特定のプロジェクトフォルダを初期値として強制する「賢い保存処理」の実装を伝授する。
—
なぜ標準の「名前を付けて保存」では不十分なのか
Visio標準の保存コマンドは、Windowsのシェル状態に依存する。もしユーザーが直前に別の階層で作業していれば、ダイアログはその場所を指し示してしまう。
「保存先が違う」「どこに保存したかわからなくなった」 —— このような問い合わせは、自動化ツールの設計者にとって最も避けるべき工数浪費だ。我々は、コードでコンテキスト(場所とファイル名)を制御しなければならない。
—
堅牢な実装:FileDialogによる保存ダイアログ制御
以下のコードは、単にダイアログを出すだけでなく、「拡張子の強制」「フォルダの存在確認」「キャンセル時のハンドリング」を網羅した、プロダクション(本番)環境レベルの設計となっている。
Option Explicit
”’
”’
Public Sub SaveDrawingWithCustomPath()
Dim fd As Office.FileDialog
Dim defaultFolder As String
Dim targetPath As String
‘ 1. 保存先のベースパスを設定(本来は設定ファイル等から読み込むべき)
defaultFolder = “C:\Projects\DesignDocs\”
‘ フォルダが存在しない場合のガード節(バグの芽を摘む)
If Dir(defaultFolder, vbDirectory) = “” Then
MsgBox “指定されたプロジェクトフォルダが見つかりません。”, vbCritical
Exit Sub
End If
‘ 2. FileDialogオブジェクトの生成
Set fd = Application.FileDialog(msoFileDialogSaveAs)
With fd
.Title = “プロジェクト図面を保存”
.InitialFileName = defaultFolder & “図面名称_YYYYMMDD.vsdx”
.FilterIndex = 1
‘ 3. ダイアログ表示とユーザー選択の判定
If .Show = -1 Then
targetPath = .SelectedItems(1)
‘ 拡張子の補完チェック
If LCase(Right(targetPath, 5)) <> “.vsdx” Then
targetPath = targetPath & “.vsdx”
End If
‘ 4. 保存処理(上書き警告はVisio側が自動制御する)
On Error Resume Next
ActiveDocument.SaveAsEx targetPath, visSaveAsWS
If Err.Number <> 0 Then
MsgBox “保存中にエラーが発生しました: ” & Err.Description, vbCritical
Else
MsgBox “保存が完了しました。” & vbCrLf & targetPath, vbInformation
End If
On Error GoTo 0
End If
End With
End Sub
—
このコードが「プロ仕様」である理由
1. ガード節による防御的プログラミング
`Dir` 関数を用いてフォルダの存在を確認している。これを怠ると、環境依存のパス設定において「ダイアログが開かない」「予期せぬエラーでクラッシュする」といった事態を招く。初手で失敗を検知するのがエンジニアの鉄則だ。
2. `SaveAsEx` の活用
単なる `SaveAs` ではなく、`SaveAsEx` を使用している。これはVisioの保存オプション(`visSaveAsWS`:ワークスペースを保存)を明示的に指定でき、後方互換性や特定のファイル形式への強制力が高い。
3. エラーハンドリングの境界設定
`On Error Resume Next` をピンポイントで使用し、保存時の例外(ファイルが読み取り専用である、権限がない等)を適切にキャッチしている。ここで処理を止めず、ユーザーに状況を伝えるのがUXデザインの要諦だ。
—
開発現場へのアドバイス:保守性を高めるために
このコードをあなたのツールに組み込む際は、以下の運用ルールを徹底してほしい。
- パスの外部化: `defaultFolder` をコードに直書きするのは「アンチパターン」だ。INIファイル、あるいはレジストリ、またはシート上の設定セルから読み込む設計に書き換えること。
- ファイル名の自動生成: 今回のコードでは `_YYYYMMDD` をハードコードしているが、可能であれば `Format(Date, “yyyymmdd”)` を利用し、動的に生成させることで、日付の付け忘れというヒューマンエラーを根絶できる。
自動化とは、単に作業を速くするものではない。「ユーザーが考える余地を奪い、迷わせない仕組みを作ること」こそが、世界最高峰の自動化エンジニアの仕事である。
さあ、このコードをあなたの武器に加え、現場の無駄を一つずつ削ぎ落としていってほしい。
