C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

プロジェクト内のモジュール類を全てエクスポート1

CATIA V5のマクロ(VBA)は、”catvba”ファイルはExcelと異なり単体ファイル
なので、バックアップが楽は楽なのですが、バイナリファイルの為、中身の
確認が出来なくて心細いです。

そこで、VBA自体で根こそぎエクスポート出来ないのかな?と思い調べたところ
やっぱり出来ました。
標準モジュール等の一括エクスポート | Excel作業をVBAで効率化

基本的にあちらの処理で良いと思いますが、CATIAの場合はBookでは無い為、
VBAエディタの取得から行う必要があります。

幸い、過去に教えて頂き試したことがありました。
CATVBAの標準モジュールをマクロで削除したい (希望)2 - C#ATIA

で、最低限な処理を行うサンプルがこちらです。

'vba アクティブなプロジェクト内のモジュールを全てエクスポート

'上書きチェックしてないので、上書きます
'事前に"Microsoft APC 7.1 Object Library"等の
'参照設定しておく必要あります


'参考にさせてもらいました
'https://vbabeginner.net/bulk-export-of-standard-modules/
'"Microsoft Visual Basic for Application Extensibilly 5.3"の参照設定は
'不要です

Option Explicit

'エクスポートフォルダ
'パスの有無は無チェックです
Private Const EXPORT_DIR = "C:\temp\vba"

Sub CATMain()

    'VBE取得
    Dim vbe As Object
    Set vbe = get_vbe()
    If vbe Is Nothing Then Exit Sub

    'アクティブなプロジェクト取得
    Dim actProject As Object
    Set actProject = get_active_project(vbe)

    'コンポーネント
    Dim vbComps As Object
    Set vbComps = actProject.VBComponents

    '確認
    Dim msg As String
    msg = vbComps.count & "個のモジュールを" & _
        "[" & EXPORT_DIR & "]にエクスポートします。" & vbCrLf & _
        "宜しいですか?"

    If MsgBox(msg, vbOKCancel + vbQuestion) = vbCancel Then
        Exit Sub
    End If

    'エクスポート
    Dim module As Object
    Dim extension As String
    Dim path As String
    For Each module In vbComps
        extension = get_extension(module)
        If Len(extension) < 1 Then GoTo CONTINUE

        path = EXPORT_DIR & "\" & module.Name & "." & extension

        module.Export path
        Debug.Print "export : " & path
CONTINUE:
    Next

    MsgBox "Done"

End Sub


'エクスポート用の拡張子取得
Private Function get_extension( _
    ByVal module As Object) _
    As String

    Dim extension As String
    Select Case module.Type
        Case vbext_ct_ClassModule
            extension = "cls"
        Case vbext_ct_MSForm
            extension = "frm"
        Case vbext_ct_StdModule
            extension = "bas"
        Case Else
            extension = ""
    End Select
    
    get_extension = extension
        
End Function


'アクティブなプロジェクト取得
Private Function get_active_project( _
    ByVal vbe As Object) _
    As Object

    'このプロジェクト名
    Dim actProjectName As String
    actProjectName = vbe.ActiveVBProject.Name

    Set get_active_project = vbe.VBProjects.Item(actProjectName)

End Function


'vbaエディタ取得
'Special_Thx Mr.imihito
Private Function get_vbe() _
    As Object

    Set get_vbe = Nothing
    
    'VBAのバージョンチェック
    Dim COMObjectName$
    #If VBA7 Then
        COMObjectName = "MSAPC.Apc.7.1"
    #ElseIf VBA6 Then
        COMObjectName = "MSAPC.Apc.6.2"
    #Else
        MsgBox "VBAのバージョンが未対応です"
        Exit Function
    #End If
    
    'APC取得
    Dim oApc As Object: Set oApc = Nothing
    On Error Resume Next
        Set oApc = CreateObject(COMObjectName)
    On Error GoTo 0
    
    'VBE取得
    If oApc Is Nothing Then
        MsgBox "MSAPC.Apcが取得できませんでした"
        Exit Function
    End If
    
    Set get_vbe = oApc.vbe

End Function

実行したモジュールが含まれるプロジェクト内の全てのモジュール類を
全てエクスポートしてくれます。もちろん、このモジュールも。
それにしても便利ですね。


調べたらまとめてインポートも出来るのですね。
標準モジュール等の一括インポート | Excel作業をVBAで効率化
いげ太さんのvbac.wsf も、こんな事を処理させていたのかな?
確か、中身を丸ごと削除して丸ごとインポートするので差分じゃ無い
ような記述を見た記憶はありますね。

インポート・エクスポート出来ると言うことは、
VBAエディタでエクスポート
・basファイルをVSCodeで編集
VBAエディタでインポート
VBAエディタでデバッグ
のような方法で出来そうな気がしますが、面倒かな?
フォーム以外はテキストなので、gitも使えると思うし。

デメリットは
・CATIAのオブジェクト類のインテリセンスが出ない
 (何か方法あるのかな?)
エンコードVSCode側で設定すればクリアするとは思う)
・手間(やっぱり・・・)