【入門編】【初心者向け】図面シートの追加・並び替え・不要シートの安全な削除を自動化するVBAマクロ – SolidWorks VBA解析バイブル

スポンサーリンク

【初心者必見】SolidWorks図面、シート操作を自動化!追加・並び替え・削除マクロで作業効率UP!

皆さん、こんにちは!SolidWorks VBAの世界へようこそ。伝説の業務自動化エンジニア、〇〇(あなたの名前)です。SolidWorks APIを駆使して、日々の設計業務を劇的に効率化する魔法を、皆さんと一緒に探求していきましょう。

今回は、SolidWorks VBAの基本中の基本、「図面ファイルのシート操作」に焦点を当てます。複数シートで構成される図面ファイルにおいて、「新しいシートを追加したい」「シートの順番を入れ替えたい」「不要なシートを安全に削除したい」… そんな、設計現場で誰もが一度は思う「あるある」を、VBAマクロで解決しちゃいましょう!

「マクロの記録」機能だけでは物足りない、もっと深くSolidWorks VBAを理解したい、そんな初学者の方々にも、本質を理解してもらえるように、丁寧に解説していきますね。「ここをクリアすれば、SolidWorks VBAの図面シート操作の基本はバッチリですよ!」と、自信を持って言えるように、一緒に学んでいきましょう。

なぜ図面シート操作を自動化するのか?

皆さんの設計業務では、一つの図面ファイルに複数のシートが存在することは珍しくないはずです。例えば、

  • 部品図と組立図の混在
  • 異なる図面尺度での表現
  • 外観図と断面図の切り分け
  • 注文書や外注指示書などの別紙添付

など、様々な理由でシートが増えていきます。

これらのシート操作、手作業で行うと、

  • シートの追加・削除でミスが発生しやすい
  • シートの並び替えに手間がかかる
  • シート名の変更漏れで混乱する

といった、地味ながらも積み重なると無視できない非効率が発生します。

VBAマクロを使えば、これらの作業を一瞬で、正確に、そして繰り返し実行できます。これは、単なる作業時間の短縮に留まらず、ヒューマンエラーの撲滅という、より本質的な価値をもたらすのです。

SolidWorks VBAの「図面シート」オブジェクトに迫る!

さて、VBAで図面シートを操作するには、まず「図面シート」という概念を理解する必要があります。SolidWorks VBAでは、開いている図面ドキュメント全体を`ModelDoc2`オブジェクトで表現します。そして、この`ModelDoc2`オブジェクトの中に、図面シートを管理する機能が隠されています。

# 1. 図面シートの「コレクション」とは?

図面ファイルには、複数のシートが存在し得ます。VBAでは、このように「集まり」を扱うために「コレクション」という概念を用います。図面シートのコレクションは、`ModelDoc2`オブジェクトの`EditSheet`メソッドや`GetSheets`メソッドを通じてアクセスできます。

ここがポイント!
`ModelDoc2`オブジェクトが「図面ファイルそのもの」だとすると、`GetSheets`メソッドが返すのは「その図面ファイルに含まれる全てのシートのリスト(コレクション)」です。

# 2.シート操作の「キー」:シートインデックス

コレクション内の各シートを区別するためには、何らかの「キー」が必要です。SolidWorks VBAでは、シートのインデックス(番号)がそのキーとして機能します。

  • インデックスは0から始まります!

これはプログラミングでよくある仕様なのですが、最初のシートは「0番目」、2番目のシートは「1番目」…となります。この「0始まり」を忘れると、意図しないシートを操作してしまうことがあるので、注意が必要です。

# 3. 主要なシート操作メソッドを見てみよう

