打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
VBA中访问VSTO文档级项目中的代码
调用文档级项目中的代码分两种情况,无论哪种情况都需要遵循以下步骤
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中的代码
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
VBA 修改关闭不保存代码
VBA入门33:关闭工作簿
禁止Excel工作薄文件被拷贝复制的方法
使用VBA实现Excel自毁功能
你加班1小时做表格,我用VBA只需1秒种
用VBA打开、关闭、新建、保存和删除Excel工作簿 | VBA实例教程
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服