こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステップから抜け出し、「自分の手で図面を自在にコントロールしたい」と思い始めたあなたへ。
今日は、実務で絶対に役立つ「環境に依存しないファイルの保存術」を伝授します。
ここをクリアすれば、AutoCAD VBAの基本はバッチリですよ!一緒にマスターしていきましょう。
—
1. なぜ「絶対パス」ではなく「相対パス(ThisDrawing.Path)」なのか?
皆さんは普段、図面を保存するときにこんなコード書いていませんか?
‘ 駄目な例:Cドライブの固定パス
ThisDrawing.SaveAs “C:\Work\ProjectA\Drawing1.dwg”
これ、一見動くように見えますが、エンジニアとしては「絶対にやってはいけない御法度(タブー)」です。
なぜなら、このマクロを他のメンバーのパソコンで動かしたり、別のフォルダにプロジェクトをごっそり移動させたりした瞬間、「そんなフォルダありません!」とエラー(Run-time error)で盛大に爆発してしまうからです。
救世主:`ThisDrawing.Path` という概念
ここで登場するのが、今回の主役である `ThisDrawing.Path`(ディス・ドローイング・パス) です。
これは、「今、画面で開いている図面ファイルが、パソコンのどこに保存されているか」を文字列として教えてくれるプロパティです。
- 図面が `C:\Project\2023\` にあるなら、`ThisDrawing.Path` は `C:\Project\2023` を返します。
- もしその図面をUSBメモリの `D:\Drawing\` に移動させれば、自動的に `D:\Drawing` を返します。
これを使えば、「今開いている図面を基準にして、そのすぐ近くにフォルダを作って保存する」という、どんな環境でも絶対に壊れない「自律型の保存マクロ」が作れるようになります。
—
2. 実践!プロジェクトフォルダ内に「Backup」フォルダを自動生成して保存する
それでは、今日のメインプログラムを作りましょう。
「現在開いている図面と同じ場所に、もし『Backup』というフォルダがなければ自動で作る。そして、そこに日付をつけたバックアップ図面を保存する」という、実務で即戦力になるコードです。
以下のコードを、AutoCADのVBAエディタ(`Alt + F11` で開けます)の標準モジュールに貼り付けてみてください。
Sub SaveToBackupFolder()
Dim currentPath As String
Dim backupPath As String
Dim originalName As String
Dim ext As String
Dim fso As Object
Dim saveFileName As String
‘ 1. 現在の図面が一度も保存されていない場合はエラーになるのでチェック
If ThisDrawing.Path = “” Then
MsgBox “この図面はまだ一度も保存されていません!” & vbCrLf & _
“まずは一度、手動で名前を付けて保存してください。”, vbCritical, “保存エラー”
Exit Sub
End If
‘ 2. カレント図面のパスを取得
currentPath = ThisDrawing.Path
‘ 3. バックアップ用フォルダのパスを組み立てる(パスの区切り文字「\」に注意)
backupPath = currentPath & “\Backup”
‘ 4. FileSystemObjectを使って「Backup」フォルダがなければ作成する
‘ ※VBAでフォルダを操作するお馴染みの強力なツールです
Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FolderExists(backupPath) Then
fso.CreateFolder backupPath
MsgBox “「Backup」フォルダを新しく作成しました!”, vbInformation, “フォルダ作成”
End If
‘ 5. 元のファイル名から拡張子(.dwg)を除いた部分を取り出す
‘ 例:「sample.dwg」なら「sample」を取得
originalName = ThisDrawing.Name
ext = Right(originalName, 4) ‘ 最後の4文字(.dwg)を取得
originalName = Left(originalName, Len(originalName) – 4)
‘ 6. 保存ファイル名を組み立てる(例:sample_20231025.dwg のように日付を付与)
‘ ※ここではシンプルに、同名でBackupフォルダ内に保存する例にします
saveFileName = backupPath & “\” & originalName & “_bk.dwg”
‘ 7. 図面を別名で保存する
‘ AutoCADのSaveAsメソッドは、すでに同名ファイルがある場合の上書きを確認されるため注意
ThisDrawing.SaveAs saveFileName
‘ 後片付け
Set fso = Nothing
‘ 完了メッセージ
MsgBox “以下の場所にバックアップを保存しました!” & vbCrLf & saveFileName, vbInformation, “保存完了”
End Sub
—
3. コードのポイントと、初心者がハマりやすい罠
このコードには、実務で生き残るための知見がいくつも詰まっています。いくつか重要なポイントを解説しておきますね。
罠①:「まだ保存されていない図面」への配慮
もし、AutoCADを立ち上げて「図面1 (Drawing1.dwg)」を新しく開いただけの状態では、まだハードディスクにファイルが存在しません。そのため、`ThisDrawing.Path` は完全な空っぽ(長さ0の文字列)を返します。
これをそのまま処理しようとすると、「パスが無効です」という痛いエラーになります。
コードの最初にある、`If ThisDrawing.Path = “” Then` というガード節は、実務のコードでは絶対に忘れてはいけない命綱です。
罠②:フォルダのパス区切り文字「\(バックスラッシュ)」
文字列を結合するときによくあるミスが、`currentPath & “Backup”` と書いてしまい、`C:\WorkBackup` のようになってしまう現象です(フォルダ名が結合されて壊れてしまいます)。
必ず `currentPath & “\Backup”` のように、間に `\` を挟むことを忘れないでください。
応用:なぜ `FileSystemObject` を使うのか?
VBAには標準で `MkDir` というフォルダを作る命令もありますが、すでにフォルダが存在する場合にエラーになってしまいます。
`CreateObject(“Scripting.FileSystemObject”)` を使えば、`FolderExists` で「フォルダがあるかどうか」を事前に安全に確認できるため、実務ではこちらを使うのがプロの常道です。
—
4. まとめ:自動化の第一歩は「ファイル位置の把握」から
今回は、`ThisDrawing.Path` を活用して、環境に依存しない相対パス保存の仕組みを学びました。
- 固定の絶対パス(C:\…)は使わない。
- 今開いている図面の場所を基準(`ThisDrawing.Path`)にする。
- フォルダの有無をチェックして自動生成する。
この3つを抑えるだけで、あなたが書くマクロの「安定感」は劇的に向上します。他の人があなたの作ったマクロを使っても、「エラーが出ない!」と感動されるはずです。
AutoCAD VBAの世界は奥が深いですが、こうした小さな「実務で使える技」の積み重ねが、あなたを本物の自動化エンジニアへと育ててくれます。
ぜひ、今日のコードを手元の図面で試してみてくださいね。それでは、また次のステップでお会いしましょう!
