シートセットマネージャ(SSM)の取得と編集|AutoCAD VBAマクロの作成方法

AutoCAD VBAでシートセットマネージャ(SSM)のシートタイトルや番号などの取得と編集を行うには、[AcSmComponents25 1.0 Type Library]を参照設定することで利用可能になる、AcSmSheetSetMgrオブジェクト、AcSmSheetSetオブジェクト、AcSmSubsetオブジェクトなどを利用する必要があります。本ページではこれらオブジェクトを使って指定のシートセットマネージャ内のサブセット、およびシートの情報を取得したり名前の変更をする方法を解説していきます。

本ページで学べる内容は以下のとおりです。

[AcSmComponents25 1.0 Type Library]について

 シートセットを取得する方法

 セット内のサブセットとシートを取得する方法
セット内のサブセットとシートの情報を編集する方法

指定のシートセット内にサブセットやシートを作成する方法は下記ページを参照ください。

AcSmComponents25 1.0 Type Library

VBAでシートセットマネージャを操作するには[AcSmComponents25 1.0 Type Library]の参照設定を行っておく必要があります。VBEの[メニューバー]>[ツール]>[参照設定]より参照設定ウィンドウを起動して[AcSmComponents○○ 1.0 Type Library](※○○はバージョンによる)の設定を行います。

このライブラリ(ACSMCOMPONENTS25Lib)には様々なオブジェクトが含まれており、それぞれのオブジェクトが持つメソッドを実行することでシートセットマネージャを操作することができます。その中でもAcSmSheetSetMgrオブジェクトは各オブジェクトにアクセスするためのオブジェクトで、下記のように記載することでAcSmSheetSetMgrオブジェクトを取得(作成)することができます。

    Dim sheetSetMgr As AcSmSheetSetMgr
    Set sheetSetMgr = New AcSmSheetSetMgr
    
    'シートセット操作の処理

    Set sheetSetMgr = Nothing

 
ACSMCOMPONENTS25Lib オブジェクト 

シートマネージャの主要なオブジェクトとしてACSMCOMPONENTS25Libには下表のものが用意されています。これらオブジェクトが持つメソッドを実行することで、指定のサブセットやシートに対して名称や番号などの取得や編集の操作を行うことができるようになります。AcSmSheetSetMgrオブジェクトを使うことで下表の上から順にオブジェクトを取得していくことができます。

オブジェクト名 操作対象
AcSmDatabase シートセット データベース
AcSmSheetSet シートセット
AcSmSubset サブセット
AcSmSheet シート

これらオブジェクトは通常のオブジェクトとは違い、VBEのデバッグ環境(ローカル/ウォッチウィンドウ)で中身を確認することができません。中身を確認したい場合はDebug.Printなどでオブジェクトが持つ情報を明示的に描画しながらデバッグする必要があります。
 

シートセットの情報取得

AcSmSheetSetMgrオブジェクトからサブセット(AcSmSubset)やシート(AcSmSheet)にアクセスして、各要素が保持している情報を取得するには下記のようなコードを記載します。通常のVBAオブジェクトの構造とは違い、「Enumerator」という"コレクション内の要素を一つずつ順番に処理するための仕組み“を使ってオブジェクトの取得を行う必要があります。(※GetAllComponents関数参照)

下記コードの処理を実行することで、指定のシートセットファイル内のサブセットとシート情報を取得して、イミディエイトウィンドウに各要素の名称を出力することができます。