SolidWorks VBAで図面シートを操作する際に頻繁に登場するメソッドをいくつかご紹介しましょう。

  • `AddSheet()`: 新しいシートを追加します。
  • `Delete()`: 現在アクティブなシート、あるいは指定したシートを削除します。
  • `InsertSheet(Index As Integer)`: 指定したインデックスの位置に新しいシートを挿入します。
  • `Move(Index As Integer)`: 指定したインデックスの位置にシートを移動させます。
  • `ActivateSheet(Index As Integer)`: 指定したインデックスのシートをアクティブにします(表示されているシートを切り替えるイメージです)。
  • `GetName()`: アクティブなシートの名前を取得します。
  • `SetName(Name As String)`: アクティブなシートの名前を変更します。

これらのメソッドを組み合わせることで、様々なシート操作が可能になります。

実践!図面シート操作VBAマクロ集

それでは、具体的にコードを見ていきましょう。まずは、基本的な操作から、一つずつ丁寧に解説していきます。

# 【マクロ1】新規シートの追加と名前の変更

新しいシートを追加し、分かりやすい名前に変更するマクロです。

Sub AddNewSheetAndRename()

    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDrawing As SldWorks.DrawingDoc
    Dim swNewSheet As SldWorks.Sheet

    ' SolidWorksアプリケーションを取得
    Set swApp = Application.SldWorks

    ' アクティブなドキュメントを取得
    Set swModel = swApp.ActiveDoc

    ' ドキュメントが図面ドキュメントであるか確認
    If swModel Is Nothing Then
        MsgBox "図面ファイルを開いてください。", vbExclamation
        Exit Sub
    End If

    ' 図面ドキュメントオブジェクトを取得
    Set swDrawing = swModel

    ' 新しいシートを追加(シートフォーマットはデフォルトで適用されます)
    ' AddSheetメソッドは、追加された新しいシートを返します。
    Set swNewSheet = swDrawing.AddSheet

    ' 新しく追加されたシートの名前を変更
    ' swNewSheet.SetName "新規シート名" ' ここで直接名前を指定することも可能
    ' ただし、シート名が既に存在するとエラーになるため、
    ' 既存シート名との重複を避けるための工夫が必要な場合があります。

    ' 例:シート名に連番を付与する場合
    Dim sheetCount As Integer
    sheetCount = swDrawing.GetSheetCount

    ' 新しいシートの名前を設定
    ' (例: "Sheet_0", "Sheet_1" のような形式)
    swNewSheet.SetName "Sheet_" & (sheetCount - 1) ' sheetCountは既存シート数なので、インデックスは-1

    ' 変更を適用するために、シートをアクティブにする(必須ではないが、確認のために行うことが多い)
    swNewSheet.ActivateSheet

    ' 変更を再描画
    swModel.GraphicsRedraw2

    MsgBox "新しいシートが追加され、名前が変更されました。", vbInformation

    ' オブジェクトの解放 (Good Practice)
    Set swNewSheet = Nothing
    Set swDrawing = Nothing
    Set swModel = Nothing
    Set swApp = Nothing

End Sub

コード解説:

1. `Dim swApp As SldWorks.SldWorks`、`Dim swModel As SldWorks.ModelDoc2` など、必要なオブジェクト変数を宣言します。SolidWorksのオブジェクトは、その型を明示的に宣言するのが基本です。
2. `Set swApp = Application.SldWorks` で、現在実行中のSolidWorksアプリケーションのインスタンスを取得します。
3. `Set swModel = swApp.ActiveDoc` で、現在アクティブになっているドキュメント(開いているファイル)を取得します。
4. `If swModel Is Nothing Then …` で、アクティブなドキュメントがない(何も開かれていない)場合のエラー処理を行います。
5. `Set swDrawing = swModel` で、取得した`ModelDoc2`オブジェクトを`DrawingDoc`型にキャスト(型変換)します。これにより、図面固有のメソッドが使えるようになります。
6. `Set swNewSheet = swDrawing.AddSheet` で、新しいシートを「末尾」に追加します。`AddSheet`メソッドは、追加された新しいシートオブジェクトそのものを返してくれるので、その後の名前変更などに便利です。
7. `swNewSheet.SetName “Sheet_” & (sheetCount – 1)` で、新しいシートの名前を設定します。ここでは、既存のシート数(`GetSheetCount`)からインデックス(0始まり)を計算して、「Sheet\_0」、「Sheet\_1」のように連番で名前を付けています。
8. `swNewSheet.ActivateSheet` で、追加したシートをアクティブにします。これにより、画面上でそのシートが表示されます。
9. `swModel.GraphicsRedraw2` で、画面表示を更新し、変更を反映させます。
10. `Set swNewSheet = Nothing` などの行で、使用したオブジェクト変数を解放します。これは、メモリリークを防ぐための重要な習慣です。

