【入門編】【実務中級者向け】FSO(FileSystemObject)連携:図面を開く前にファイルの更新日時とサイズをチェックする – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステップから抜け出し、「自分の手で図面を自在にコントロールしたい」と願うあなたなら、きっと今日のテーマにワクワクするはずです。

今回は、実務で絶対に避けて通れない「図面ファイルを開く前の事前チェック」について解説します。
ここをクリアすると、あなたのVBAプログラムは「ただ動くおもちゃ」から「現場で信頼される堅牢な自動化ツール」へと劇的に進化しますよ。

—

なぜ、図面を「開く前」にチェックする必要があるのか?

AutoCAD VBAで最も重い処理、それは何だと思いますか?
そう、「DWGファイルを開くこと(`Documents.Open`)」です。

何百もの図面を一括処理するバッチ処理を作ったとしましょう。もし、プログラムがこんな無駄な動きをしていたらどうなりますか?

1. 重いDWGファイルをわざわざメモリ上に開く
2. 「あれ? このファイル、昨日から更新されてないな……」と気づく
3. 何もせずに閉じる

これを何百回も繰り返したら……パソコンは悲鳴を上げ、あなたの大切な休憩時間が無駄な待ち時間フリーズに消えていきます。

AutoCAD APIの「弱点」をFSOで補う

実は、AutoCADのオブジェクトモデル(`ThisDrawing` や `Documents`)は、「ファイルを開くこと」を前提として作られています。そのため、ファイルを開く前に「最終更新日時はいつか?」「ファイルサイズはどれくらいか?」といったメタデータを軽快に取得するのがちょっと苦手なのです。

そこで登場するのが、VBAの強力な相棒「FSO(FileSystemObject)」です!
FSOを使えば、AutoCADに重い図面を開かせる前に、OSのファイルシステムから一瞬で必要な情報を引き出せます。これぞ、プロのエンジニアが使うスマートな技です。

—

実践!FSOを使ったファイル事前チェックロジック

それでは、実際に動くコードを見てみましょう。
今回は、「特定のフォルダ内にあるDWGファイルのうち、『直近24時間以内に更新されたファイル』だけを効率よく選別して処理する」という実務で非常によくあるシナリオを想定しています。

Sub CheckAndOpenDrawings()
‘ 事前準備:ツール > 参照設定 から 「Microsoft Scripting Runtime」 にチェックを入れてください
Dim fso As Object
Dim targetFolder As Object
Dim fileItem As Object
Dim targetPath As String
Dim openCount As Long

‘ 1. FSOのインスタンスを作成
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 対象とするフォルダパスを指定(環境に合わせて書き換えてください)
targetPath = “C:\AutoCAD_Data\Projects\”

‘ フォルダの存在確認
If Not fso.FolderExists(targetPath) Then
MsgBox “指定されたフォルダが存在しません: ” & targetPath, vbCritical, “エラー”
Exit Sub
End If

Set targetFolder = fso.GetFolder(targetPath)
openCount = 0

‘ 2. フォルダ内の全ファイルをループ処理
For Each fileItem In targetFolder.Files

‘ 3. 拡張子が “.dwg” のファイルだけを対象にする(大文字小文字を区別しない)
If LCase(fso.GetExtensionName(fileItem.Name)) = “dwg” Then

‘ 4. 【ここが本質】開く前に「更新日時」と「ファイルサイズ」をチェック!
‘ 条件A:直近24時間以内に更新されているか?
‘ 条件B:ファイルサイズが 0バイト(破損ファイルの疑い)ではないか?
If fileItem.DateLastModified >= (Now – 1) And fileItem.Size > 0 Then

Debug.Print “処理対象発見: ” & fileItem.Name
Debug.Print ” 最終更新: ” & fileItem.DateLastModified
Debug.Print ” サイズ: ” & (fileItem.Size \ 1024) & ” KB”

‘ 5. ようやくここで図面を開く(安全かつ効率的!)
‘ Dim targetDoc As AcadDocument
‘ Set targetDoc = Documents.Open(fileItem.Path)

‘ ※今回はテストのため開く代わりにカウントアップ
openCount = openCount + 1

Else
Debug.Print “スキップ(条件外): ” & fileItem.Name
End If

End If

Next fileItem

‘ 後片付け
Set fileItem = Nothing
Set targetFolder = Nothing
Set fso = Nothing

MsgBox “チェック完了! 処理対象の図面は ” & openCount & ” 件です。”, vbInformation, “完了”
End Sub

—

コードの注目ポイントと「エンジニアの知見」

このコードには、実務でバグを踏まないための重要なエッセンスが詰まっています。いくつかポイントを解説しますね。

1. `LCase` による拡張子判定の罠回避

Windowsの世界では「.DWG」も「.dwg」も同じですが、VBAの文字列比較は厳格です。`LCase`関数で小文字に統一してから比較することで、「ファイルはあるのに認識されない」という初学者が陥りがちなミスを完全に防いでいます。

2. 幽霊ファイル(サイズ0バイト)のガード

ネットワークドライブなどで時々遭遇するのが、何らかの原因で壊れた「サイズ0バイトの空ファイル」や、編集中に作成される一時ファイルです。`fileItem.Size > 0` という条件を挟むことで、「中身が空っぽのファイルを開いてAutoCADがフリーズする」という最悪の事態を未然に回避できます。

3. メモリリークを許さない後片付け

オブジェクト変数(`Set fso = …` など)は、処理が終わったら最後に `Set fso = Nothing` で解放してあげるのが美しいコードの作法です。これをサボると、何回もマクロを走らせたときにメモリのゴミが残り、AutoCAD本体の動作が不安定になる原因を作ります。

—

陥りやすいエラーと対策

エラー:「実行時エラー ‘429’: オブジェクトはコンポーネントを作成できません」

  • 原因: `CreateObject(“Scripting.FileSystemObject”)` が失敗しています。あるいは、VBEの「ツール」>「参照設定」で `Microsoft Scripting Runtime` にチェックを入れ忘れている、または記述ミスがあります。
  • 対策: レジストリの破損が稀にありますが、基本的にはスペルミス(`Scripting.FileSystemObject`)を確認してください。

トラブル:「日付の判定がうまくいかない(ヒットしない)」

  • 原因: `Now – 1` は「ちょうど24時間前」を意味します。もし「今日の日付以降」で絞り込みたい場合は、`Date` 関数(時刻が0:00になる)を使用するなど、比較する基準を明確にする必要があります。
  • 例:`If fileItem.DateLastModified >= Date Then` (今日の日付になってから更新されたもの)

—

まとめ:ここをクリアすれば、基本はバッチリ!

お疲れ様でした!今回は、FSOとAutoCAD VBAを連携させて、図面を開く前にスマートにファイルを精査する方法を学びました。

  • 重い処理(図面オープン)は、必要なものだけに絞る
  • OSレベルの情報(日時・サイズ)はFSOに任せる
  • 異常値(0バイト等)を弾くガードを必ず入れる

この3つを意識するだけで、あなたが書くマクロの信頼性はプロのレベルへと一気に引き上げられます。

ここをクリアできれば、もうあなたは「AutoCAD VBAの初学者」ではありません。現場で頼られる自動化エンジニアへの第一歩を、確実に踏み出していますよ。
次のステップでは、この選別したファイル群に対して、図面を開かずにデータベース(属性情報)だけを高速に読み取る「DBA(Database Access)」の技法に挑戦してみましょう。

それでは、快適なAutoCADライフを!

タイトルとURLをコピーしました