【入門編】【中級者向け】図面ファイル群の一括印刷:指定プリンタと用紙サイズを割り当てて自動スプール – SolidWorks VBA解析バイブル

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

「マクロの記録」を卒業する。数百枚の図面を一括印刷する「設計自動化」への第一歩

こんにちは。設計自動化の世界へようこそ。

「マクロの記録」ボタンを押して、録画されたコードを眺めて、「ふーん、こうやって動いているんだ」と思ったことはありませんか? もしあなたが、記録されたコードをそのままコピペして、何とか動かそうとしている段階なら、おめでとうございます。あなたは今、「作業者」から「エンジニア」へと進化する境界線に立っています。

今日扱うテーマは、実務で最も「地味に、しかし確実に」時間を奪っていく作業の一つ、「図面ファイルの一括印刷」です。

数百枚の図面を一つずつ開き、プリンタを選び、用紙サイズを確認して印刷ボタンを押す……。これを手作業で行うのは、エンジニアリングではなく「労働」です。私たちはこれを、スマートなロジックによって「自動化」へと昇華させます。

単にコードを動かすだけではありません。「なぜそのオブジェクトが必要なのか」「なぜメモリ管理を意識しなければならないのか」。その本質を、一緒に紐解いていきましょう。

1. 自動化の設計図(アルゴリズム)

いきなりコードを書き始めるのは、設計図なしに建築を始めるようなものです。一括印刷ツールには、以下の4つのステップが必要です。

1. ファイル探索(File Crawler): 指定したフォルダ内から `.slddrw` ファイルをすべて見つけ出す。
2. ドキュメントの制御(Document Control): ファイルをバックグラウンドで開き、図面としての情報を読み取る。
3. 環境の最適化(Page Setup): 図面のサイズ(A3かA4かなど)を判定し、プリンタと用紙設定を正しく割り当てる。
4. クリーンアップ(Cleanup): 印刷が終わったら、メモリを解放して次のファイルへ進む。

ここで重要なのは、「図面を開いたまま放置しない」ことです。数百枚も開いていれば、SolidWorksはあっという間にメモリ不足でクラッシュします。

2. 実装:一括印刷マスター・コード

それでは、魂を込めて書いた実戦的なコードを見てみましょう。このコードは、単なる記録ではなく、エラーハンドリングとオブジェクト管理を考慮した構成になっています。

Option Explicit

