アクティブなブックに小さな手順を追加する 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 コンポーネントはオブジェクトを作成できません」というエラーをスローしました。
このコードを変更して遅延バインディングを利用する方法、またはライブラリ参照をロードして残りのコードを同じプロシージャ/モジュールで実行する方法はありますか?