陥りやすいエラー:

  • シート名の重複: 同じ名前のシートが図面内に存在すると、`SetName`メソッドでエラーが発生します。上記コードのように連番を付けるなどの工夫が必要です。
  • アクティブドキュメントの確認漏れ: 図面ファイルを開かずにマクロを実行すると、`swModel`が`Nothing`になりエラーとなります。

# 【マクロ2】指定したインデックスのシートを削除する

不要になったシートを、安全に削除するマクロです。削除は元に戻せないので、慎重に!

Sub DeleteSpecificSheet()

    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDrawing As SldWorks.DrawingDoc
    Dim sheetIndexToDelete As Integer
    Dim sheetCount As Integer

    ' SolidWorksアプリケーションを取得
    Set swApp = Application.SldWorks

    ' アクティブなドキュメントを取得
    Set swModel = swApp.ActiveDoc

    ' ドキュメントが図面ドキュメントであるか確認
    If swModel Is Nothing Then
        MsgBox "図面ファイルを開いてください。", vbExclamation
        Exit Sub
    End If

    ' 図面ドキュメントオブジェクトを取得
    Set swDrawing = swModel

    ' 削除したいシートのインデックスを指定
    ' 例: 2番目のシートを削除したい場合 (インデックスは0から始まるので、1を指定)
    sheetIndexToDelete = 1

    ' 現在のシート数を取得
    sheetCount = swDrawing.GetSheetCount

    ' 指定されたインデックスが有効範囲内か確認
    If sheetIndexToDelete < 0 Or sheetIndexToDelete >= sheetCount Then
        MsgBox "指定されたシートインデックス (" & sheetIndexToDelete & ") は無効です。" & vbCrLf & _
               "有効なインデックスの範囲は 0 から " & (sheetCount - 1) & " です。", vbCritical
        Exit Sub
    End If

    ' 削除するシートをアクティブにしてから削除する方が安全な場合がある
    ' (ただし、Deleteメソッドは引数でシートを指定できる場合もあるが、
    '  VBAではアクティブシートを削除するのが一般的)
    ' まず、削除対象のシートをアクティブにする
    swDrawing.ActivateSheet (sheetIndexToDelete)

    ' アクティブなシートを削除
    ' Deleteメソッドは、アクティブシートを削除します。
    ' 削除操作は元に戻せないので、本当に削除しても良いか確認することが重要です。
    Dim response As VbMsgBoxResult
    response = MsgBox("シート '" & swDrawing.GetSheetName(sheetIndexToDelete) & "' を削除しますか?" & vbCrLf & _
                      "この操作は元に戻せません。", vbYesNo + vbExclamation, "シート削除確認")

    If response = vbYes Then
        swDrawing.Delete
        MsgBox "シートが削除されました。", vbInformation
    Else
        MsgBox "シートの削除はキャンセルされました。", vbInformation
    End If

    ' 変更を再描画
    swModel.GraphicsRedraw2

    ' オブジェクトの解放
    Set swDrawing = Nothing
    Set swModel = Nothing
    Set swApp = Nothing

End Sub

コード解説:

