こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステップから抜け出し、いよいよ自分の手で図面を自在にコントロールする「自動化エンジニア」への第一歩を踏み出したあなたへ、今日はとても大切な話をします。
「特定の図面ファイルを一括処理するマクロを作ろう!」そう意気込んでいざコードを書き始めたとき、一番最初に直面する絶望。それが、「ファイルが見つからないときの残酷な実行時エラー」です。
‘ 存在しないファイルをOpenしようとすると、ここでマクロが強制終了!
ThisDrawing.Application.Documents.Open “C:\Work\Not_Found.dwg”
このエラーが発生すると、せっかく走らせていた夜間バッチ処理が途中で止まってしまい、翌朝出社したときに「あぁ、途中で止まってる……」と頭を抱えることになります。
プロのエンジニアと初心者の分かれ道は、まさにここ。「処理を実行する前に、そのファイルが本当にそこに存在するか?」を完璧に把握し、華麗にいなすことができるかどうかです。
今回は、AutoCAD VBAでファイルを開く前の鉄壁のガードを作るための2大巨頭、`Dir関数` と `FSO(FileSystemObject)` の使い分けと極意を、優しく、そして深く伝授します。ここをクリアすれば、あなたのマクロは見違えるほど堅牢(ロバスト)になりますよ!
—
1. なぜ「ファイル存在チェック」が必要なのか?
AutoCADの `Documents.Open` メソッドは、指定したパスにファイルがない場合、容赦なくエラーを吐いてVBAの実行をストップさせます。特に以下のような環境では、ファイルの存在確認が絶対不可欠です。
- 社内ネットワーク(NASやファイルサーバー)の遅延やパスの変更
- ユーザーが手入力した、あるいはExcelから読み込んだパスのタイポ(打ち間違い)
- 他のプロセスがまだファイルを保存しきっていないタイミングでのアクセス
「開く前に確認する」。この当たり前のひと手間を入れるだけで、あなたのマクロはプロの仕事へと生まれ変わります。
—
2. 選択肢A:手軽さが売りの『Dir関数』
VBAに最初から備わっている標準関数が `Dir` です。追加の設定が一切不要で、最も手軽にファイルの存在を確認できます。
基本的な使い方
`Dir(“ファイルのパス”)` を実行し、ファイルが存在すればそのファイル名を返し、存在しなければ長さ0の文字列(`””`)を返します。
サンプルコード(Dir関数版)
Sub CheckFileWithDir()
Dim targetPath As String
targetPath = “C:\AutoCAD_Work\Sample01.dwg”
‘ ファイルが存在するかチェック
If Dir(targetPath) <> “” Then
‘ ファイルが存在する場合の処理
MsgBox “ファイルを発見しました。図面を開きます。”, vbInformation
‘ 安全に図面を開く
ThisDrawing.Application.Documents.Open targetPath
Else
‘ ファイルが存在しない場合の処理
MsgBox “指定されたパスにファイルが見つかりません:” & vbCrLf & targetPath, vbExclamation
End If
End Sub
💡 Dir関数の注意点(エンジニアの知見)
`Dir関数` は非常に軽くて便利なのですが、「ワイルドカード(“や`?`)が使える」「ファイル属性(読み取り専用など)の影響を受ける」という特性があります。また、ネットワークパス(UNCパス:`\\Server\Folder\file.dwg`)に対して使うと、環境によっては正しく判定できないケースや、動作が不安定になることがあります。ローカルのシンプルなファイルチェックに向いています。
—
3. 選択肢B:モダンで確実な『FSO(FileSystemObject)』
プロの現場でより好まれて使われるのが、Microsoft Scripting Runtimeライブラリに含まれる `FileSystemObject` (FSO) です。オブジェクト指向的にファイルを扱えるため、非常に直感的でエラーが起きにくいのが特徴です。
事前準備(または遅延バインディング)
FSOを使うには、通常「参照設定」が必要ですが、コード内で動的に生成する「遅延バインディング(Late Binding)」を使えば、設定の手間なしでどのPCでも動くコードが書けます。
サンプルコード(FSO版)
Sub CheckFileWithFSO()
Dim fso As Object
Dim targetPath As String
targetPath = “C:\AutoCAD_Work\Sample01.dwg”
‘ FileSystemObjectを生成
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ FSOの .FileExists メソッドで存在チェック
If fso.FileExists(targetPath) Then
MsgBox “FSO:ファイルを確認しました。安全に処理を開始します。”, vbInformation
‘ 安全に図面を開く
ThisDrawing.Application.Documents.Open targetPath
Else
MsgBox “FSO:ファイルが存在しません。パスを確認してください。”, vbCritical
End If
‘ メモリの解放(お作法として重要)
Set fso = Nothing
End Sub
💡 FSOのメリット(エンジニアの知見)
FSOの `FileExists` メソッドは、ネットワークパス(UNCパス)に対しても非常に安定して動作します。 また、親フォルダの存在チェック(`FolderExists`)や、ファイルの拡張子だけを抜き出す処理(`GetExtensionName`)など、図面管理マクロで欲しくなる機能がワンセットになっています。迷ったらFSOを使っておけば間違いありません。
—
4. どっちを使うべき? シチュエーション別・最適解
ここまでの解説で、それぞれの特徴が見えてきたかと思います。実務での使い分けの基準は以下の通りです。
| 比較項目 | Dir関数 | FileSystemObject (FSO) |
| :— | :— | :— |
| 手軽さ | ◯(コードが短い) | △(オブジェクト生成が必要) |
| ネットワーク耐性| △(UNCパスで癖がある) | ◎(非常に安定している) |
| 拡張性 | △(存在確認のみ) | ◎(フォルダ操作なども簡単) |
| おすすめ用途 | ローカルの単純なファイルチェック | 実務の業務自動化全般(強く推奨) |
初心者の方であれば、まずは手軽な `Dir関数` でVBAの条件分岐(`If`文)の感覚をつかみ、実務でネットワーク上の図面を扱うようになったら `FSO` にステップアップしていくのが王道のロードマップです。
—
まとめ:エラーを制する者は、AutoCAD VBAを制する
今回は、図面を開く前の「ファイル存在チェック」について、Dir関数とFSOの使い分けを解説しました。
ここをクリアすれば、あなたの書いたマクロは途中でフリーズしたり不気味なエラーダイアログを吐いたりしなくなります。「エラーが起きないように優しくエスコートしてあげること」こそが、優れた自動化エンジニアの証です。
ぜひ今日のコードをご自身の開発環境にコピーし、試してみてくださいね。「ここをクリアすれば、AutoCAD VBAの基本はバッチリですよ!」
あなたのAutoCADライフが、より快適で創造的なものになりますように。次回の解説もお楽しみに!
