ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3556|回复: 1

【学习VSTO】——VAB访问文档级项目中的代码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-10-5 16:47 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 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、给新建的类添加 ComVisibleAttributeComClassAttribute 特性以向 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中的代码






ExcelWorkbook1.rar

203.37 KB, 下载次数: 38

非宿主项.rar

203.14 KB, 下载次数: 21

TA的精华主题

TA的得分主题

发表于 2014-10-5 22:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
楼主  多谢分享
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-11 05:43 , Processed in 1.057549 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表