0

ターゲット マシンに存在する場合と存在しない場合がある他の Excel アドインを参照する xla ファイルがあります。現在、Excel は xla の読み込みに失敗し、「コンパイル エラー: プロジェクトまたはライブラリが見つかりません」というメッセージが表示されます。

コードは次のようなものです。

  Dim result as Integer
  result = SomeAddIn.SomeFunction(x)

「On Error Goto AddInMissing」を前に付けても、これはコンパイル エラーと見なされるため、役に立ちません。

特定のアドインが存在しない場合に正常に失敗する (特定の機能を無効にする) ことができるように、VBA でアドインを名前で遅延バインディング/参照する方法はありますか?

4

3 に答える 3

1

Addinsコレクションを調べることができます。

if AddIns("The addins title").Installed = True then ...

または、ファイル名を調べることができます

For Each Item In AddIns
   Debug.? Item.Path, Item.Name
Next
于 2010-06-22T11:01:47.990 に答える
1

VBE.VBProjectsorを使用する必要はありません。XLA はコレクションApplication.AddIns内の非表示の要素であるWorkbooksため、XLA アドインの名前がわかっている場合は、Workbooksコレクションを直接チェックインして開いているかどうかを確認できます。

Public Function IsLoaded(ByVal AddInName As String) As Boolean
    On Error Resume Next
    Dim xla As Object
    Set xla = Application.Workbooks(AddInName)
    IsLoaded = Not xla Is Nothing
    On Error GoTo 0
End Function

この方法では、ユーザー システムが VBE Extensibility オブジェクト モデルへのアクセスを信頼する必要はありません。

于 2010-06-23T08:18:47.250 に答える
0

みんな、ありがとう。Application.VBE.VBProjects を反復処理すると、xla が存在するかどうかを検出できます。次のステップは、ターゲット xla で定義された関数へのすべての呼び出しをラッパー モジュールでラップすることでした。コンパイル エラーが発生しないようにするには、これが必要でした。私は xla が利用できる場合にのみこれらのラッパー関数を呼び出します。幸いなことに、VBA はモジュールが必要になるまでモジュールをコンパイルしません (これは基本的に、xla が利用可能かどうかをチェックする外側のラッパーと、ターゲットの xla を呼び出す内側のラッパーの 2 つのラッパーを作成することを意味します)。

より洗練されたソリューションでは、おそらく AddIns と VBE.VBEProjects の両方を調べます。

于 2010-06-22T15:17:16.573 に答える