【入門編】【上級プロフェッショナル向け】ObjectDBXを用いた「図面を開かずに」ページ設定(PageSetup)を一括コピーして保存する高速技術 – AutoCAD VBA解析バイブル

スポンサーリンク
スポンサーリンク

図面を「開かない」という革命。ObjectDBXで実現する、超高速ページ設定同期術

「数百枚の図面に、一括で正しい印刷設定(ページ設定)を適用したい……」

AutoCADで業務をしていると、必ずと言っていいほど直面する課題です。しかし、もしあなたが「マクロの記録」から一歩踏み出し、一つひとつの図面を `Documents.Open` で開き、画面上で設定を書き換え、保存して閉じる……という処理を組んでいるとしたら、少しだけ立ち止まってほしいのです。

その方法は、「あまりにも、時間がかかりすぎる」からです。

今日は、AutoCAD VBAの深淵に触れるための強力な武器、「ObjectDBX」を使いこなす技術を伝授します。これを使えば、AutoCADの画面上で図面がパタパタと開閉する様子を見ることなく、バックグラウンドで「幽霊のように」高速にデータを書き換えることができます。

ここをマスターすれば、あなたの自動化スキルは「作業の代替」から「システムの構築」へと進化します。さあ、一緒に極限の効率を目指しましょう。

1. なぜ「Documents.Open」ではいけないのか?

まず、私たちが目指すべき「高速化」の本質を理解しましょう。

通常、VBAから図面を開くときは `ThisDrawing.Documents.Open` を使います。これは、AutoCADの「GUI(ユーザーインターフェース)」をフル稼働させて図面をロードすることを意味します。

  • グラフィックエンジンを起動する
  • コマンドラインを表示する
  • レイアウトを再計算して画面に描画する
  • メモリに膨大な描画データを展開する

これらすべてのプロセスが、処理時間を奪っていく「重み」となります。1枚に5秒かかるとすれば、500枚では約40分。これでは、エンジニアの貴重な時間が溶けてしまいます。

ObjectDBXという「裏口」

ここで登場するのが ObjectDBX です。
ObjectDBXは、AutoCADの描画機能(GUI)を一切介さず、「DWGファイルというデータベース」に直接アクセスする専用のエンジンです。

例えるなら、`Documents.Open` が「本を机に広げて、ページをめくりながら読む」行為だとすれば、`ObjectDBX` は「本を開かずに、中身のテキストデータだけをスキャンして書き換える」ようなものです。

この違いが、速度に決定的な差を生むのです。

2. 実践:ObjectDBXを用いたページ設定の一括同期コード

それでは、具体的なコードを見ていきましょう。
今回のミッションは、「マスター図面(Template.dwg)のページ設定を、指定したフォルダ内の全図面にコピーする」ことです。

【重要】プロフェッショナルの設計思想

ここで一つ、初心者が陥りやすい罠があります。ObjectDBXでは、「ある図面のオブジェクトを、そのまま別の図面に代入する」ことはできません。
「A図面のこの設定オブジェクトを、B図面にコピーせよ」と命令しても、「それは別のドキュメントのものです」とエラー(Runtime Error 438等)を吐かれてしまいます。

そのため、プロは「プロパティ(属性値)を一つずつ読み取り、相手に書き写す」という手法をとります。これが、安定して高速に動作させるための鉄則です。

' --- 参照設定の確認 ---
' AutoCAD Type Library が参照されていることを確認してください

