|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
不论用(VB/VC)的DLL封装了XLS的VBA,还是直接引用XLS本身,如果你的目的是
"让另外的XLS VBA能重复使用目标VBA里的代码",我说说下面的方法,请你先看1和2相关部分,直接跳到3也可以,但不一定能理解
1.关于OFFICE的类
举例来说,在我们的EXCEL VBA里,已经有其它的类库,下面这个例子
DIM rngA AS EXCEL.RANGE
声明一个名为rngA的RANGE对象,这个RANG对象,其类别来自EXCEL类库的RANGE类
也就是说,RANGE这个类,属于EXCEL类库,不过我们一般在声明RANGE时,省掉了EXCEL.range的EXCEL前缀
还有其它不同的声明,例如
DIM shpA as EXCEL.shape 'Excel库的shape类
Dim txtA As msforms.TextBox 'MSFORMS库的TEXTBOX类,这个在VBA FORM窗体引用后生成
2.不属于OFFICE EXCEL的类
有很多类是"EXCEL/OFFICE天然自带"的类,如EXCEL.WORKSHEET,Excel.RANGE等,事实上,OFFICE EXCEL引用了EXCEL类库(前面举的例子常用的几乎都是)、OFFICE类库(公用的VBA类,不过EXCEL里不一定用到)、STDOLE类库(这个你们少用),以及窗体引用时自动会加上的MSFORMS类库
在EXCELHOME还常常会讨论ADODB类库(数据库相关)、VBA类库(VBA代码项目修改相关)、SCRIPTING类库(文件、脚本类、字典相关),它们的原形声明,往往要在工具-引用里,加上类库引用,不使用引用的情况也用,就是CREATEOBJECT,但这里我不扯了
3.现在说说关于VB式的DLL
VB式的DLL封装,其本质是生成一个"自动化类库",它要有一个名为AAA的库,这个AAA是随便起的名字,你的VB工程里会生成这个名字,除了CLSID名之名,有个PROGID名,当你的DLL生成后,正式运行时它会做一次注册,在系统注册生成一个类库,注意不要随便给它起"工程1"之类的名字,你应该理解为什么吧,唔,重名的太多了
那你的类呢?
如果你的VB 工程叫"qhllqhll",有个类名字是Q01,那么DLL安装注册之后,在EXCEL VBA里,可以通过"工具-引用"在列表里找到你那个DLL
好吧,然后就可以这么做
DIM A AS Qhllqhll.Q01 '<===以QHLLQHLL类库的Q01类,定义一个名为A的对象....
SET A=NEW Qhllqhll.Q01
CALL A.Q01 '调用那个方法
4.其它XLS直接引用某个公用的XLS VBA
前面说过,我不太赞成用VB封装XLS VBA,有更简单的方法,除了你试图用它加密(但加密也没有必要把XLS封进去)
只考虑XLS本身的话,你可以把目标XLS当成一个类库,调用其中的程序。
首先,你把目标XLS里的VBPROJECT属性中,名字一项改个特别的名字,默认的XLS VBA项目名是VBAPROJECT,被引用的将是类库名,所以一定要改,跟前面一样,假定你把它改成了QhllQhll。
然后在这个XLS里的SHEET1等任一张工作表写公共模块和函数,因为它们本身就是可以引用的类(你也不用声明),假定你在SHEET1上写了个PUBLIC SUB Q01(),也就是公共的Q01子程序
做完后以XLS或XLA为名存盘(差别不大,不过XLA可以隐藏)。
其它XLS通过VBA的"工具-引用",打开浏览,选择XLS/XLA类型,找到这个XLS或XLA文档引用。
这里你就有了QHLLqHLL类库,里面有Thisworkbook\SHEET1等类可以用,注意这些类是不能也不用再生成实例的
在对QHLLQHLL.Xls做过引用的XLS里,写这样的代码
SET A=QHLLQHLL.SHEET1 '<==注意直接指向QHLLQHLL类库的SHEET1实例,它是不用生成的,一般要用NEW
A.Q01 '<==调用公共子程序
以上,你也可以用函数,过程差不多。 |
|