none
VBAから.NETで作成したDLLを呼出 RRS feed

  • 質問

  • いつも参考にさせてもらっています。

    .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以外で何かいい方法はありませんか?
    もしくは書き方は変えればうまくいくのでしょうか?
    いろいろと調べてみたのですがわかりません。

    宜しくお願い致します。

    2009年3月3日 2:57

回答

  • 指名しての質問文があることに気づけなかったため、返答が遅くなりました。

    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
    2009年3月12日 14:40
    モデレータ

すべての返信

  • 先のスレッドでは( 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


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年3月3日 15:13
    モデレータ
  •  Azulean様

    今回も解答していただいてありがとうございます。
    どうにかしたくてやりたいのですが・・・。

    ご指摘いただいたページ、見てみます。

    2000も2003もregasmのコマンドは同じにしています。
    2000でも参照設定まではうまくいくので参照まではできていると思うのですが、呼び出すとオートメーションエラーが・・・。

    Azuleanさんならどういうやり方をしますか?
    VBAから.NETで作成したclassを呼び出したい時。

    宜しくお願いします。
    2009年3月3日 23:35
  • 指名しての質問文があることに気づけなかったため、返答が遅くなりました。

    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
    2009年3月12日 14:40
    モデレータ
  • こんにちは。中川俊輔 です。

    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/


    今後ともフォーラムをよろしくお願いします。
    それでは!


    マイクロソフト株式会社 フォーラム オペレータ 中川 俊輔
    2009年3月19日 7:44
  • .NET 1.1のcsc.exeを使ってCOMを作り、Office XPのExcelで実行してみました。
    最初はregasmコマンドの/codebaseオプションを忘れていてオートメーションエラーになりましたが、/codebaseオプションをつけると特に問題は出ませんでした。

    もちろん、複雑なCOMだと問題が出てくるかもしれませんが。
    (regasmコマンドを具体的にどのように使っているか聞けてなかったな…)
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年3月20日 15:03
    モデレータ