''' <summary>
''' 指定フォルダ内の図面を一括印刷するメインルーチン
''' </summary>
Sub BulkPrintDrawings()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swPageSetup As SldWorks.PageSetup
    Dim fso As Object
    Dim targetFolder As Object
    Dim file As Object
    Dim folderPath As String
    Dim targetPrinter As String
    
    ' --- 設定エリア ---
    ' 印刷したい図面が入っているフォルダパス
    folderPath = "C:\Users\YourName\Documents\Drawings\"
    ' 使用するプリンタ名(コントロールパネルのプリンタ一覧と完全に一致させること)
    targetPrinter = "Your Printer Name"
    ' ------------------

    Set swApp = Application.SldWorks
    
    ' FileSystemObjectを使用してファイル操作を容易にする
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    ' フォルダの存在確認
    If Not fso.FolderExists(folderPath) Then
        MsgBox "指定されたフォルダが見つかりません。", vbCritical
        Exit Sub
    End If
    
    Set targetFolder = fso.GetFolder(folderPath)

    ' 画面更新を停止してパフォーマンスを向上させる(エンジニアの嗜み)
    ' ※SolidWorks APIには直接的な「画面停止」はないが、Visibleを制御することで疑似的に行う
    swApp.Visible = True 

    ' フォルダ内のファイルをループ
    For Each file In targetFolder.Files
        ' 拡張子が .slddrw の場合のみ処理
        If LCase(fso.GetExtensionName(file.Path)) = "slddrw" Then
            
            Debug.Print "Processing: " & file.Name
            
            ' 1. ファイルをバックグラウンドで開く (Silentモード)
            ' swOpenDocOptions_Silent = 1
            Set swModel = swApp.OpenDoc6(file.Path, swDocDRAWING, swOpenDocOptions_Silent, "", 0, 0)
            
            If Not swModel Is Nothing Then
                Set swDraw = swModel
                
                ' 2. ページ設定の制御
                ' PageSetupオブジェクトを取得して、プリンタと用紙の設定を行う
                Set swPageSetup = swModel.PageSetup
                
                ' プリンタの設定
                swPageSetup.Printer = targetPrinter
                
                ' ここでは図面のシートサイズに応じて処理を分けるロジックを想定
                ' 例として、すべての図面を「用紙サイズに合わせて印刷」する設定
                ' ※詳細な用紙サイズ指定はプリンタドライバに依存するため、
                '   ここでは標準的なPageSetupプロパティを使用します
                
                ' 3. 印刷実行
                ' PrintOut(1) は「1枚印刷」を意味する
                swModel.PrintOut1
                
                ' 4. クリーンアップ(重要!)
                ' ファイルを保存せずに閉じる
                swApp.CloseDoc swModel.GetTitle
                
                ' オブジェクトの参照を解除してメモリを解放する
                Set swDraw = Nothing
                Set swModel = Nothing
            Else
                Debug.Print "Error: Could not open " & file.Name
            End If
            
        End If
    Next file

    ' 後片付け
    Set fso = Nothing
    Set targetFolder = Nothing
    
    MsgBox "一括印刷プロセスが完了しました。", vbInformation
End Sub

3. プロの視点:ここをクリアすれば、あなたは「中級者」だ

このコードを単に動かすだけで終わらせてはいけません。コードの裏側にある「設計思想」を理解しましょう。

① FileSystemObject (FSO) の活用

標準の `Dir` 関数でもファイルは探せますが、プロの現場では `Scripting.FileSystemObject` を好みます。なぜなら、ファイルの存在確認、拡張子の判定、フォルダ情報の取得などが、より直感的かつ強力に行えるからです。これは、Windows OSの力を借りて「賢く」ファイルを扱うためのテクニックです。

② `swOpenDocOptions_Silent` の重み

図面を開くとき、`swOpenDocOptions_Silent` を指定しています。これを使わないと、ファイルを開くたびに「読み取り専用で開きますか?」といったダイアログが画面に出てきて、自動化が止まってしまいます。「ユーザーの操作を一切介在させない」。これが自動化の鉄則です。

③ メモリ管理の儀式 (`Set … = Nothing`)

ここが最も重要です。VBAにおいて、オブジェクト(`swModel`など)は、使い終わった後に「使い終わりましたよ」と明示的に伝えない限り、メモリの中に居座り続けます。
数百枚の図面を扱う場合、この「居座り」が積み重なり、SolidWorksが重くなったり、最悪の場合落ちたりします。`Set swModel = Nothing` は、エンジニアとしての責任感の現れなのです。

④ 陥りやすいエラー:プリンタ名の不一致

「コードは完璧なのに印刷されない!」という場合、9割の理由はプリンタ名の不一致です。
`targetPrinter = “Your Printer Name”` の部分は、Windowsの「デバイスとプリンター」に表示されている名前と、1文字のスペース、大文字小文字まで完全に一致させる必要があります。

最後に:一歩先へ進むあなたへ

このツールは、まだ「基本形」です。
ここからさらに進化させるなら、「図面のシートサイズ(A3かA4か)を自動判別して、プリンタの用紙設定を動的に切り替えるロジック」や、「印刷結果をPDFとして保存する機能」を追加してみるのも良いでしょう。

マクロの記録から脱却し、このように「オブジェクトのライフサイクル」や「エラーへの備え」を考えながらコードを書けるようになれば、あなたはもう、単なるユーザーではありません。

「設計を自動化するエンジニア」です。

さあ、次はどんな自動化に挑戦しますか? 応援していますよ。

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