当前位置:文档之家› 用VBA封装DLL

用VBA封装DLL

VBA封装为DLL及调用2012-09-04 02:36:00| 分类:VB / VBA / EXCEL | 标签:|举报|字号大中小订阅使用程序:1、Microsoft Office Excel 20032、Microsoft Visual Basic 6.0案例:在工作表的C1单元格得出A1单元格+B1单元格的值。

设计的VBA代码:Sub Test()On Error Resume NextRange("C1") = Cells(1, 1) + Cells(1, 2)End Sub第一部分、使用VB6.0制作DLL文件一、启动VB6.0,新建一个ActiveX DLL工程:二、引用:在VB中对Excel的引用不同版本的EXCEL在“引用”窗口里显示的版本号也不同:EXCEL2000(Microsoft Office 9.0)EXCEL2002(Microsoft Office 10.0),即ExcelXP EXCEL2003(Microsoft Office 11.0)EXCEL2007(Microsoft Office 12.0)EXCEL2010(Microsoft Office 14.0)EXCEL2013(Microsoft Office 15.0)三、修改ActiveX DLL的工程名称和类模块名称四、编写代码:在代码窗口输入代码,过程名称为Test:Sub Test()On Error Resume NextDim VBt, YB '定义变量VBtSet VBt = GetObject(, "Excel.Application") '使VBt表示为EXCEL对象Set YB = VBt.ActiveSheet '使YB表示为EXCEL的当前工作表'注意要在对象前加上YB变量以表示是EXCEL当前工作表的对象YB. Range("C1") = YB.Cells(1, 1).Value + YB.Cells(1, 2).ValueEnd Sub五、设置工程属性(为使开发的程序更规范,可以对工程属性加以描述【非必要设置,可以省略】):六、保存工程、测试、生成DLL文件:1、保存工程:保存本工程以作为将来修改代码和升级程序的需要;2、测试工程:执行快捷工具栏上的“启动”按钮,检查是否存在错误;3、生成DLL文件:制作DLL文件。

第二部分、调用DLL文件一、在VBE中调用DLL文件调用DLL文件,要分两步走:先注册DLL,再引用DLL。

1、注册DLL(使之放在可引用的列表上):注册DLL也可以使用代码来做,但那样比较复杂,也存在很多问题,建议一般使用手工来注册。

(这里应该先设计好DLL文件放在硬盘的位置,因为后面引用DLL文件的代码也应该是指向这个位置的。

)先打开EXCEL,再打开“Visual Basic 编辑器”2、引用DLL(这样每次打开打开文件时,就不必再去那个引用列表里打个勾了)①DLL文件放在与EXCEL文件同一个文件夹内在ThisWorkbook中添加如下代码:Private Sub Workbook_Open() '打开文件时加载要引用的DLL文件shell "Regsvr32 /s " & Chr(34) & ThisWorkBook.path & "\VBADLL.dll"& Chr(34)End SubPrivate Sub Workbook_BeforeClose(Cancel As Boolean) '关闭文件之前卸载引用的DLL文件shell "Regsvr32 /s /u " & Chr(34) & ThisWorkBook.path & "\VBADLL.dll"& Chr(34)End Sub'/s参数是防止出现确认窗口;/u参数为取消引用。

②DLL文件放在固定文件夹内,如果你有多个XLS文档需要使用到同一个DLL文件,但这些XLS文档又不可能都与DLL文件放在同一个文件夹,则需要将DLL文件放置到一个固定文件夹,这样,只需要将上面的代码ThisWorkBook.path & "\VBADLL.dll" 换成一个固定位置即可。

注意:有时间可能出现某些错误,如提示“变量类型未定义”等,可能是引用后改变了文件的位置或改变了文件的名称,即使再重新再改回来也可能会出现这些问题,所以,在正确注册及引用以后,最好不要再去修改这个DLL文件。

如果出现问题,重新注册一次,保证注册的DLL文件的位置正确即可。

二、新建一个模块,输入调用DLL文件程序的过程:Sub DLLtest()Dim ABC As New VBAtest '定义ABC为新类,即为DLL文件中的类模块VBAtest ABC.Test '调用DLL中提供的过程,来完成原来在VBA中的功能,起到隐藏代码的效果Set ABC = Nothing '释放类资源End Sub三、在工作表中运行DLLtest宏即可实现调用:综上所述,感觉封装DLL的主要步骤是:①在VB中引用EXCEL;②编辑代码(要在对象前面加上定义的EXCEL变量);③在VBE中引用该DLL文件;④在VBE的代码中调用DLL中的过程。

