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側で設定すればクリアするとは思う)
・手間(やっぱり・・・)