0

Excel VBAから使用するCOMサーバーを開発しています。サーバーを更新すると (コードの編集、登録解除、再登録)、Excel は更新されたバージョンではなく、元のバージョンの COM サーバーを引き続き使用しているようです。更新されたバージョンを使用するために私が見つけた唯一の方法は、Excel を閉じて再度開くことですが、これは少しイライラします。Excel に新しく登録されたバージョンを強制的に使用させる方法はありますか (おそらく、ある種の「キャッシュのクリア」オプション)。

詳細:

サーバーは、win32com を使用して Python で開発されています。

VBAでは、次のようなことをしています:

set obj=CreateObject("Foo.Bar")
obj.baz()

Foo.Bar は、レジストリに登録した COM サーバーです。

サーバーを登録解除してから VBA コードを実行すると、VBA から「オブジェクトを作成できません」というエラーが表示されるため、何かが起こっていることを認識する必要があります。しかし、再登録すると、古いバージョンが取得されます。

ヒントをいただければ幸いです。

ありがとう、

アンディ

4

2 に答える 2

2

私は自分の問題の解決策を見つけました-一般的な考え方は、メインのCOMサーバークラスが呼び出されたときに残りのCOMサーバーコードを動的にロードするように設定することです。そこで、Pythonで次のようなCOMサーバークラスを作成しました。

import main_code

class COMInterface:
    _public_methods_ = [ 'method1' ]
    _reg_progid_ = "My.Test"
    _reg_clsid_ = "{D6AA2A12-A5CE-4B6C-8603-7952B711728B}"

    def methods(self, input1,input2,input3):
        # force python to reload the code that does the actual work 
        reload(main_code)
        return main_code.Runner().go(input1,input2,input3)

main_codeモジュールには、実際の作業を実行し、COMメソッドが呼び出されるたびに再ロードされるコードが含まれています。これは、入力が変更されない限り機能します。これにはおそらく実行時のペナルティがあるため、最終バージョンのリロードを削除することをお勧めしますが、開発目的では機能します。

于 2010-03-01T07:07:42.827 に答える
0

オブジェクトをアンロードしようとしましたか? おそらく、オブジェクトを強制的にアンロードするボタンをExcelスプレッドシートに作成します。

役立つことを願っています

于 2010-02-26T08:36:30.960 に答える