本帖最后由 vitrel 于 2024-1-12 14:21 编辑
【调用方法二:不引用,先定义,后调用】(兼容性好,推荐)
“方法一”之所以兼容性差,跟它第一步的“引用”脱不了关系。按“方法一”的思路,要想在VB6编译后的程序中调用Excel或WPS表格,必须在VB6中正确地引用,这一步骤不仅要区分软件(要么Excel,要么WPS表格)、更要区分软件的版本号。而且VB6的引用列表不能“任意多选”,即不可以一次性选择n个不同版本的Excel和n个不同版本的WPS表格,只能是系统安装了哪个就只能勾选哪个(只有相关软件在系统上安装完毕后,引用列表才会出现相应的选项供勾选)。毫不夸张地说,这个“引用”就是不兼容的根源。而“方法二”的最大特点就是直接跳过了“方法一”的“引用”,直接进入“定义”步骤,从而解决掉兼容性的问题。
方法二的大致步骤为:
1、定义对象。
在“方法一”中,定义的语句是Dim xlApp As Excel.Application,由于“方法二”没有引用,因此VB6无法识别“Excel.Application”变量类型,如果直接使用原句便会报错,那该怎么办呢?放心,VB6/VBA里有一个几乎“万能”的变量类型“Object”,就像变量类型“Variant”一样好使,懂的都懂。
于是乎,在没有引用的情况下,正确的定义语句为:Dim xlApp As Object。
经过Dim xlApp As Object定义后,xlApp既可以是Excel,也可以是WPS表格(下面会进一步说明)。
2、然后打开一个对象:
Set xlApp = GetObject(, "Excel.Application") '指向当前已经打开的(第一个)Excel对象(或WPS表格对象)
Set xlApp = CreateObject("Excel.Application") '创建一个新打开的(空的)Excel(或WPS表格),该Excel对象(或WPS表格对象)在后台打开,不可见
关于GetObject(, "Excel.Application") 与 CreateObject("Excel.Application") 的区别,上面已经详细解释过,这里不再重复。
看到这里,网友们可以会疑问,语句中明明写的是“Excel.Application”,名字里含有一个“Excel”,因此,它能指向Excel,大家都能理解。但上面的注释里,为何它还能指向WPS表格对象呢?您还别说,真是这样。
这么说的,这里的“Excel.Application”(不用改为“Et.Application”或“Ket.Application”)指向/调用的是当前系统xls、xlsx、xlsm等文件的默认打开软件,并不特指Excel这个软件(这应该是WPS作为后来者,为了兼容Office而作出的特殊处理吧)。
所以,不管当前系统里安装的是哪个版本的Office,或哪个版本的WPS,或者既安装了Office又安装了WPS,总得有一个是xls、xlsx、xlsm等文件的默认打开程序吧,这里的“Excel.Application”就指向/调用它。
这样一来,兼容性的问题就被瞬间解决了。
3、接下来,就可以用这个打开了的Excel(或WPS表格)程序操作工作簿了。
具体操作方法与上面“说明二”的大致相同。
但是,还是那个原因,由于“方法二”没有引用,因此VB6无法识别“Excel.Workbook”、“Excel.Worksheet”等变量类型。
所以,“方法二”中,定义这些工作簿、工作表等对象时,统统要改为Object。
Dim xlBook As Excel.Workbook 须改为 Dim xlBook As Object
Dim xlSheet As Excel.Worksheet 须改为 Dim xlSheet As Object
除此以外,“方法二”和“方法一”在操作Excel、WPS表格、工作簿、工作表……等等的方法几乎是一模一样的④。
※对于“方法二”,以下要说明几点问题:
{ 说明一:方法一和二在操作方法上的差异④ }
细心的网友可能已经看出,我上面所说的“操作方法几乎一模一样”,意思就是并非完全一模一样。
毕竟“方法二”在VB6中缺少了引用Excel或WPS表格的步骤,因此,有些Excel的专有常量(如xlUp、xlMaximized等)便不能被VB6所识别,直接使用会出错,要将其改为常数(如将xlUp改为-4162、将xlMaximized改为-4137等等)。
其次的就是,在不引用的情况下,VB6是不认识Rows、Columns、Cells等元素的,因此不能单独地使用,必须在这些元素前添加父对象(如xlApp.)。
上述情况都不是本贴的重点,就不占用太多篇幅去说了。
{ 说明二:对于既安装了Office又安装了WPS的系统,能否指定调用对象呢? }
使用“方法二”,VB6对Excel/WPS表格的调用不能随心所欲,“Excel.Application”只能指向/调用的是当前系统xls、xlsx、xlsm等文件的默认打开软件,而不能自由选择Excel或WPS表格。
【调用Word/WPS文字】
在VB6中既然能调用Excel/WPS表格,那么用相似的方法也能调用Word/WPS文字,上述的“方法一”和“方法二”都可以。具体的语法稍有差别,以下简单地择录一下:
{ 引用部分 }
Microsoft Excel xx.0 Object Library 改为:Microsoft Word xx.0 Object Library
WPS Spreadsheets 2.0 Object Library 改为:Kingsoft WPS 2.0 Object Library
Upgrade WPS Spreadsheets 3.0 Object Library 改为:Upgrade Kingsoft WPS 3.0 Object Library
{ 定义部分 }
Dim xlApp As Excel.Application 改为:Dim wdApp As Word.Application
Dim xlApp As ET.Application 改为:Dim wdApp As Wps.Application
Dim xlApp As Ket.Application 改为:Dim xlApp As Kwps.Application
{ 创建对象部分 }
Set xlApp = GetObject(, "Excel.Application") 改为:Set wdApp = GetObject(, "Word.Application")
Set xlApp = CreateObject("Excel.Application") 改为:Set wdApp = CreateObject("Word.Application")
Set xlApp = GetObject(, "Et.Application") 改为:Set wdApp = GetObject(, "Wps.Application")
Set xlApp = CreateObject("Et.Application") 改为:Set wdApp = CreateObject("Wps.Application")
Set xlApp = GetObject(, "Ket.Application") 改为:Set wdApp = GetObject(, "Kwps.Application")
Set xlApp = CreateObject("Ket.Application") 改为:Set wdApp = CreateObject("Kwps.Application")
【VB6程序实例】
说一千道一万,说再多的理论也比不上直接来个代码直接测试一下。
这里提供一个使用“方法二”创建的VB6实例(附原码),它里面包含两项测试:
~测试一:能调用本系统安装的Word(或WPS文字)来打开测试用的文档,并读取其中的内容,读取完毕后,关闭文档,退出Word(或WPS文字)。
~测试二:能调用本系统安装的Excel(或WPS表格)来打开测试用的工作簿,并读取其中的内容,读取完毕后,关闭工作簿,退出Excel(或WPS表格)。
该实例我是特意为本贴所编写的,暂时只分别在Win10+Office 2019以及Win10+WPS 2019专业版的两台电脑上测试通过,而我之前用同样方法(“方法二”)所编写和VB6程序,已在多台不同的电脑上正常运行,“方法二”已充证实是可行的。这些电脑环境多种多样,有Win7、Win10、Win11,所安装的Office或WPS版本也是多种多样,更有些是既安装了Office又安装了WPS的,全部都能测试通过。
当然,丑话须说在前,毕竟我的测试环境有限,而Office与WPS的版本更是多种多样,例如仍有电脑使用WinXP,而Office 2003至今仍在服役,还有,非专业版的WPS是不支持VBA的,所以,说到底,这个使用“方法二”所创建的测试实例到底有多广的兼容性,相信根本没人能够说得清楚,只能由网友们实际测试后反馈结果,我们才能逐一了解了。(完)
|