ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] dll封装,资料

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-4-1 14:34 | 显示全部楼层
留帖收藏,我太喜欢这里。

TA的精华主题

TA的得分主题

发表于 2012-4-6 07:15 | 显示全部楼层
非常难得的好文;楼主辛苦了

TA的精华主题

TA的得分主题

发表于 2012-4-6 12:51 | 显示全部楼层
我有一点不明白:我们可以直接用VB6编辑器制作DLL文件,为什么还要用VBA去封装?两者有什么区别

TA的精华主题

TA的得分主题

发表于 2012-4-11 11:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢楼主的整理

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-4-12 07:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 yiyiyicz 于 2012-4-12 07:53 编辑

首先回答43楼问题。这是收集的资料,是为计算机外行学习用的(为我这样外行用的)

将VBA代码封装成动态链接库
  假如我们已经写好了一个VBA工程,而且运行无误。
  ①建立VB工程及一般性操作
  首先,我们需要两种工具,其中当然包括Microsoft Word,另外一种是Microsoft Basic 6.0。
  打开Microsoft Basic 6.0,在“新建工程”中选取“ActiveX DLL”,新建一个工程。在属性窗口中将工程名改为VBAPrj,类模块名改为VBACls。然后在“工程”菜单下打开“引用”,选取“Microsoft Office 11.0 Object Library”——这一步很是关键,切不可遗漏,然后保存工程。下面我们所做的是向工程内添加代码。
  将VBA工程中的一个名为Test过程的代码选定后复制,然后切换到VB编辑器,选中VB的工程管理器中的类模块VBACls,将代码粘贴至代码编辑窗口中,于是这段代码便成了类模块VBACls一个方法,然后将工程编译生成dll文件(如果编译成功的话)。在Word中,我们就可以通过类模块VBACls建立的对象来调用此方法(具体怎么调用,我们将后面介绍)。当然,我们可以继续向工程里添加代码。
  ②修改代码
  虽然VBA源于VB,但是两者毕竟存在着一些差异。因此,需要对转移到VB中的VBA代码做一些必要的修改。
  A、修改VBA代码中所特有类型的对象
  如果我们所添加的代码里有VBA所特有类型——如Document、Rang、BookMark等所建立的对象,编译时会提示错误,因为VB不能够识别这些对象。此时修改的方法是,将这些对象作为过程或函数的参数进行传递。需要注意的是,这些参数的类型都一律设为Object。
  例如,我们在过程Test中要访问对象ThisDocument,但是VB无法识别ThisDocument,于是我们就为过程test添加一个参数Doc来传递ThisDocument,即Test可定义为Test(Doc As Object)。
  B、修改VBA所特有一般变量
  VB也无法识别VBA特有的一般变量,如ProtectType,同样,我们也将其作为过程后函数的参数进行传递,不过其类型名都一律设为Variant。
  C、修改VBA所特有常量
  如果在VBA代码中出现了这样的语句:
  ProtectionType = wdNoProtection  
  很明显,wdNoProtection是Word所独有的常量,不为VB所能识别,因而无法通过编译。怎样解决这个问题呢?当然,我们可以用修改变量的方法予以修改。但是聪明的读者会想到:如果我们知道了wdNoProtection的值,就可以直接将值赋给ProtectionType。但是接下来的一个问题是:我们怎样才能获得wdNoProtection的值呢?方法很简单,就是让Word“开口”告诉我们。
  在Word一个事件中添加以下语句:
  MsgBox CStr (wdNoProtection)
  其中CStr是类型转换函数,返回参数相应的字符串。只要在Word中触发此事件,会弹出一个对话窗,显示“-1”,这就是Word所告诉我们的:wdNoProtection 的值是-1。于是我们就可以将语句 ProtectionType = wdNoProtection 改为 ProtectionType = -1,问题到此就迎刃而解了。


  假如经过我们编译已生成了一个动态链接库文件VBAPrj.dll,其中有一类模块VBACls,此类模块有一个方法Test(Doc As Object)。
  接下来我们所要做的是用Word调用Test,有三种方法可供选择:
  1.打开Word的VBA编辑器中ThisDocument代码窗口,点"工具"菜单下的"引用"命令,在引用对话框中引用该动态链接库。
  调用代码如下:
  Dim VBACls As New VBAPrj.VBACls
  VBACls.Test(ThisDocument)
  2.如果知道该动态链接库文件的位置,可以在ThisDocument代码窗口以代码形式引用, 代码如下:
  Private Sub Document_Open()
   On Error Resume Next
   Me.VBProject.References.AddFromFile "D:\VBAPrj.dll"
  End Sub
  3.将动态链接库文件拷贝到Word文档同一目录下,可在ThisDocument代码窗口中建立如下引用函数:
  Private Function GetProjectDoc() As Object
   On Error Resume Next
   Dim VBACls As Object
   Set VBACls = CreateObject("VBAPrj.VBACls")
   If VBACls Is Nothing Then
    MsgBox "VBAPrj.dll必须和文档在同一目录下!"
   Exit Function
   End If
   Set GetProjectDoc = VBACls
  End Function
  然后以以下代码形式调用Test:
  Dim objPrjDoc As Object
  Set objPrjDoc = GetProjectDoc
  Call objPrjDoc.Test(ThisDocument)
  Set objPrjDoc = Nothing

http://www.dzwebs.net/3148.html

TA的精华主题

TA的得分主题

发表于 2012-4-24 00:15 | 显示全部楼层
楼主太伟大了!这个帖子非常好,我正在学习这方面的知识,有好多自己编写的VBA代码,但是就是不知如何封装成DLL,这次好好学习一下。

TA的精华主题

TA的得分主题

发表于 2012-4-27 16:15 | 显示全部楼层
yiyiyicz 发表于 2012-1-3 16:57
VBA封装成DLL的例子!
分两种情况

看不懂,但还是谢谢楼主。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-4-27 16:32 | 显示全部楼层
xmzhqw 发表于 2012-4-27 16:15
看不懂,但还是谢谢楼主。

其实,关心这个的都是一个目的:保密

TA的精华主题

TA的得分主题

发表于 2012-4-27 20:24 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-5-2 00:09 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 12:51 , Processed in 0.031836 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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