C#ATIA

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

CATVBAの標準モジュールをマクロで削除出来たよ。

こちらの続きです。
CATVBAの標準モジュールをマクロで削除したい (希望)2 - C#ATIA


何から何まで教わっていながら、やっていませんでした、スイマセン。
出来上がりましたので、ご報告を。

コード等はいつものGrabCADさんにUpしております。
GrabCAD - CAD library


マクロの実行は、標準モジュールの "RemoveRecordingMacro_Main"
の "RemoveRecordingMacro_Start" 関数から開始です。
※開発者向けのマクロの為、VBEditorからの起動しかテストしてません。

ダイアログが表示されます。センスが悪いのですが、僕には
これが限界です。
f:id:kandennti:20160830123847p:plain
"VBプロジェクト名" コンボボックスから削除対象となるモジュールを持つ
プロジェクトを選択して下さい。

リストボックス内には、「モジュール」から始まる名称の標準モジュールのみが
表示されます。日本語環境での利用を想定している為この様な
仕様としましたが、他言語での利用を希望する方は、
標準モジュールの "RemoveRecordingMacro_Main" 内の

・・・

'リストに表示させるフィルタ
'標準モジュールかつ"モジュール"で始まるか?
'vbext_ComponentType
'1-vbext_ct_StdModule 2-vbext_ct_ClassModule 3-vbext_ct_MSForm
Private Function CompListFilterCheck(ByVal Comp As Object) As Boolean
    CompListFilterCheck = False
    If Not Comp.Type = 1 Then Exit Function
    Dim Name$: Name = Comp.Name
    'If Not InStr(Comp.Name, "モジュール") = 1 And _
    '   Not InStr(Comp.Name, "Module") = 1 Then
    If Not InStr(Comp.Name, "モジュール") = 1 Then
         Exit Function
    End If
    CompListFilterCheck = True
End Function

・・・

を条件を修正する事で、可能かと思われます。

右側のテキストが表示される部分は、最後にリストで選択された
モジュール内の関数名を表示しています。
標準モジュールの情報としては、やや不足気味ではありますが、
スペースの関係上、この様にしました。
何も情報が無いまま、削除する?しない?を決めるには
あまりに不安だった為・・・。


リスト選択後 "選択リストを削除" ボタンを押す事で、確認用のダイアログ が
表示されます。
f:id:kandennti:20160830123902p:plain
削除実行の際は "はい" を選択してください。
先程の画面の物を、全選択して実行すると
f:id:kandennti:20160830123907p:plain
左の状態から、右の状態になります。 が、
プロジェクトを保存しないと再度開いた際、元に戻ります。
(マクロではプロジェクトの保存は行っていません)


テストは "VBA6.5" と "VBA7.1" で行っています。
VBA7の場合は、この様な訳のわからないダイアログが表示されマクロが
実行できないかと思われます。
f:id:kandennti:20160830123922p:plain
その際は、標準モジュールの "RemoveRecordingMacro_Main" 内の宣言部分の

・・・

'*******
Private Const MSAPC_Apc_Name = "MSAPC.Apc.6.2"                  '重要です
'VBA6.x - "MSAPC.Apc.6.2"
'VBA7.x - "MSAPC.Apc" 又は "MSAPC.Apc.7.1"
'*******

・・・

MSAPC_Apc_Name定数を "MSAPC.Apc" 又は "MSAPC.Apc.7.1" に変更する事で
実行可能かと思われます。

本当は、こちらの最後の方に書いたコード
CATVBAの標準モジュールをマクロで削除したい (希望)2 - C#ATIA

    'VBAのバージョンチェック
    Dim COMObjectName$
    #If VBA6 Then
        COMObjectName = "MSAPC.Apc.6.2"
    #ElseIf VBA7 Then
        COMObjectName = "MSAPC.Apc.7.1"
    #Else
        MsgBox "VBAのバージョンが未対応です"
        Exit Function
    #End If

で、対応できるのかと思っていたのですが、上手く行きませんでした。
(VBA7.1で実行してもVBA6側を処理してしまいました)
VBAのバージョン取得は、上記のコード以外は無いと思っているのですが、
他にも判断する方法があるのかな?
(On Error ~ で囲んで、VBA7のみの型に代入するとか、かな?)


最後になりましたが、imihitoさんアドバイス無しでは実現出来ませんでした。
本当に貴重な情報ありがとうございました。