1. `sheetIndexToDelete = 1` で、削除したいシートのインデックスを指定します。ここでは例として2番目のシート(インデックス1)を指定しています。
2. `sheetCount = swDrawing.GetSheetCount` で、現在のシート数を取得します。
3. `If sheetIndexToDelete < 0 Or sheetIndexToDelete >= sheetCount Then …` で、指定されたインデックスが有効な範囲内にあるかチェックします。無効なインデックスを指定するとエラーになるため、このチェックは非常に重要です。
4. `swDrawing.ActivateSheet (sheetIndexToDelete)` で、削除したいシートをアクティブにします。SolidWorks VBAの`Delete`メソッドは、基本的にアクティブなシートを削除するため、この手順が必要です。
5. `MsgBox`で、ユーザーに削除の意思確認を行います。削除操作は元に戻せないため、この確認プロセスは絶対に入れるべきです。
6. `If response = vbYes Then swDrawing.Delete …` のブロック内で、ユーザーが「はい」を選択した場合にのみ、`swDrawing.Delete`メソッドが実行されます。
7. `swModel.GraphicsRedraw2` で、画面表示を更新します。

陥りやすいエラー:

  • インデックスの指定ミス: 0始まりであることを忘れ、意図しないシートを削除してしまう。
  • 確認なしの削除: ユーザー確認なしに削除処理を実行してしまうと、誤操作によるデータ損失につながる。
  • 全てのシートを削除しようとする: 図面ドキュメントには最低1つのシートが必要です。最後のシートを削除しようとするとエラーになります。

# 【マクロ3】シートの並び替え

シートの順番を指定した位置に移動させるマクロです。

Sub ReorderSheets()

    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDrawing As SldWorks.DrawingDoc
    Dim sourceSheetIndex As Integer
    Dim targetIndex As Integer
    Dim sheetCount As Integer

    ' SolidWorksアプリケーションを取得
    Set swApp = Application.SldWorks

    ' アクティブなドキュメントを取得
    Set swModel = swApp.ActiveDoc

    ' ドキュメントが図面ドキュメントであるか確認
    If swModel Is Nothing Then
        MsgBox "図面ファイルを開いてください。", vbExclamation
        Exit Sub
    End If

    ' 図面ドキュメントオブジェクトを取得
    Set swDrawing = swModel

    ' 並び替えたいシートの現在のインデックスを指定
    ' 例: 3番目のシート (インデックス2) を移動したい場合
    sourceSheetIndex = 2

    ' 移動先のインデックスを指定
    ' 例: 1番目のシートの位置 (インデックス0) に移動したい場合
    targetIndex = 0

    ' 現在のシート数を取得
    sheetCount = swDrawing.GetSheetCount

    ' 指定されたインデックスが有効範囲内か確認
    If sourceSheetIndex < 0 Or sourceSheetIndex >= sheetCount Then
        MsgBox "移動元シートのインデックス (" & sourceSheetIndex & ") は無効です。" & vbCrLf & _
               "有効なインデックスの範囲は 0 から " & (sheetCount - 1) & " です。", vbCritical
        Exit Sub
    End If
    If targetIndex < 0 Or targetIndex >= sheetCount Then
        MsgBox "移動先シートのインデックス (" & targetIndex & ") は無効です。" & vbCrLf & _
               "有効なインデックスの範囲は 0 から " & (sheetCount - 1) & " です。", vbCritical
        Exit Sub
    End If

    ' 移動元と移動先が同じ場合は何もしない
    If sourceSheetIndex = targetIndex Then
        MsgBox "移動元と移動先が同じです。並び替えは行いません。", vbInformation
        Exit Sub
    End If

    ' 実際にシートを移動
    ' Moveメソッドは、指定したシートを、指定したインデックスの位置に移動させます。
    ' 移動元のシートは、Moveメソッド実行前にアクティブにする必要はありません。
    swDrawing.Move (sourceSheetIndex), targetIndex

    ' 移動されたシートをアクティブにする(確認のため)
    swDrawing.ActivateSheet (targetIndex)

    ' 変更を再描画
    swModel.GraphicsRedraw2

    MsgBox "シートが移動されました。", vbInformation

    ' オブジェクトの解放
    Set swDrawing = Nothing
    Set swModel = Nothing
    Set swApp = Nothing