Sub FastPageSetupSync()
    Dim acadApp As Object
    Dim dbxDoc As Object
    Dim masterDoc As Object
    Dim targetDoc As Object
    Dim masterLayout As Object
    Dim targetLayout As Object
    Dim targetFiles As Collection
    Dim filePath As Variant
    Dim masterPath As String
    Dim folderPath As String
    Dim dbxVersion As String
    
    ' --- 設定エリア ---
    masterPath = "C:\Temp\Master_Template.dwg" ' 設定のコピー元
    folderPath = "C:\Temp\Target_Drawings\"    ' 設定を適用したい図面群のフォルダ
    ' ------------------

    On Error GoTo ErrorHandler
    Set acadApp = ThisDrawing.Application
    
    ' 1. マスター図面を通常のDocumentとして開く(設定を読み取るため)
    Set masterDoc = acadApp.Documents.Open(masterPath)
    ' マスターの「Model」または特定の「Layout」を対象とする
    Set masterLayout = masterDoc.Layouts.Item(0) ' 0番目のレイアウトを使用
    
    ' 2. ObjectDBXの準備
    ' AutoCADのバージョンに応じて「ObjectDBX.AxDbDocument」等の名前を使い分けます
    ' ここでは汎用的な方法として、現在のバージョンに合わせたDBXオブジェクトを作成
    dbxVersion = "ObjectDBX.AxDbDocument." & Left(acadApp.Version, 2)
    Set dbxDoc = acadApp.GetInterfaceObject(dbxVersion)
    
    ' 3. 対象ファイルのリストアップ(簡易的にDir関数を使用)
    Set targetFiles = New Collection
    Dim fileName As String
    fileName = Dir(folderPath & "*.dwg")
    
    Do While fileName <> ""
        If fileName <> Dir(masterPath) Then ' マスター自身は除外
            targetFiles.Add folderPath & fileName
        End If
        fileName = Dir()
    Loop

    Debug.Print "処理開始: " & targetFiles.Count & " 枚の図面が見つかりました。"

    ' 4. メインループ:DBXで図面を「開かずに」書き換える
    Dim i As Integer
    For i = 1 To targetFiles.Count
        filePath = targetFiles(i)
        
        ' DBXで図面をロード(画面には表示されない)
        dbxDoc.Open filePath
        
        ' 対象図面のレイアウトにアクセス(例として最初のレイアウト)
        Set targetLayout = dbxDoc.Layouts.Item(0)
        
        ' --- 【極意】プロパティの同期 ---
        ' オブジェクトごとコピーするのではなく、個別の値を転写する
        With targetLayout
            .CanonicalMediaName = masterLayout.CanonicalMediaName
            .CanonicalFullMediaName = masterLayout.CanonicalFullMediaName
            .PaperUnits = masterLayout.PaperUnits
            .PlotConfiguration = masterLayout.PlotConfiguration ' ※注意が必要な箇所
            .PlotDeviceName = masterLayout.PlotDeviceName
            .PlotRotation = masterLayout.PlotRotation
            .StandardScale = masterLayout.StandardScale
            .StandardScaleName = masterLayout.StandardScaleName
            .PlotType = masterLayout.PlotType
            .ControlType = masterLayout.ControlType
            ' 必要に応じて他のプロパティも追加
        End With
        
        ' 5. 保存(DBX経由で直接DWGを更新)
        dbxDoc.SaveAs filePath
        
        Debug.Print "完了: " & filePath
    Next i

    ' 後片付け
    masterDoc.Close False
    Set dbxDoc = Nothing
    
    MsgBox "全ての処理が完了しました!", vbInformation
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました。" & vbCrLf & _
           "番号: " & Err.Number & vbCrLf & _
           "内容: " & Err.Description, vbCritical
    If Not masterDoc Is Nothing Then masterDoc.Close False
End Sub

3. 陥りやすいエラーと回避策(トラブルシューティング)

この技術は強力ですが、魔法ではありません。現場で遭遇する「壁」をあらかじめ知っておきましょう。

① 「Class not registered(クラスが登録されていません)」

これは、`GetInterfaceObject` で指定した `dbxVersion` が、お使いのAutoCADのバージョンと一致していない時に発生します。

  • 対策: `acadApp.Version` を使って動的に取得するようにコードを組むのが最も賢明です。

② 「Permission denied(アクセス拒否)」

対象の図面が、他の誰か(または自分自身)によってAutoCADで開かれている場合に発生します。ObjectDBXはファイルを直接掴みに行くため、ロックされていると手も足も出ません。

  • 対策: 実行前に、対象フォルダの図面がすべて閉じられていることを確認するプロセスを挟むか、エラーハンドリングで「スキップして次に進む」処理を入れましょう。

③ 「プロパティが同期されない」

`PageSetup`(ページ設定)には、プロッタ構成(CTB/STB)や用紙サイズなど、複雑な依存関係があります。

  • 対策: 単に値を代入するだけでなく、`PlotConfiguration` の整合性を確認してください。もし特定の名前のページ設定を適用したい場合は、`targetLayout.CopyFrom` メソッドが使えるケースもありますが、ObjectDBX環境下ではプロパティの直接同期が最も確実です。

4. まとめ:一歩先の自動化エンジニアへ

いかがでしたでしょうか。
`Documents.Open` を使う「力技」から、`ObjectDBX` を使った「精密な操作」への転換。これが、プロフェッショナルな業務自動化への入り口です。

今回のポイントを振り返りましょう:
1. 速度の鍵は「描画(GUI)をスキップすること」にある。
2. ObjectDBXは「図面という名のデータベース」を直接叩く技術である。
3. オブジェクトの丸ごとコピーは不可。 プロパティを一つずつ丁寧に「転写」するのが成功の秘訣。

最初はエラーが出るかもしれません。しかし、エラーメッセージの一つひとつは、AutoCADの内部構造を教えてくれる貴重なヒントです。これを乗り越えたとき、あなたの作成するマクロは、もはや単なる「記録」ではなく、業務を劇的に変える「ツール」へと昇華しているはずです。

応援しています。さあ、コードを書いて、世界を変えましょう!

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