実現したいこと
VBAで正規表現の処理が遅い為、Visual Studio2022を使って一部分だけ高速化したいと思い、VBAからVisual Studio2022のVisual Basic呼出しを勉強始めました。
発生している問題・分からないこと
VBAで独自の.NETライブラリを使うには?[VB]
https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/1063vbausedotnet/vbausedotnet.html
を参考にVisual Studio2022でDLLを作成できたのですがExcel2024で参照設定からDLLファイルを指定しても”指定されたファイルへの参照は登録できません”が出てしまいます。
記事自体が2011/08/04の物で最新の環境では修正が必要なのでしょうか。
エラーメッセージ
error
1指定されたファイルへの参照は登録できません
該当のソースコード
Visual
1Imports System.Net 2 3' クラスをCOM経由でアクセス可能にする 4<ComClass(WebPage.ClassId, WebPage.InterfaceId, WebPage.EventsId)> 5Public Class WebPage 6 7 ' COM用のGUID値{ 8 Public Const ClassId As String = "CC53CCB6-87A8-47C5-8D42-2B5F5513E902" 9 Public Const InterfaceId As String = "1C330656-2A96-4091-80E9-33B2928754F3" 10 Public Const EventsId As String = "8A5C78BF-907E-4BF5-9223-4D9EAE4390AB" 11 12 ' VBAから利用できるメソッド 13 Public Function GetText(ByVal url As String) As String 14 Dim wc As New WebClient() 15 Return wc.DownloadString(url) 16 End Function 17 18End Class 19
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
VBAからVisual Studioを呼び出すでGoogle検索しましたがVisual Basicでの判りやすいサンプルが見つかりませんでした。
補足
特になし
Visual Studio 2022では.NETアセンブリのCOMでも既定でAnyCPUでビルドされていると思います。Excel2024に合せてx64でビルドしてみてはどうでしょうか。
コメントありがとうございます。
コンパイラの設定でターゲットCPUをx68にしてDLLを再作成して見ましたが変わらず
”指定されたファイルへの参照は登録できません”
が出てしまいます。
参照設定でdllではなく、tlbを選択してみては?
コメントありがとうございます。
bin\Debugには.dll .pdb .xmlの3ファイルしかない状態です。
.tlbはコンパイラ時無いか設定すると出るのでしょうか?
コンパイルの所で、COM相互運用機能の登録にチェックはつけてますか?
2022にはないのかな。。
@質問者 kakeruさん
回答しようかとも思いましたが今のところ情報が少なく不確かな面があるのでコメントで失礼します。
尚、こちらで試したところではWindows 10, Visual Studio 2022, Excel2013(随分古いですが)の32ビット版で参考にされたページに沿ってやった内容でExcel VBAからCOMのクラスライブラリとしてメソッドを呼び出せました。
> bin\Debugには.dll .pdb .xmlの3ファイルしかない状態です。
> .tlbはコンパイラ時無いか設定すると出るのでしょうか?
1. 使われているExcel 2024は64ビット版ですか? 32ビット版もあるようなのでまずそれも確認してください。まあ、Excelの参照設定から「参照可能なライブラリファイル」一覧に出てくるようなら、大丈夫だと思うのですが。
2. 私の方では環境のせいか.NET 9や8でのクラスライブラリのビルドができなかったので、.NET Framework(4.8)で「COM相互運用機能の登録」をON、x86でビルドしました。
3. 古いCOM(*.dll)が登録されてしまうと何を使っているか分からなくなりがちなので、regasmコマンドで登録解除をするようにして新しいものを試すことをお勧めします。
4. 通常はx64なら ClassLibrary2\bin\x64、x86なら ClassLibrary2\bin\x86
のように、ターゲットを意識した名前のディレクトリ下に生成されます。*.tlbも生成されます。間違ったDLLファイルを登録しないよう、ファイルのタイムスタンプに気を付け、Excelの参照設定などで適切なファイルのPATHになっているか確認してください。GUIDを変えたりして古い*.DLLのCOMの登録情報になったままなどもありがちです。
5. お使いのWindowsバージョン等も詳細に記載すると、より詳しい方がコメントや回答をくださるかもしれません。
[一部修正、追記済み]
コメントありがとうございます。
C:\Windows\Microsoft.NET\Framework\v4.0.30319>regasm /tlb C:\Users\Win10_1073_TEST\source\repos\ClassLibraryForVBA2\ClassLibraryForVBA2\bin\Debug\ClassLibraryForVBA2.dll /unregister
を実行した所下記エラーが出ました。
RegAsm : error RA0000 : 'C:\Users\Win10_1073_TEST\source\repos\ClassLibraryForVBA2\ClassLibraryForVBA2\bin\Debug\ClassLibraryForVBA2.dll' は有効な .NET アセンブリではないため、読み込めませんでした。
その後ビルド実行した所、前回と同じ場所に.tlbも作成され「参照可能なライブラリファイル」一覧にもでてVBAから呼出しできました。
エラーが出ましたがregasmコマンドで登録解除の効果が有った用です。
(今までは参照設定の参照ボタンをクリックでDLL指定してエラーがでてました)
問題が解決し、ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
すいません、VS2022が入ってる環境ではOKなのですが、別の環境へ.tlb .dllコピーしたらエラーがでました。
VMware(R) Workstation 上Windows10環境でVisual Studio 2022 ビルドExcel 2024は64ビットでは問題ありません。
VMware(R) Workstation 上Windows10環境Excel 2013は64ビットへ.tlb .dllコピーしました。
管理者権限のドス窓でコピーしたフォルダーに移動後
C:\Users\Win_10ENT_TEST\Documents\VS2022テスト>C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm ClassLibraryForVBA2.dll /tlb:ClassLibraryForVBA2.tlb
を実行しましたら次のエラーとなります。
RegAsm : error RA0000 : 'C:\Users\Win_10ENT_TEST\Documents\VS2022テスト\ClassLibraryForVBA2.dll' は有効な .NET アセンブ リではないため、読み込めませんでした。
Excelの参照設定でClassLibraryForVBA2.tlbを直接指定すれば組み込めますが
html = wp.GetText("http://www.google.co.jp")
で”クラスが登録されていません”のエラーがでてしまいます。
.NET Framework はデフォルトの4.7.2及び4.8を試しましたが変わらずです
regasm登録エラーは32/64ビット指定の間違いでした。
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm
でなく
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm
を使用した所エラー無く登録できましたが
html = wp.GetText("http://www.google.co.jp")
で
オートメーションエラーです
指定されたファイルが見つかりません
がでます。
Visual Studioでビルドした場合.tlb .dll以外で何かコピー必要な物が有るのでしょうか?
> オートメーションエラーです
> 指定されたファイルが見つかりません
> がでます。
regasmコマンドでの登録時、"/codebase"オプションを付与して実行してみてください。
[Regasm.exe (アセンブリ登録ツール) - Microsoft Learn]
https://learn.microsoft.com/ja-jp/dotnet/framework/tools/regasm-exe-assembly-registration-tool
> レジストリに Codebase エントリを作成します。 Codebase エントリによって、グローバル アセンブリ キャッシュにインストールされないアセンブリのファイル パスが指定されます。
@本コメントを閲覧された皆さま
本件と関係無いですが、teratail、自分のコメント投稿にも通知が来るようになってますね。以前からそうでしたっけ? 先日、メンテがあったと思いますが、teratailの新たな不具合、バグでしょうかね。
コメントありがとうございます。
regasmコマンドでの登録時、"/codebase"オプションを付与して試したところ問題が解決しました!
ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
回答欄に転載、一部追記したかたちで投稿しました。
対応ありがとうございました。
別のプロジェクト立ち上げたら.tlbが出来ないトラブルが再発してしまいましたが、regasmコマンドで.tlbを作る事でExcelから問題無く使える事ができました。
回答2件
あなたの回答
tips
プレビュー