|
楼主 |
发表于 2021-11-27 14:57
|
显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
说完回调函数,我再说VBA里回调函数实现的方法
很遗憾VBA里的回调函数实现的方法都有缺点
我总结出五种方法:
第一种:Application.Run,前面排序就是用的Application.Run
'速度最慢 100万次回调24秒,不能参数传址,但是最稳定最方便
Run方法自己看帮助,这里不说了:演示代码:
- Private Sub test()
- Dim col As Collection
- Set col = New Collection
- Dim i As Long
- i = 1
- s = Application.Run("run方法.测试函数", col, i)
- End Sub
- Private Function 测试函数(col As Collection, i)
- col.Add 1
- i = 2
- 测试函数 = "回调"
- End Function
复制代码 第二种:CallByName
'速度Run方法快的多100万2.6秒,很稳定,很方便,可以传址传值,但是回调方法只能写到类里
这是VBA的函数也是自己看帮助
模块代码:
- Sub test()
- Dim col As Collection
- Set col = New Collection
- Dim i
- i = 5
- s = CallByName(New CallByName类, "CallBy", VbMethod, col, i)
- End Sub
复制代码 新建一个类,类名为"CallByName类",类中代码
- Function CallBy(col As Collection, ByVal i)
- col.Add 1
- i = 2
- CallBy = "回调"
- End Function
复制代码 第三种:CallWindowProc
'速度最快100万0.3秒,但是回调函数必须按照固定规则否则崩溃
这是API函数,直接通过函数内存地址来调用,所以速度快到电脑冒烟
致命缺点:函数参数只能固定四个,操作内存地址的话用不好容易把excel蹦掉
我的DataAutomation类使用了很多这个回调我简称CWP回调
代码演示:
- #If VBA7 And Win64 Then
- Private Declare PtrSafe Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
- (ByVal 回调函数 As LongPtr, 对象 As Object, 数字1 As Long, 数字2 As Long, ByVal 字符串 As LongPtr) As Boolean
- #Else
- Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
- (ByVal 回调函数 As Long, 对象 As Object, 数字1 As Long, 数字2 As Long, ByVal 字符串 As Long) As Boolean
- #End If
- Private Function 回调函数(对象 As Collection, 数字1 As Long, 数字2 As Long, 字符串 As String) As Boolean
- 对象.Add 2
- 数字1 = 数字1 - 200
- 数字2 = 数字2 + 100
- 字符串 = "456"
- 回调函数 = True
- End Function
- Private Sub test()
- Dim col As Collection
- Set col = New Collection
- col.Add 1
- Dim 数字1 As Long
- 数字1 = 3
- Dim 数字2
- 数字2 = 1
- Dim 字符串 As String
- 字符串 = "123"
- s = CallWindowProc(AddressOf 回调函数, col, 数字1, 数字2, ByVal VarPtr(字符串))
- End Sub
复制代码 注意:我在测试中发现2021版office中此方法会导致excel崩溃
我也找不到原因,所以只能用在2021版一下了
第四种:Implements(接口)
'速度仅次于CallWindowProc 100万0.7秒,很稳定,可以传址传值,
'但是回调方法只能写到类里,多个函数必须新建多个类,造成浪费,不方便
这个方法除了要新建类之外不是很方便其他都很优秀,以后我还会在我的
DataAutomation类中添加这个回调机制,以保证能在2021版office中正常使用
演示:
接口回调函数.rar
(15.64 KB, 下载次数: 18)
第五种:Evaluate
利用Evaluate的特性也可以调用函数
具体优缺点不分析了,认识Evaluate的就懂了
代码:
- Sub test()
- s = Evaluate("Evaluate回调(1,2)")
- End Sub
- Function Evaluate回调(a, b)
- Evaluate回调 = a * b
- End Function
复制代码
|
评分
-
2
查看全部评分
-
|