|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
本帖最后由 wpxxsyzx 于 2014-10-6 16:44 编辑
调用文档级项目中的代码分两种情况,无论哪种情况都需要遵循以下步骤
1、新建一个启用宏的工作薄,比如工作薄1.xlsm,输入以下代码:
Public Sub Test()
End Sub
在建立VSTO项目时使用的工作薄必须包含VBA代码,哪怕像下面一样输入一个空的过程(如果你要使用的工作薄已经包含VBA代码,可以忽略第一步),其作用是使Visual Studio 可以在文档中添加VBA 代码并使 VBA 代码能够调用VSTO代码。
2、使用包含代码的工作薄建立VSTO项目并保存
3、打开Excel,依次单击【文件】——【选项】——【信任中心】——【信任中心设置】,在【信任中心】对话框中单击【受信任位置】——【添加新位置】——【浏览】——选择保存有你的VSTO项目的文件夹——勾选【同时信任此位置的子文件夹】——【确定】——【确定】,关闭Excel。以使项目中的Excel文档中的VBA代码受信任可执行。
如果要调用的代码在宿主项中(简单说,VSTO项目中的ThisWorkbook,Sheet1,Sheet2......就是宿主项)
1、双击“Thisworkbook.vb”或“Sheet1.vb",修改“EnableVbaCallers”属性为“True”,添加如下代码以测试在VBA中调用
<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请参阅有关帮助。
2、生成项目并保存
3、打开项目中\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
运行以上过程就可以调用VSTO中的代码
如果要调用的代码不在宿主项中
1、在项目中添加一个类模块Class1(新添加的类不是宿主项)
2、给新建的类添加 ComVisibleAttribute 和 ComClassAttribute 特性以向 VBA 公开类。使其对于 VBA 可见。 在类中声明要用VBA调用的代码如下
<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,在属性窗口设置其“ReferenceAssemblyFromVbaProject”属性为TRUE,此操在VBA 项目中添加GetManagedClass 方法 ,VBA中利用此方法访问VSTO中的代码
5、生成项目并保存
6、打开项目中\bin\debug\下的excel文件,在“thisworkbook"模块添加如下代码
Public Sub CallVSTO()
Dim objVSTO As ExcelWorkbook1.Class1
Set objVSTO = GetManagedClass(ThisWorkbook)
objVSTO.GetUser
End Sub
GetManagedClass的参数”ThisWorkbook“是你重写 GetAutomationObject 方法的宿主项类
运行以上过程就可以调用VSTO中的代码
|
|