こちらの続きです。
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は取得できているようなので、ローカルウィンドウを見ると
中身的には、ほぼ何も取得できていない感じが。
(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のバージョンを確認します。
続いて参照設定を行います。
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です。
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
結局全て教わっちゃいました。