読者です 読者をやめる 読者になる 読者になる

C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

CATVBAの標準モジュールをマクロで削除したい (希望)2

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


imihitoさんから重要なコメントを頂いたので、早速試してみました。
試したコードはこちら

'vba
Sub MSAPC_Apc_Test()
    Dim oApc 'As Apc
    Set oApc = CreateObject("MSAPC.Apc")
    Dim oVBE 'As VBE
    Set oVBE = oApc.VBE 'ここでエラー
End Sub

ダメでした。 出てくるエラーは

VBA Initialization failed due to an invalid License Key

ライセンスが無いよ って事ですかね?

Apcは取得できているようなので、ローカルウィンドウを見ると
f:id:kandennti:20160803132838p:plain
中身的には、ほぼ何も取得できていない感じが。
(Guidで0連発って・・・)

"MSAPC" で検索するとCOEのこれがヒットしました。
COE : Forums : Macro Libraries problem on Win 7 64bit w/Office 2010

(Little Cthulhu氏 相変わらずスゴイ)

WinXP 32bitで使っていたプロジェクトファイルを、Win7 64bitで取り込んだけど、
マクロが動かなかったんだよ。
 ↓
新しいプロジェクトファイルを作成して、エクスポートしたモジュール等をインポートしなおせば
大丈夫。 Dave Frank氏のコードを参考にエクスポートインポートを自動化する
マクロを作ってみたよ。
(念の為、エクスポートはチマチマやる必要がありますが、インポートはファイルをまとめて
VBEにD&Dすれば出来ます)

って書いてあるように解釈しました。

過去にもWinAPIで32bitでは動くけど、64bitでは上手く取得出来なかった
事が有ったので、これも64bitではダメなのかな? と感じました。
何か見落としがあるようであれば、指摘していただけると助かります。

                                            • -

追記です。
やっぱりバージョンの食い違いによる事が原因でした。

まず、VBAのバージョンを確認します。
f:id:kandennti:20160804103305p:plain

続いて参照設定を行います。
f:id:kandennti:20160804103313p:plain

VBAが6.5だったので、"Microsoft APC 6.2 Object Library" にチェックを入れます。
VBAが7.Xの場合は、"Microsoft APC 7.1 Object Library" になるだろう
と思っています。(未確認)
恐らくメジャーバージョンさえ一致してれば良いのかな?

続いて、次のコードを用意しました。

'vba 現在開かれているVBプロジェクト数を表示
'事前に参照設定しておく必要あります

Sub GetVBE_Sample()
    Dim oVbe As Object: Set oVbe = GetVBE
    If oVbe Is Nothing Then Exit Sub
    
    MsgBox "現在開かれているプロジェクト数は" + CStr(oVbe.VBProjects.Count) + "個です"
End Sub

Private Function GetVBE() As Object ' VBE
    Set GetVBE = Nothing
    
    'APC取得
    On Error Resume Next
        Dim oApc As Apc: Set oApc = New Apc
    On Error GoTo 0
    
    If IsEmpty(oApc) Then
        MsgBox "参照設定が足りません"
        Exit Function
    End If
    
    'APCバージョン取得
    Dim APCVerAry As Variant: APCVerAry = Split(oApc.APCVersion, ".")
    Dim APCVer&: APCVer = CLng(APCVerAry(0))
    
    'VBAバージョン取得
    Dim VBAVer&: VBAVer = -1
    #If VBA6 Then
        VBAVer = 6
    #ElseIf VBA7 Then
        VBAVer = 7
    #Else
        MsgBox "VBAのバージョンが未対応です"
        Exit Function
    #End If
    
    'APCとVBAのバージョンチェック
    If Not APCVer = VBAVer Then
        MsgBox "APCとVBAのバージョンが異なります" + vbNewLine + _
               "APCVer:" + oApc.APCVersion + vbNewLine + _
               "VBAVer:" + CStr(VBAVer) + ".X"
        Exit Function
    End If
    
    'VBE取得
    Set GetVBE = oApc.VBE
End Function

(コードはバージョンの食い違いをチェックしていますが、実際に食い違う場合は
"参照設定が足りません" の所で引っかかると思います)

これを実行すると、こんな感じでVBエディターのTreeにぶら下がっている
プロジェクト数が表示されればOKです。
f:id:kandennti:20160804103327p:plain

VBEが取得できているので、後はExcel等のサンプルコードが流用できるような
気がしています。



念の為、CreateObjectを使った方法も考えて試してみました。
Excelの場合、バージョン指定してのオブジェクトの取得が出来ます。
Excelオブジェクト | Excel活用術

真似てこんなコードを作り実行しましたが

'vba
Sub MSAPC_Apc_Test2()
    Dim oApc 'As Apc
    Dim ApcVerName$, i&
    On Error Resume Next
        For i = 0 To 1000
            ApcVerName = "MSAPC.Apc." + CStr(i)
            Set oApc = CreateObject(ApcVerName)
            If Not IsEmpty(oApc) Then
                MsgBox "「" + ApcVerName + "」で取得出来ました"
                Exit For
            End If
        Next
    On Error GoTo 0
    MsgBox "該当なし"
End Sub

ダメでした。 CreateObject("MSAPC.Apc") で取得できるのは
後にインストールされた方か、新しいバージョンの方になるような気がしています。
レジストリを変更したりすれば、何とかなるのかも知れませんが
ここは素直に参照設定した方が無難な気がしました。

imihitoさん貴重な情報ありがとうございました。 ここまで出来れば
COEのサンプルコードも利用できそうですw

                                            • -

さらに追記です。
imihitoさんにさらなるアドバイスを頂きました。

参照設定無しのCreateObjectバージョンです。(自宅のため未テスト)

'vba 現在開かれているVBプロジェクト数を表示
'事前に参照設定する必要ありません

Sub GetVBE_Sample_CreateObject()
    Dim oVbe As Object: Set oVbe = GetVBE
    If oVbe Is Nothing Then Exit Sub
    
    MsgBox "現在開かれているプロジェクト数は" + CStr(oVbe.VBProjects.Count) + "個です"
End Sub

Private Function GetVBE() As Object ' VBE
    Set GetVBE = Nothing
    
    '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
    
    '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 GetVBE = oApc.VBE
End Function

結局全て教わっちゃいました。