2012-01-12 4 views
3

特定のタイプを使用するワークブックがあります。これはTと呼ばれていますが、参考文献で定義されているモジュール(DLL)にあります。ブックを開いているときにコンパイルエラー

Workbook_Open()で呼び出されたコードを作成しました。このコードは、参照リストにまだない場合はDLLへの参照を追加します。これは私がワークブックを誰かに与えることができるため、手動でリファレンスを作成する必要はありません。

私の問題は、Workbook_Open()が実行され、Refenceが設定される前にワークブックを開くとき(ダブルクリック)、次のように定義されたタイプTを指し示しているデバッガにスローされます。まだ参照されていないDLLは定義されていません。まあ、冗談ではありません。

これは少しひよこと卵のようです。誰もこれを前に見た?どのように修正しましたか?

+0

あなたはのWorkbook_Openコード内のどこタイプTを使用しています(またはワークシートオブジェクトのいずれかで?)、コンパイル時には、それは強い型付けされたオブジェクトがOKかどうかをチェックします。これを回避する1つの方法は、あなたのTオブジェクトを強く入力することを放棄することです。 – Pynner

+1

@Pynnerが示唆するように、レイトバインディングを使用します。したがって、型Tの変数を宣言する代わりに、宣言は '' Object''と同じです。 –

+0

レイチェルの提案に加えて。ユーザーはそのdllも持っていますか?彼のPCに登録されていますか? –

答えて

1

他の人が言ったように、Workbook_OpenまでDLLへの参照を追加しない場合は、遅延バインディングを使用してDLL内のものに接続する必要があります。

しかし、私はあなたがこれを間違った方法で行っていると思います。 DLLへの参照をWorkbook_Openに追加する代わりに、すでに参照して.IsBrokenをチェックしてください。次に、壊れた参照を修正するために必要なことを行うためのコードを作成することができます。

これは早期バインディングの利点を維持し、DLLへの参照が壊れている場合、同じ種類のコンパイルエラーは発生しません。

:まだコンパイルエラーが発生することがありますが、DLLが見つからない場合はありません。参照が壊れている間に、VBA Stringsモジュールの関数を使用すると、関数の先頭にStrings.が含まれていないとコンパイルエラーが発生します。たとえば、次のコードではコンパイルエラーが発生します.は、 。 Strings.で、接頭辞MidInStrRevを修正するには

Private Sub Workbook_Open() 
    Dim r As Reference 
    For Each r In ThisWorkbook.VBProject.References 
     If r.IsBroken Then 
     MsgBox "Found broken reference." & vbCrLf _ 
       & Mid(r.FullPath, InStrRev(r.FullPath, "\") + 1) 
     End If 
    Next r 
End Sub 

MsgBox "Found broken reference." & vbCrLf _ 
    & Strings.Mid(r.FullPath, Strings.InStrRev(r.FullPath, "\") + 1) 
関連する問題