トップ回答者
VBAから.NETで作成したDLLを呼出

質問
-
いつも参考にさせてもらっています。
.NETについて教えて下さい。
下記の方法でCOMを作成し、ExcelでそのCOMを参照し使用しています。
●開発環境:Windows XP , Visual Studio .NET 2003
Excel 2003
.NETでDLLを作成し、ビルドオプションでCOMの相互運用機能登録にチェックを入れて、タイプライブラリ作成。
VBAでそのCOMを参照し、Formを表示させる。
上記の方法で自分のパソコンではうまくいったのですが、
Visual Studioをインストールしていないパソコンで問題がおきてしまいました。
Framework 1.1はインストール済みです。
VS2003が入っていないパソコンでは、Regasm.exeでDLLをタイプライブラリに変換し、COMの相互運用機能に登録しました。
その後、同じようにVBAで参照設定でそのCOMを参照し、呼び出したのですが…
Excel2003では成功しました。
なのですが、Excel2000ではオートメーションエラーとなりました。
バージョンによるものだと判りました。
どうしてもVBAから.NETで作成したFormを呼びたいのです。(VBAでフォームを作成しても複数選択ができないため)
COM以外で何かいい方法はありませんか?
もしくは書き方は変えればうまくいくのでしょうか?
いろいろと調べてみたのですがわかりません。
宜しくお願い致します。
回答
-
指名しての質問文があることに気づけなかったため、返答が遅くなりました。
dog.life さん の発言:Azuleanさんならどういうやり方をしますか?
VBAから.NETで作成したclassを呼び出したい時。
宜しくお願いします。まず、.NET Frameworkで作ることを避ける方向で調整します。
理由としては、Officeでの.NET Frameworkのバージョンポリシーがややこしいところがあるからです。
さらに今回の事例では複数のバージョンをターゲットにされているため、なおのこと安定した動作は期待しにくいです。
かなりコストがかかっても、実現したいとでも言われない限り、まず回避します。
コストをかけてでも実現しろと言われた段階で、初めて手法がないか調査、検討することになりますが…、今の時点では残念ながら簡単に解決できるとは思っていません。
Excelのバージョン毎に.NET Framework 1.xか.NET Framework 2.0か分けて提供するぐらいが簡単に抜けられそうな所には見受けられますが…。
解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。- 回答としてマーク sk7474 2009年3月19日 7:59
すべての返信
-
先のスレッドでは( http://social.msdn.microsoft.com/Forums/ja-JP/vsgeneralja/thread/e07719c1-b801-48ab-931f-67dbeabce778 )、
ロックバックが怪しいと書きましたが、その後、技術文書を読む限りでは、Excel 2000もlockbackの対象になっているようにも読み取れました。(流し読みなので解釈が間違っている可能性もありますが)
Excel 2000とExcel 2003の環境ではregasmのコマンドも全く同じなんですよね?
なお、この辺の動きは、COM以外の手法を取っても、結局似たような問題になるはずです。
関連リンク?
http://support.microsoft.com/?scid=kb%3Ben-us%3B948461&x=10&y=15
http://blogs.msdn.com/vsofficedeveloper/pages/Office-CLR2-Lockback-Bypass.aspx
解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。 -
指名しての質問文があることに気づけなかったため、返答が遅くなりました。
dog.life さん の発言:Azuleanさんならどういうやり方をしますか?
VBAから.NETで作成したclassを呼び出したい時。
宜しくお願いします。まず、.NET Frameworkで作ることを避ける方向で調整します。
理由としては、Officeでの.NET Frameworkのバージョンポリシーがややこしいところがあるからです。
さらに今回の事例では複数のバージョンをターゲットにされているため、なおのこと安定した動作は期待しにくいです。
かなりコストがかかっても、実現したいとでも言われない限り、まず回避します。
コストをかけてでも実現しろと言われた段階で、初めて手法がないか調査、検討することになりますが…、今の時点では残念ながら簡単に解決できるとは思っていません。
Excelのバージョン毎に.NET Framework 1.xか.NET Framework 2.0か分けて提供するぐらいが簡単に抜けられそうな所には見受けられますが…。
解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。- 回答としてマーク sk7474 2009年3月19日 7:59
-
こんにちは。中川俊輔 です。
Azuleanさん、回答ありがとうございます。
dog.lifeさん、フォーラムのご利用ありがとうございます。
その後いかがでしょうか?
有用な情報と思われたため、Azuleanさんの回答へ回答マークをつけさせていただきました。
今回は.NET Framework関連の問題が疑われているので、参考までに。。
作成するCOMがExcelのタイプライブラリを参照している場合、複数のバージョンのExcelに対応させるには
一番古いバージョンのタイプ ライブラリを使用する、もしくは実行時バインディングを行う必要があります。
(今回の場合は開発もExcel2000をインストールした環境で行ったほうがよいと思います。)
複数のバージョンの Office に対応するオートメーション クライアントの作成
http://support.microsoft.com/kb/244167/ja
[INFO] オートメーションにおける事前バインディングおよび実行時バインディングの使用
http://support.microsoft.com/kb/245115/
今後ともフォーラムをよろしくお願いします。
それでは!
マイクロソフト株式会社 フォーラム オペレータ 中川 俊輔 -