Option Explicit
Sub main()
    
    Dim sheetSetMgr As AcSmSheetSetMgr
    Dim db As AcSmDatabase
    Dim sheetSet As AcSmSheetSet
    Dim comps As Collection
    Dim comp As IAcSmComponent
    Dim i As Long
    
    
    Set sheetSetMgr = New AcSmSheetSetMgr
    
    'シートセットデータベースを開いて取得
    Set db = sheetSetMgr.OpenDatabase("C:\...\dataset.dst", False)

    '既に開かれている場合は下記でも可
    'Set db = sheetSetMgr.FindOpenDatabase("C:\...\dataset.dst")
    
    'シートセット取得
    Set sheetSet = db.GetSheetSet
    Debug.Print sheetSet.GetName

    'シートセット内の全要素(サブセット,シート)取得
    Call GetAllComponents(sheetSet, comps)
    For i = 1 To comps.Count
        Set comp = comps.Item(i)
        Debug.Print "Type: "; comp.GetTypeName
        Debug.Print "Name: "; comp.GetName
    Next
    
    'シートセットを閉じる    
    'Call sheetSetMgr.Close(db)
    
    Set sheetSetMgr = Nothing
    
End Sub

'再帰処理でシートセット内の全要素(サブセット,シート)取得
Public Function GetAllComponents(parent As IAcSmComponent, _
                                 components As Collection)

    Dim children As Collection
    Dim sheetSet As AcSmSheetSet
    Dim subset As AcSmSubset
    Dim enumPersist As IAcSmEnumComponent
    Dim obj As IAcSmPersist
    
    If components Is Nothing Then Set components = New Collection

    If parent.GetTypeName = "AcSmSheetSet" Then
        Set sheetSet = parent
        Set enumPersist = sheetSet.GetSheetEnumerator
    ElseIf parent.GetTypeName = "AcSmSubset" Then
        Set subset = parent
        Set enumPersist = subset.GetSheetEnumerator
    Else
        Debug.Print parent.GetTypeName
        Exit Function
    End If

    Set obj = enumPersist.Next
    Do While Not obj Is Nothing
    
        Call components.Add(obj)
        
        If obj.GetTypeName = "AcSmSubset" Then
            Call GetAllComponents(obj, components)
        End If
        Set obj = enumPersist.Next
    Loop

End Function

.dstファイルの取得

シートセットファイル(.dst)はAcSmSheetSetMgrオブジェクトのOpenDatabaseメソッドもしくはFindOpenDatabaseメソッドで取得が可能です。いずれも引数に取得したいdstファイルのフルパスを指定することで、そのシートセットァイルのシートセット データベースオブジェクト(AcSmDatabase)にアクセスすることができます。このAcSmDatabaseに対してGetSheetSetメソッドを実行することでシートセットオブジェクト(AcSmSheetSet)の取得ができます。

FindOpenDatabaseメソッドは指定のdstファイルが既に開かれている必要があります。OpenDatabaseメソッドは指定のdstファイルを開いて取得するメソッドですが、第2引数をFalseとすることで既に開かれていてもシートセット データベースの取得が可能になり、Trueの場合は既に指定のdstファイルが開かれている場合にはエラーが発生します。状況に応じてこれらメソッドを使い分けることで任意のパターンでdstファイルを取得するという処理を実装することができます。
 

シートセットの情報編集

前項の内容で取得したシートセット内の各要素(サブセット、シート)の情報を編集するには下記のようなコードを記載します。(オブジェクトの取得部分は前項のものと同じ) 情報取得時はGetNameメソッドやGetTypeNameメソッドのようなGet~系のメソッドを利用していましたが、編集する場合はSetNameメソッドSetNumberメソッドのようなSet~系のメソッドを利用します。

下記コードの処理を実行することで、指定のシートセットファイル内のサブセットとシートの名称の接尾に一括で"-1″を付与することができます。SSMでは編集したあと[Ctrl+Z]などで元に戻すことはできないので注意が必要です。(コード内に修正用の処理もコメントで入れています)

