达芬奇最主要的作品:Excel [分享]DLL文件制作与在VBA调用初级进阶

来源:百度文库 编辑:偶看新闻 时间:2024/04/27 23:40:41

谢谢,受益匪浅!

但我也想谈一下我多次测试过后以后就事论事的几个想法,供探讨,绝无其它意思。(李东华老师也是我的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中的标准模块(或者过程)之一吧(我只是自己判断,无理论依据).

不妥之处,请李老师海涵.