調(diào)用文檔級項目中的代碼分兩種情況,無論哪種情況都需要遵循以下步驟
1、新建一個啟用宏的工作薄,比如工作薄1.xlsm,輸入以下代碼:
Public Sub Test()
End Sub
在建立VSTO項目時使用的工作薄必須包含VBA代碼,哪怕像下面一樣輸入一個空的過程(如果你要使用的工作薄已經(jīng)包含VBA代碼,可以忽略第一步),其作用是使Visual Studio 可以在文檔中添加VBA 代碼并使 VBA 代碼能夠調(diào)用VSTO代碼。
2、使用包含代碼的工作薄建立VSTO項目并保存
3、打開Excel,依次單擊【文件】——【選項】——【信任中心】——【信任中心設(shè)置】,在【信任中心】對話框中單擊【受信任位置】——【添加新位置】——【瀏覽】——選擇保存有你的VSTO項目的文件夾——勾選【同時信任此位置的子文件夾】——【確定】——【確定】,關(guān)閉Excel。以使項目中的Excel文檔中的VBA代碼受信任可執(zhí)行。
如果要調(diào)用的代碼在宿主項中(簡單說,VSTO項目中的ThisWorkbook,Sheet1,Sheet2......就是宿主項)
1、雙擊“Thisworkbook.vb”或“Sheet1.vb",修改“EnableVbaCallers”屬性為“True”,添加如下代碼以測試在VBA中調(diào)用
<Microsoft.VisualBasic.ComClassAttribute()> <System.Runtime.InteropServices.ComVisibleAttribute(True)> Public Class ThisWorkbook
Private Sub ThisWorkbook_Startup() Handles Me.Startup
End Sub
Private Sub ThisWorkbook_Shutdown() Handles Me.Shutdown
End Sub
Public Sub GetSYS()
MessageBox.Show(My.Computer.Info.OSFullName.ToString)
End Sub
End Class
<Microsoft.VisualBasic.ComClassAttribute()><System.Runtime.InteropServices.ComVisibleAttribute(True)> Public ClassSheet1
Private Sub Sheet1_Startup() Handles Me.Startup
EndSub
Private Sub Sheet1_Shutdown() Handles Me.Shutdown
EndSub
Public Sub GetNum()
MessageBox.Show(My.Computer.Info.OSVersion.ToString)
EndSub
End Class
<Microsoft.VisualBasic.ComClassAttribute()> <System.Runtime.InteropServices.ComVisibleAttribute(True)> Public Class ThisWorkbook和
<Microsoft.VisualBasic.ComClassAttribute()><System.Runtime.InteropServices.ComVisibleAttribute(True)> Public ClassSheet1
是在修改“EnableVbaCallers”屬性為“True”時自動添加的,以向VBA公開宿主項,ComClassAttribute和ComVisibleAttribute請參閱有關(guān)幫助。
2、生成項目并保存
3、打開項目中\(zhòng)bin\debug\下的excel文件,在"shett1"或"thisworkbook"模塊中會看到如下代碼
Property Get CallVSTOAssembly() As ExcelWorkbook1.Sheet1
Set CallVSTOAssembly = GetManagedClass(Me)
End Property
Property Get CallVSTOAssembly() As ExcelWorkbook1.ThisWorkbook
Set CallVSTOAssembly = GetManagedClass(Me)
End Property
此代碼是在修改“EnableVbaCallers”屬性為“True”時自動添加的,利用CallVSTOAssembly屬性可以訪問VSTO代碼
4、在"shett1"或"thisworkbook"模塊中分別新建一個過程,輸入代碼如下
Public Sub CallVSTOSYS()
Call ThisWorkbook.CallVSTOAssembly.GetSYS
End Sub
Public Sub CallVSTONUM()
Call Sheet1.CallVSTOAssembly.GetNum
End Sub
運行以上過程就可以調(diào)用VSTO中的代碼
如果要調(diào)用的代碼不在宿主項中
1、在項目中添加一個類模塊Class1(新添加的類不是宿主項)
2、給新建的類添加
ComVisibleAttribute 和
ComClassAttribute 特性以向 VBA 公開類。使其對于 VBA 可見。 在類中聲明要用VBA調(diào)用的代碼如下
<Microsoft.VisualBasic.ComClass()> _
<System.Runtime.InteropServices.ComVisibleAttribute(True)> _
Public Class Class1
Public Sub GetUser()
My.User.InitializeWithWindowsUser()
MessageBox.Show(My.User.Name.ToString)
End Sub
End Class
3、在ThisWorkbook.vb里添加如下代碼,用來重寫項目中宿主項類的 GetAutomationObject 方法以返回要向 VBA 公開的類的實例。
Protected Overrides Function GetAutomationObject() As Object
Return New Class1
End Function
4、雙擊ThisWorkbook.vb,在屬性窗口設(shè)置其“ReferenceAssemblyFromVbaProject”屬性為TRUE,此操在VBA 項目中添加GetManagedClass 方法 ,VBA中利用此方法訪問VSTO中的代碼
5、生成項目并保存
6、打開項目中\(zhòng)bin\debug\下的excel文件,在“thisworkbook"模塊添加如下代碼
Public Sub CallVSTO()
Dim objVSTO As ExcelWorkbook1.Class1
Set objVSTO = GetManagedClass(ThisWorkbook)
objVSTO.GetUser
End Sub
GetManagedClass的參數(shù)”ThisWorkbook“是你重寫 GetAutomationObject 方法的宿主項類
運行以上過程就可以調(diào)用VSTO中的代碼