3

アクティブなブックに小さな手順を追加する Excel 用の VBA スクリプトがあります。最終バージョンでは、ブックのバックアップ コピーを自動保存する手順が追加されます。

このコードには、手動で追加できる Microsoft Visual Basic for Applications Extensibility 5.3 ライブラリが必要ですが、そのライブラリを Excel に追加して使用できる単一のスクリプトが必要です。

ライブラリ参照を Excel に追加するコードを次に示します。できます。

On Error Resume Next    ' If library already referenced, ignore the error
    ThisWorkbook.VBProject.References.AddFromGuid _
        GUID:="{0002E157-0000-0000-C000-000000000046}", _
        Major:=5, Minor:=3
On Error GoTo 0         ' Resume normal error handling

以下は、このライブラリを使用して VBA プロシージャをアクティブなブックに追加するコードです。これは機能しますが、必要なライブラリ参照が最初に Excel に追加されている場合に限ります。

Sub AddProcedureToModule()
' This script adds a sample VBA procedure to the active workbook

    ' Add Library Reference:  Microsoft Visual Basic for Applications
    '   Extensibility 5.3
    On Error Resume Next    ' If library already referenced, ignore the error
        ThisWorkbook.VBProject.References.AddFromGuid _
            GUID:="{0002E157-0000-0000-C000-000000000046}", _
            Major:=5, Minor:=3
    On Error GoTo 0         ' Resume normal error handling

    Dim VBProj As VBIDE.VBProject   ' requires Ref: MS VB for Apps Extensibility 5.3
    Dim VBComp As VBIDE.VBComponent ' requires Ref: MS...5.3
    Dim CodeMod As VBIDE.CodeModule ' requires Ref: MS...5.3

    Dim LineNum As Long
    Const DQUOTE = """" ' one " character

    Set VBProj = ActiveWorkbook.VBProject       ' requires Ref: MS...5.3
    Set VBComp = VBProj.VBComponents("Module1") ' requires Ref: MS...5.3
    Set CodeMod = VBComp.CodeModule             ' requires Ref: MS...5.3

    ' Insert code into workbook
    With CodeMod
        LineNum = .CountOfLines + 1
        .InsertLines LineNum, "Public Sub SayHello()"
        LineNum = LineNum + 1
        .InsertLines LineNum, "    MsgBox " & DQUOTE & "Hello World" & DQUOTE
        LineNum = LineNum + 1
        .InsertLines LineNum, "End Sub"
    End With
End Sub

この 2 つを 1 つの手順で結合しようとすると、問題が発生します。Excel でコンパイル エラー "ユーザー定義型が定義されていません" がスローされます。私の理解が正しければ、私のコードはアーリー バインディングと呼ばれるものを使用しています。Excel は、コードが実行される前にライブラリを探しますが、ライブラリが見つかりません。

答えは、スクリプトの一部が実行されてライブラリが利用可能になるまで、Excel がそのライブラリを検索しないように、遅延バインディングを使用するようにコードを調整することです。

この投稿をガイドとして使用して、コードの一部を次のように変更しました。

Dim VBProj As Object
Dim VBComp As Object
Dim CodeMod As Object
Dim LineNum As Long
Const DQUOTE = """" ' one " character

Set VBProj = CreateObject("ActiveWorkbook.VBProject")
Set VBProj = ActiveWorkbook.VBProject
Set VBComp = CreateObject("VBProj.VBComponents(""Module1"")")
Set CodeMod = CreateObject("VBComp.CodeModule")

Excel が「実行時エラー '429': ActiveX コンポーネントはオブジェクトを作成できません」というエラーをスローしました。

このコードを変更して遅延バインディングを利用する方法、またはライブラリ参照をロードして残りのコードを同じプロシージャ/モジュールで実行する方法はありますか?

4

1 に答える 1