End Sub

コード解説:

1. `sourceSheetIndex` で、移動させたいシートの現在のインデックスを指定します。
2. `targetIndex` で、移動させたいシートの新しいインデックス(移動先の位置)を指定します。
3. インデックスの有効範囲チェックを`sourceSheetIndex`と`targetIndex`の両方に対して行います。
4. `If sourceSheetIndex = targetIndex Then …` で、移動元と移動先が同じ場合に処理をスキップします。
5. `swDrawing.Move (sourceSheetIndex), targetIndex` が、シートの並び替えを実行する主要なメソッドです。このメソッドは、`sourceSheetIndex`で指定されたシートを、`targetIndex`で指定された位置に移動させます。ここで注意が必要なのは、`Move`メソッドは、移動後のシートのインデックスを返すわけではないということです。
6. `swDrawing.ActivateSheet (targetIndex)` で、移動先のシート(移動後のシート)をアクティブにします。これは、ユーザーが並び替えの結果を確認しやすくするためです。
7. `swModel.GraphicsRedraw2` で、画面表示を更新します。

陥りやすいエラー:

  • インデックスの混同: 移動元と移動先のインデックスを間違える。
  • 相対的なインデックスの誤解: 例えば、シートAをシートBの前に移動させた後、別のシートCを移動させようとしたときに、シートAの移動によって他のシートのインデックスが変わっていることを考慮しない。`Move`メソッドは、指定したインデックスの位置に「挿入」するイメージで、それ以降のシートが自動的に後ろにずれます。

さらにステップアップ!シート操作の応用テクニック

ここまでは基本的な操作でしたが、これらの基本を組み合わせることで、より高度な自動化が可能になります。

# 1. 特定のシート名を検索して操作する

インデックスではなく、シート名でシートを特定して操作したい場合も多いでしょう。

Sub OperateSheetByName()

    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDrawing As SldWorks.DrawingDoc
    Dim sheetName As String
    Dim sheetIndex As Integer
    Dim i As Integer

    ' SolidWorksアプリケーションを取得
    Set swApp = Application.SldWorks

    ' アクティブなドキュメントを取得
    Set swModel = swApp.ActiveDoc

    ' ドキュメントが図面ドキュメントであるか確認
    If swModel Is Nothing Then
        MsgBox "図面ファイルを開いてください。", vbExclamation
        Exit Sub
    End If

    ' 図面ドキュメントオブジェクトを取得
    Set swDrawing = swModel

    ' 操作したいシートの名前を指定
    sheetName = "部品表" ' 例: 部品表シートを検索

    ' シート名を検索し、そのインデックスを取得
    sheetIndex = -1 ' 見つからなかった場合の初期値
    For i = 0 To swDrawing.GetSheetCount - 1
        If swDrawing.GetSheetName(i) = sheetName Then
            sheetIndex = i
            Exit For ' 見つかったらループを抜ける
        End If
    Next i

    ' シートが見つかった場合
    If sheetIndex <> -1 Then
        ' 見つかったシートをアクティブにする
        swDrawing.ActivateSheet sheetIndex

        ' ここで、見つかったシートに対する操作を追加できます
        ' 例:シート名を変更する
        ' swDrawing.GetSheet(sheetIndex).SetName "新しい部品表名" ' GetSheetメソッドでシートオブジェクトを取得
        ' 例:シートを削除する(確認を挟むこと!)
        ' Dim response As VbMsgBoxResult
        ' response = MsgBox("シート '" & sheetName & "' を削除しますか?", vbYesNo + vbExclamation)
        ' If response = vbYes Then
        '     swDrawing.Delete ' アクティブなシートが削除される
        ' End If

        MsgBox "シート '" & sheetName & "' (インデックス: " & sheetIndex & ") が見つかり、アクティブになりました。", vbInformation
    Else
        MsgBox "シート '" & sheetName & "' は見つかりませんでした。", vbExclamation
    End If

    ' 変更を再描画
    swModel.GraphicsRedraw2

    ' オブジェクトの解放
    Set swDrawing = Nothing
    Set swModel = Nothing
    Set swApp = Nothing

