3

開発中のメソッド名などのオートコンプリートが好きなので、VBAプロジェクトでアーリーバインディングを使用するのが好きです。また、メソッド名のスペルを間違えた場合にコンパイラーが警告を表示するという自信も気に入っています。

ただし、早期バインディングを使用するには、関連するライブラリ(たとえば、「Microsoft ScriptingRuntime」)への参照を追加する必要があります。これは、そのような「標準」ライブラリには問題ありませんが、ユーザーのマシンに存在する場合と存在しない場合があるライブラリを使用したい場合があります。

理想的には、ライブラリが存在しない場合(「xyzがこのコンピューターにインストールされていないため、この機能を使用できない」など)に役立つメッセージを表示したいと思います。遅延バインディングのみを使用している場合は、次のことができます。

Dim o As Object
Set o = CreateObject("foo", "bar")

If o Is Nothing Then
    MsgBox "nope"
End If

ただし、アーリーバインディングを使用するためにライブラリへの参照を追加した場合、ライブラリが存在しないと、VBAプロジェクトの読み込み時にコンパイルエラーが発生します。したがって、どのコードも実行されません(ライブラリが存在しないことを検出するコードを含む)。

このキャッチ22を回避する方法はありますか?

4

2 に答える 2

6

オブジェクトライブラリのプロキシとしてクラスモジュールを作成できます---他のプロシージャに必要なすべてのメソッド、プロパティ、および定数をラップします。

これらのプロシージャはすべて同じ方法でプロキシクラスを使用するため、アーリーバインディングとレイトバインディングを切り替えるためにこれらのプロシージャを修正する必要はありません。また、Intellisenseは、プロキシクラスで公開するすべてのものを表示します。

このクラスは、アーリーバインディングとレイトバインディングを切り替えるための単一の制御ポイントになります。一例としてExcelについて言及しました。

#Const DevStatus = "PROD"
#If DevStatus = "DEV" Then
    Private objApp As Excel.Application
    Private objBook As Excel.Workbook
    Private objSheet As Excel.Worksheet
#Else 'assume PROD
    Private objApp As Object
    Private objBook As Object
    Private objSheet As Object
#End If

Excelがどのユーザーのマシンにもインストールされていない可能性がある場合は、クラスの初期化中にその可用性を確認できます。

Dim blnExcelAvailable As Boolean

Private Sub Class_Initialize()
    blnExcelAvailable = IsExcelAvailable()
End Sub

Private Function IsExcelAvailable() As Boolean
    Dim blnReturn As Boolean
    Dim objTest As Object

On Error GoTo ErrorHandler

    Set objTest = CreateObject("Excel.Application")
    blnReturn = True

ExitHere:
    On Error GoTo 0
    Set objTest = Nothing
    IsExcelAvailable = blnReturn
    Exit Function

ErrorHandler:
    blnReturn = False
    GoTo ExitHere
End Function

次に、プロキシクラスを使用するプロシージャは、プロパティをチェックして、Excelが使用可能かどうかを確認できます。

Public Property Get ExcelAvailable() As Boolean
    ExcelAvailable = blnExcelAvailable
End Property

このアプローチは可能であり、AFAICTの要件を満たしていると思います。しかし、それが合理的かどうかはわかりません。Excelの例に戻ると、オブジェクトモデルの管理可能なサブセットに対してこのようなことを行うことができます。しかし、そのメソッド、プロパティ、および定数のすべてまたはほとんどが必要な場合、プロキシクラスは大きな仕事になります。

個人的には、このアプローチは使用しません。mwolfe02およびJPのように、アーリー/レイトバインディングを管理するのは私にとってそれほど手間がかかりません。説明された。しかし、私の印象では、これはあなたの状況ではより負担が大きいので、おそらくあなたは私がこのようなものにいるよりも多くの努力を投資することをいとわないでしょう。

于 2012-01-19T05:58:29.103 に答える
3

あまり。

ただし、開発でこれに対処した1つの方法は、2つの別個の宣言行を用意することです。開発作業を行っているのか、本番環境にリリースしているのかに応じて、どちらか一方にコメントします。他のすべて(行を含む)をそのままにしておくことができますCreateObject。その後、コメント行を切り替えて、参照自体を追加/削除することを忘れないでください。

例えば:

Dim o As foo.bar   'Comment out for production'
'Dim o As Object    ''Comment out for dev work'
Set o = CreateObject("foo", "bar")

If o Is Nothing Then
    MsgBox "nope"
End If
于 2012-01-18T14:38:23.240 に答える