简述封装VBA自定义函数dll以及在VBA和工作表中的引用[复制链接]本帖已被收录到知识树中,索引项:封装本帖最后由时光鸟于2013-1-10 10:50 编辑说实话,EXCELHOME里高手如云,我写这个东西真有点班门弄斧的味道,高手们请忽略此贴!之所以决定写,一方面是自己学习总结的一点心得体会;另一方面与想学习这方面东西的筒子们一起分享交流。

还有一个更重要的原因就是,我能找到的现有的文章中,关于封装、在VBA中引用及在工作表中引用这三个方面都谈到了的比较系统的介绍比较少,甚至没有。

闲话不说了,开始正题:一、用VB6.0封装自定义函数1.VB6.0封装是最方便受限制最少的方法,当然用的C#也可以做来(这里不作介绍),但需要.net库及对应的版本支持大家都知道win7是VB6.0所能支持的最后一个系统,win8已经不再支持官方安装版的VB6.0了,要想在win8中用VB6.0也是可以的,那就是用精简版的VB6.0(只有6M左右),封装VBA足够用了。

2.以管理员身份运行VB6.0(一定要以管理员身份运行),在弹出新建工程中选择ActiveX dll3.在工程管理器分别修改工程名称及类名称(改名是为了方便,如果仅测试不改名也行)4.工程名称及类名称改完后,把写好的VBA自定义函数复制到刚新建的工程的类模块中(本例是myClass),复制过来的函数一定不能是private的,要么是public的,要么前面空出来,原因不言自明。

5.如果你复制过来的函数是经过测试没有问题的话,选择左上角“文件”--生成XXXX(本例是生成TransNumber.dll),在弹出的对话框中选择该.dll封装文件的存放位置即可(随便什么位置),如果没有错误提示的话,那么封装就算是完成了!!(如果不是管理员身份运行VB6.0时,此处会提示不能访问注册表的错误提示)特别说明:如果你的VBA里不包含excel对象的话,可以按上述步骤封闭,如果包含excel对象的话,那么对应的工作就要麻烦一点了,在VB6.0中封装成dll前(也就是在进行上述第5步前),要先在vb6.0中添加引用Microsoft Office 15.0 Object Library和MicrosoftExcel 15.0 Object Library (不同的office版本,相应的版本号会不同,我这里是office2013,所以版本号是15.0)在所有的过程前加上这两句:自定义一个Excel.Application对象xlapp(起别的名字也行,随便)Dim xlapp As ObjectSet xlapp = GetObject(, "Excel.Application")然后在所有excel对象前面加上xlapp。

比如,sheet,cells,range,workbook等都是excel的对象,都要改成xlapp.sheet,xlapp.cells,xlapp.range,xlapp.workbook的形式。

当然这些改动最好在VBA工程里面测试无误后再复制到vb6.0里封装。

(鉴于很多朋友看东西速度快得惊人,以至于将这部分完全忽略,没办法,只好加红,如果还是忽略,我也没招了)二、在工作表中引用已封装的自定义函数。

6.在标题栏点击“开发工具”(如果没有的话,在选项中自定义设置中自己调出来,如下图),选择COM加载项,在弹出窗口中选择添加,找到刚才生成的.dll(本例是TransNumber.dll)文件,然后再点确定。

7.接下来在标题栏点击“开发工具”选择“加载项”(注意:这里不是“COM加载项”,而是紧靠COM加载项的“加载项”),在弹出对话框中选择自动化,然后再在弹出的自动化服务器中选择我们刚才生成的函数(本例是transNumber.myClass),找到后选择并确定,然后在刚才弹出的加载宏对话框中就多了我们添加的函数了,再点确定后就完成了所有设置,接下来就可以在工作表中像使用内置函数那样使用我们的自定义函数了。

(如下图)三、在VBA工程中引用已封装的自定义函数。

8.打开VBA工程,选择“工具”--“引用”,在弹出的引用对话框中点“浏览”,找到我们生成的.dll(本例是TransNumber.dll),点确定后回到刚才引用对话框里就多了我们的自定义函数transNumber,确定后完成设置。

2012-12-31 19:58 上传下载附件(42.3 KB)9.在VBA中就可以用"工程名.类名称.函数名()"的方式引用我们的自定义函数了,为简化代码,你也可以按下图方式操作。

至此,自定义函数的封装、在工作表的中引用及在VBA工程中的引用都介绍完毕了。

有不对的地方,恳请指定,谢谢。

相关主题