End Sub

コード解説:

  • `sheetName = “部品表”` で、検索したいシートの名前を指定します。
  • `For i = 0 To swDrawing.GetSheetCount – 1` のループで、全てのシートを順番にチェックします。
  • `If swDrawing.GetSheetName(i) = sheetName Then` で、シート名が一致するかどうかを確認します。
  • 一致した場合、`sheetIndex = i` でそのインデックスを記録し、`Exit For` でループを抜けます。
  • `If sheetIndex <> -1 Then …` で、シートが見つかった場合の処理(ここではアクティブ化)を行います。
  • `swDrawing.GetSheet(sheetIndex)` を使うと、指定したインデックスの`Sheet`オブジェクトを取得できます。これを使えば、シート名の変更だけでなく、フォーマットの適用なども可能です。(ただし、`Sheet`オブジェクトは`ModelDoc2`オブジェクトほど多機能ではありません。シート固有のプロパティやメソッドは限られます。)

パフォーマンスとオブジェクトのライフサイクルについて

SolidWorks VBAを扱う上で、パフォーマンスとオブジェクトのライフサイクルは非常に重要な概念です。

  • オブジェクトの解放: マクロの最後で `Set obj = Nothing` を実行して、使用したオブジェクト変数を解放することを忘れないでください。これにより、メモリリークを防ぎ、SolidWorks全体の動作を安定させることができます。特に、ループ処理で多数のオブジェクトを生成・使用する場合は、こまめな解放が重要です。
  • `GraphicsRedraw2` の使用: 画面表示に影響を与える操作(シートの追加・削除・移動など)を行った後は、`swModel.GraphicsRedraw2` を呼び出して画面を更新する必要があります。これを忘れると、操作は実行されているにも関わらず、画面上では反映されない、という事態が発生します。ただし、頻繁に呼び出しすぎるとパフォーマンスに影響する場合もあるため、必要な箇所でのみ使用するようにしましょう。
  • エラーハンドリング: 実際の業務で使うマクロでは、`On Error Resume Next` や `On Error GoTo Label` を用いたエラーハンドリングを適切に実装することが不可欠です。今回は初学者向けのため省略していますが、実用的なマクロを作成する際には必ず考慮してください。

まとめ:図面シート操作の自動化は、SolidWorks VBAの第一歩!

いかがでしたでしょうか?今回は、SolidWorks VBAを使って図面ファイルのシートを追加、並び替え、削除するといった基本的な操作を自動化する方法を解説しました。

  • `ModelDoc2` オブジェクトが図面ファイル全体を指すこと。
  • シートはインデックス(0始まり)で管理されること。
  • `AddSheet`, `Delete`, `Move`, `ActivateSheet`, `SetName` といったメソッドが主要な操作を担うこと。
  • インデックスの有効範囲チェックやユーザー確認が、安全なマクロ作成の鍵であること。

これらの基本をしっかりと理解し、今回ご紹介したコードを実際に試していただくことで、皆さんのSolidWorks VBAスキルは確実に一段階アップするはずです。

図面シート操作の自動化は、SolidWorks VBAでできることの、ほんの入り口に過ぎません。しかし、この「入り口」をしっかりとクリアすることで、より複雑な自動化や、より高度なAPIの活用へと、スムーズに進んでいけるでしょう。

これからも、皆さんの設計業務を劇的に効率化する、SolidWorks VBAの魅力的な世界を、どんどんご紹介していきますので、どうぞお楽しみに!

「ここをクリアすれば、SolidWorks VBAの図面シート操作の基本はバッチリですよ!」

さあ、皆さんも今日から、図面シート操作の自動化に挑戦し、設計業務の効率化を実感してください!

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