Option Explicit
Sub main()
    
    Dim sheetSetMgr As AcSmSheetSetMgr
    Dim db As AcSmDatabase
    Dim sheetSet As AcSmSheetSet
    Dim comps As Collection
    Dim comp As IAcSmComponent
    Dim i As Long
    
    
    Set sheetSetMgr = New AcSmSheetSetMgr
    
    'シートセットデータベースを開いて取得
    Set db = sheetSetMgr.OpenDatabase("C:\...\dataset.dst", False)

    '既に開かれている場合は下記でも可
    'Set db = sheetSetMgr.FindOpenDatabase("C:\...\dataset.dst")
    
    'シートセット取得
    Set sheetSet = db.GetSheetSet
    Debug.Print sheetSet.GetName

    'シートセット内の全要素(サブセット,シート)取得
    Call GetAllComponents(sheetSet, comps)
    For i = 1 To comps.Count
        Set comp = comps.Item(i)

        'ロックしないと編集不可
        Call db.LockDb(comp)
        
        '現在の名称の接尾に"-1"を付与
        Call comp.SetName(comp.GetName & "-1")
        
        '上記で付与した名称を元に戻す(修正用)
        'Call comp.SetName(Replace(comp.GetName, "-1", ""))

        'ロックを解除
        Call db.UnlockDb(comp)
    Next
    
    'シートセットを閉じる    
    'Call sheetSetMgr.Close(db)

    Set sheetSetMgr = Nothing
    
End Sub

'再帰処理でシートセット内の全要素(サブセット,シート)取得
Public Function GetAllComponents(parent As IAcSmComponent, _
                                 components As Collection)

    Dim children As Collection
    Dim sheetSet As AcSmSheetSet
    Dim subset As AcSmSubset
    Dim enumPersist As IAcSmEnumComponent
    Dim obj As IAcSmPersist
    
    If components Is Nothing Then Set components = New Collection

    If parent.GetTypeName = "AcSmSheetSet" Then
        Set sheetSet = parent
        Set enumPersist = sheetSet.GetSheetEnumerator
    ElseIf parent.GetTypeName = "AcSmSubset" Then
        Set subset = parent
        Set enumPersist = subset.GetSheetEnumerator
    Else
        Debug.Print parent.GetTypeName
        Exit Function
    End If

    Set obj = enumPersist.Next
    Do While Not obj Is Nothing
    
        Call components.Add(obj)
        
        If obj.GetTypeName = "AcSmSubset" Then
            Call GetAllComponents(obj, components)
        End If
        Set obj = enumPersist.Next
    Loop

End Function

編集時のロック/アンロック

各オブジェクトを編集するには、そのオブジェクトにロックをかける必要があります。これは、同じファイルが別の端末から同時に呼び出された場合に、編集の衝突を防ぐための機能です。処理としては対象のオブジェクトを持つAcSmDatabaseに対してLockDbメソッドを実行します。このメソッドの引数にロックしたいオブジェクトを指定すると、そのオブジェクトにロックがかかり、編集できるようになります。 編集が終わったらオブジェクトのアンロックをして元に戻す必要もあります。アンロックはLockDbメソッドと同じ考え方でUnlockDbメソッドを実行するだけです。

 

まとめ

今回の内容をまとめると以下のとおりです。

 SSMの操作は[AcSmComponents○○ 1.0 Type Library]の参照設定が必要
 シートセットの各オブジェクトはAcSmSheetSetMgrオブジェクトから順に取得可能
シートセットの各オブジェクトは「Enumerator」の仕組みを使って取得する必要がある

オブジェクトの取得ができたらGet~/Set~系のメソッドで操作が可能
 編集するにはオブジェクトのロック/アンロックが必要

本ページではシートセットマネージャ(SSM)の取得と編集する方法についての内容でした。
SSMのオブジェクトは少し特殊な作りとなっており、一般的なVBAオブジェクトのように扱うことができません。そのため内容としては少し難しい内容となっていますが、オブジェクトの取得さえできればあとは各オブジェクトが持つメソッドを使って操作するだけです。メソッドはオブジェクトブラウザーやAutoDesk公式ヘルプなどを確認することで調べることができます。
 

メインページへ戻る
 

 関連書籍

 Autodesk公式リンク

参考:シートセット マネージャのオブジェクトの概要(SSO)

2025年6月7日AutoCAD,VBA