谢谢,受益匪浅!
但我也想谈一下我多次测试过后以后就事论事的几个想法,供探讨,绝无其它意思。(李东华老师也是我的VBA启蒙老师之一!本文中部分可能是李老师随手笔误)
来看一下这段关键代码:
Sub test()
On Error Resume Next
Dim i, j As Integer
Dim EB
Set EB = GetObject(, "Excel Application")
With EB.ActiveSheet
i = .Cells(1, 1).Value
j = .Cells(1, 2).Value
.Cells(1, 3) = i + j
End With
Set EB = Nothing
End Sub
在这里,有几个问题,一是对于变量的声明问题,Dim i, j As Integer中只有是J 被声明成了Integer,而I 的数据类型仍然是Variant。此点在帮助中的变量声明中有详细论述,但易被网友错误理解(与中文书写思维有差异),当然最好将EB的数据类型声明为OBJECT,但在此处的确如小美菜所言,可以省去(我们的APPLICATION对象本来就是EXCEL了)
第二个问题,Set EB = GetObject(, "Excel Application"),这是一句错误句子正确的书写应该为: Set EB = GetObject(, "Excel.Application"),由于前面有了 On Error Resume Next,而且我们的Application对象又是EXCEL,所以没有发生错误。
所以正确的方法是:Sub test() On Error Resume Next Dim i As Integer, j As Integer Dim EB As Object Set EB = GetObject(, "Excel.Application") With EB.ActiveSheet i = .Cells(1, 1).Value j = .Cells(1, 2).Value .Cells(1, 3) = i + j End With Set EB = Nothing End Sub
其中更简洁的方式为:
Sub test() On Error Resume Next Dim i As Integer, j As Integer With ActiveSheet i = .Cells(1, 1).Value j = .Cells(1, 2).Value .Cells(1, 3) = i + j End With End Sub
(这里我们不去讨论两个单元格相加事宜)
另外在实践过程中,我还发现了这个问题:
Dim abc As New Mytest '此为错误为缺少用户类型不是工程.
后将其改为:
Sub Example() Dim abc As New MyTest.Class1 abc.test End Sub 则正确运行.我理解是此DLL文件应该是一个库,而其中的.calls1是库中的一个类(类模块),而test模块则是CALLS1中的标准模块(或者过程)之一吧(我只是自己判断,无理论依据).
不妥之处,请李老师海涵.
联系客服