ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 请问怎么调用 类模块---类1 里 的程序

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-11-29 13:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
不建议你用VB DLL封装XLS。我个人对DLL封装EXCEL工作簿的做法不是很赞成,如果不是为了加密或利用VB特有的功能(不是VBA),一般情况下尽量不要封装XLS。
为了VBA提供特有的函数、控件又是另一回事。

如果你封装DLL的主要目的,是为了把VBA的函数提供给其它XLS使用,可以考虑在XLS工程里引用这个(公用VBA)的方法。

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-11-29 14:38 | 显示全部楼层

回复 10楼 camle 的帖子

老师您好!谢谢您,弄2个变量,分别调用.的语句怎么写啊
谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-11-29 14:44 | 显示全部楼层

回复 11楼 hiyou 的帖子

老师我就是为了及让 众人使用 又不让任何人坏掉我的意思 而设计的 您的 可以考虑在XLS工程里引用
应怎么操作啊

TA的精华主题

TA的得分主题

发表于 2010-11-29 15:23 | 显示全部楼层
原帖由 qhllqhll 于 2010-11-29 14:38 发表
老师您好!谢谢您,弄2个变量,分别调用.的语句怎么写啊
谢谢

这样?
set c1 = new 类1
set c2 = new 类2
c1...
c2...

TA的精华主题

TA的得分主题

发表于 2010-11-29 23:12 | 显示全部楼层
[广告] 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   '<==调用公共子程序
以上,你也可以用函数,过程差不多。

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-11-30 00:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

回复 15楼 hiyou 的帖子

谢谢老师的指点:
我还有个问题不能解决请您帮忙

我在用vb封装dll 文件时  有的代码不起作用,例如:如果没授权 就关掉工作表的代码 “ThisWorkbook.Close False ” 不起作用 ,请问老师 应该怎样在vb里改写才能起作用啊  
另外的一个问题:
  有的代码封不进去 : 例如:我的代码在封装dll文件时如果 加上“ Range("A1000:m" & [a1000].End(3).Row + 1).Select  ”这一句代码,再回到vba里就不能调用运行,把它去掉就一切正常是怎么回事啊?应该怎样改写啊?谢谢
谢谢指点

[ 本帖最后由 qhllqhll 于 2010-11-30 00:48 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-11-30 07:36 | 显示全部楼层
我在用vb封装dll 文件时  有的代码不起作用,例如:如果没授权 就关掉工作表的代码 “ThisWorkbook.Close False ” 不起作用 ,请问老师 应该怎样在vb里改写才能起作用啊  
另外的一个问题:
  有的代码封不进去 : 例如:我的代码在封装dll文件时如果 加上“ Range("A1000:m" & [a1000].End(3).Row + 1).Select  ”这一句代码,再回到vba里就不能调用运行,把它去掉就一切正常是怎么回事啊?应该怎样改写啊?谢谢
谢谢指点


请先看一下前面回复中,关于类库的1,2部分。注意我说的(对象和类以及)类所属类库。
你用VB,也就是VBA以外的程序调用EXCEL对象,它们的用法和EXCEL VBA中有一点小的区别。
EXCEL VBA自身代码,调用某个对象变量(以及声明类)时,在EXCEL类库、OFFICE类库等“已经存在于EXCEL”的类,只要名字不冲突,可以免去前面的前缀,前面我给你举过例。;
调用已经存在的对象变量时,可以不指明它所属的上层,举例来说,在EXCEL VBA里,
APPLICATION是一个以EXCEL.APPLICATION类为模板的唯一对象,它的名字也叫APPLICATION,它是EXCEL中其它对象的根,注意,其它程序里引用EXCEL的对象,往往是从APPLCATION对象开始引用的,例如
DIM EXAPP AS EXCEL.APPLCAITION  '声明一个EXCEL.APPLICATION,但不可以直接生成
set exapp=getobject("excel.application")  '引用存在的EXCEL.Application实际对象



THISWORKBOOK是你当前使用的VBA 代码所属那个WORKBOOK,它的完整原形是EXCEL.APPLICATION.Thisworkbook
任何WORKBOOK的引用,可以是这种
EXCEL.APPLICATION.WORKBOOKS("目标工作簿名")
RANG对象也一样,它的原型是EXCEL.RANGE,实际的对象不能生成,来自对某个工作表的引用
EXCEL.Application.Thisworkbook.worksheets(1).range("a1")

但是,其它程序里要引用THISWORKBOOK或某WORKBOOK,你总要有个办法把WORKBOOK的引用传过去。
举例来说,你调用了DLL的一个函数,这个函数在类A里一个名为B的函数,那你起码要把APPLICATION或THISWORKBOOK给传过去
类 A
PUBLIC SUB B(MYWORKBOOK AS EXCEL.WORKBOOK)  '<==传一个WORKBOOK对象参数过去
msgbox MYWORKBOOK.name
END SUB

以这种形式调用 A.B(THISWORKBOOK)

以上,RANGE对象也是一样的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-11-30 10:28 | 显示全部楼层

回复 17楼 hiyou 的帖子

谢谢老师的指点
老师我有点看不明白,请老师以我的代码例子为例:请讲解一下:这个是vba里的代码,如果放到vb中 的xxx 类里,应该怎样修改,请把修改处用红字,标出来,我看有何区别啊,谢谢
Sub qk()
    Range("A5:M10000,A4,D4:E4").Select
    Range("D4").Activate
    Selection.ClearContents
    Range("A4").Select
End Sub
  
不知道怎样加 谢谢

[ 本帖最后由 qhllqhll 于 2010-11-30 11:53 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-11-30 12:10 | 显示全部楼层
我不玩体力活的(HP太少,其实是懒),把前面几个改一下
Sub daoru2(wrkX as Excel.workbook)
dim xlApp as Excel.Application   
set xlApp=wrkX.parent

xlApp.ScreenUpdating = False

       wrkX.activesheet.Range("E8").Select
    wrkX.Sheets("sheet1").Select
    xlApp.ActiveWorkbook.RunAutoMacros Which:=xlAutoActivate
      wrkX.activesheet.Range("a1").Select

这是VB所属类的daoru2方法几个改动,前面说过了,请对照一下,但下面一大堆的RANGE我实在是...你自已看着办,真正的做起来就用WITH语句,指出 某工作簿->某工作表对象省事
  你要传入一个WORKBOOK,这里看起来你多用的是ACTIVEWORKBOOK,但我不关心
  在VB的daoru2直接传入你选择的WORKBOOK,比如EXCEL VBA里这样调用
  某个类对象实例.daoru2(Activeworkbook)
    某个类对象实例.daoru2(ThisWorkbook)
    以上都是可以的,APPLICATION几乎是固定的,我没加这个参数,只不过是因为你那个程序里引用了APPLICATION对象做ScreenUpdating,这个对象是唯一的,可以从任一个WORKBOOK的Parent属性得到.
   其它的就要指出具体位置,例如RANGE,一般它是来自当前工作簿的ACTIVESHEET,或APPLICATION的ACTIVESHEET,这里我取工作簿的ACTIVESHEET,但你有一个指明了ACTIVEWORKBOOK的,那肯定是APPLICATION下面的ACTIVEWORKBOOK,而APPLICATION又是用已知workbook.parent取得
  下面的都差不多

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-12-1 12:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

回复 19楼 hiyou 的帖子

谢谢老师:我先按您讲的试一试
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-22 23:39 , Processed in 0.047055 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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