こんにちは! Visioでの手作業に追われていませんか?
「毎日、図面を修正して『名前を付けて保存』する。そのたびに現在の日時をファイル名に入力して……」なんて作業をしていたら、それだけで貴重な時間が溶けてしまいますよね。
今回は、マクロの記録から一歩抜け出して、Visio VBAで「名前を付けて保存」を完全自動化し、さらにファイル名にタイムスタンプ(現在日時)を自動付与するテクニックを解説します。
ここをクリアすれば、Visio VBAの基本と「実務で使える安全な文字列操作」がバッチリ身につきますよ。さあ、一緒にスマートな自動化の世界へ踏み出しましょう!
—
なぜ、タイムスタンプ付き保存の自動化が必要なのか?
実務で図面を扱っていると、次のようなファイル名を見かけませんか?
- `システム構成図_20231025_143000.vsdx`
- `フロアマップ_2023-10-25.vsdx`
このように日時(タイムスタンプ)をファイル名に自動で組み込むことで、「上書き保存してしまって昨日の状態に戻せない!」という悲劇を完全に防ぐことができます。
しかし、ここで初心者の方が必ずと言っていいほどハマる「罠」があります。それが「ファイルに使えない禁則文字」の問題です。
⚠️ Windowsのファイル名に使えない文字に注意!
日時を自動取得して `2023/10/25 14:30:00` のような文字列を作ってしまうと、スラッシュ(`/`)やコロン( `:` )が含まれてしまいますよね。これらはWindowsのファイルシステムでは名前に使用できない文字(禁則文字)です。そのまま保存しようとすると、容赦なくVBAのエラー(実行時エラー)が発生して止まってしまいます。
今回は、このトラブルをスマートに回避する「実務的な文字列操作」も含めてコードを組み立てていきましょう。
—
【実践】タイムスタンプ付き保存のVBAコード
まずは、開発の現場でそのままコピペして使える完全版のコードをドンと提示します。
VisioのVBAエディタ(`Alt` + `F11`)を開き、標準モジュールに貼り付けてみてください。
Option Explicit
Public Sub SaveWithTimestamp()
‘ =========================================================================
‘ 目的: 現在の日時をファイル名に付与し、指定フォルダに安全に保存する
‘ 前提: 保存先フォルダが存在しない場合は、自動的に作成する
‘ =========================================================================
Dim targetDoc As Visio.Document
Dim saveFolderPath As String
Dim baseFileName As String
Dim timeStamp As String
Dim fullPath As String
‘ 1. アクティブな図面を取得する
Set targetDoc = ActiveDocument
‘ 2. 未保存(新規作成のまま)の図面の場合はエラーを防ぐため処理を抜ける
If targetDoc.Path = “” Then
MsgBox “この図面はまだ一度も保存されていません。” & vbCrLf & _
“まずは手動で一度保存してからマクロを実行してください。”, _
vbExclamation, “保存確認”
Exit Sub
End If
‘ 3. 保存先フォルダのパスを定義(今回はデスクトップの「VisioBackups」フォルダ)
‘ ※ Environ(“USERPROFILE”) を使うことで、誰のPCでもデスクトップを正確に指定できます
saveFolderPath = Environ(“USERPROFILE”) & “\Desktop\VisioBackups\”
‘ 4. フォルダが存在しなければ、自動で作成する(ここが実務で超重要!)
If Dir(saveFolderPath, vbDirectory) = “” Then
MkDir saveFolderPath
End If
‘ 5. 基本のファイル名を設定(拡張子を除いた名前)
baseFileName = “NetworkDiagram”
‘ 6. Windowsの禁則文字(/や:)を排除した安全なタイムスタンプを作成
‘ 例: 2023年10月25日 14時30分00秒 -> “20231025_143000”
timeStamp = Format(Now, “yyyymmdd_hhnnss”)
‘ 7. 保存先のフルパスを組み立てる
fullPath = saveFolderPath & baseFileName & “_” & timeStamp & “.vsdx”
‘ 8. ファイルを保存する
‘ SaveAsExを使うことで、高度な保存オプションを指定できます
targetDoc.SaveAsEx fullPath, visSaveAsNoCast
‘ 9. 完了メッセージ
MsgBox “図面を正常に保存しました!” & vbCrLf & fullPath, vbInformation, “保存完了”
End Sub
—
コードの重要ポイントを噛み砕いて解説!
先輩エンジニアとして、このコードの「なぜこの書き方をしているのか」という本質的なポイントを3つに絞って解説します。
① `Environ(“USERPROFILE”)` で環境に依存しないパスを作る
コード内で `C:\Users\Yamada\Desktop\…` とハードコーディングしてしまうと、他のメンバーのPCで実行したときに「フォルダが見つかりません」というエラーになります。
`Environ(“USERPROFILE”)` を使えば、「今PCを操作しているユーザーのホームフォルダ」を動的に取得できるため、誰のPCで動かしてもデスクトップを正確に指し示すことができます。
② `Dir`関数 と `MkDir` でフォルダの自動生成
プログラムが自動保存を試みるとき、「保存先のフォルダがそもそも存在しない」という状況はよく起こります。
そこで、以下のロジックを挟んでいます。
If Dir(saveFolderPath, vbDirectory) = “” Then
MkDir saveFolderPath
End If
「もし指定したフォルダがなかったら、その場で自動的に作る」という、実務では必須の防御的プログラミング(ディフェンシブ・プログラミング)の基本テクニックです。
③ `Format(Now, “yyyymmdd_hhnnss”)` による安全なタイムスタンプ
今回のテーマのキモです。`Now` 関数は「現在の日時」を取得しますが、これをそのまま文字列にすると `2023/10/25 14:30:00` のようになり、スラッシュやコロンが混入します。
`Format` 関数を使い、`yyyymmdd_hhnnss` というフォーマットを指定することで、数字だけの安全な文字列(例: `20231025_143000`)に変換しています。これならWindowsのファイル名規則に完全違反せず、綺麗にソートできるファイル名になります。
—
初心者が陥りやすい罠と回避策
ここで、現場でよくあるトラブルとその対策についても触れておきます。
- 罠1: 新規作成してまだ一度も保存していないファイルで実行した
- 原因: `targetDoc.Path` が空っぽ(`””`)のため、保存先フォルダの基準が分からなくなります。
- 対策: 上記のコードの「手順2」のように、`Path = “”` の場合は処理を中断してメッセージを出すガード節を入れることで、予期せぬエラーを防ぎます。
- 罠2: 既に同じ名前のファイルが存在していて上書き確認が出る
- 原因: 1秒以内に何度もマクロを実行すると、タイムスタンプが被る可能性があります。
- 対策: 基本的には `yyyymmdd_hhnnss`(秒単位)であれば同名になりにくいですが、秒単位以上の精度(ミリ秒など)が必要な場合は、連番(カウンター)を組み合わせるアプローチも検討するとより堅牢になります。
—
おわりに
今回は、Visio VBAを使った「名前を付けて保存」の自動化と、安全なタイムスタンプ付与のテクニックを解説しました。
ここをクリアできれば、次は「ボタン一つでPDFやPNGも同時に書き出す」「チーム共通のサーバーパスに自動バックアップする」といった、さらなる高度な自動化へとステップアップしていくことができます。
あなたのVisioライフが、よりスマートで快適なものになることを応援しています。それでは、次の自動化の旅でお会いしましょう!
