ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 16576|回复: 16

[原创] vba中实现回调函数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-6-1 09:00 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:类和类模块
  1. '什么是回调函数?回调函数就是由你自己写的。你需要调用另外一个函数,而这个函数的其中一个参数,就
  2. '是你的这个回调函数名。回调函数与普通的函数没有什么区别,其之所以称之为回调函数,是因为这个函数
  3. '作为另外一个函数的参数,比如有以下两个函数 CallFun是回调函数, MainFun是调用回调函数的函数
  4. 'Private Sub CallFun(i as Integer)
  5. '
  6. 'End Sub
  7. 'Private Sub MainFun(CallFun, i As Integer)
  8. '    CallFun i
  9. 'End Sub
  10. '不幸的是VBA中不能将函数作为参数,利用上面的代码是不可行的。下面我将介绍可行的办法。
  11. '首先让我们理解一下 Implements 语句
  12. '语法 Implements [InterfaceName | Class]
  13. '所需的 InterfaceName 或 Class 是类型库中的接口或类的名称,该类型库中的方法将用与 Visual Basic 类中相一致的方法来实现。
  14. '说明:
  15. '所谓接口就是代表接口封装的成员(方法以及属性)的原型集合;也就是说,它只包含成员过程的声明部分。一个类提供一个或多
  16. '个接口的所有方法以及属性的一种实现方案。类的控制者每次调用函数时,该函数所执行的代码由类来提供。每个类至少应实现一
  17. '个缺省接口。在 Visual Basic 中,一个已实现的接口中任何没有显式声明的成员都是缺省接口的隐式成员。
  18. '当 Visual Basic 类实现接口时,都会提供该接口的类型库中说明的所有 Public 过程的版本。除了提供接口原型与自编过程之间的
  19. '映射关系之外,Implements 语句还使这个类接收对指定接口 ID 的 COM QueryInterface 调用。
  20. '看了说明是不是还是一头雾水,好的,下面让笔者用实际的例子演示一下相信各位看官就会明白的了。
  21. '1.首先我们新建一个标准工程,然后在这个标准工作添加 类模块,然后把类模块的名字改为 InterFace ,意为 接口类, 根据接口定义
  22. '我们在这个类模块中添加函数原形(所谓接口就是代表接口封装的成员(方法以及属性)的原型集合),即是说接口只是声明一了个原形,
  23. '而不必有实现,可谓原形,比如一个函数原形如下:
  24. 'Private Sub CallFun(i as Integer)
  25. '
  26. 'End Sub
  27. '所谓实现如下:
  28. 'Private Sub CallFun(i as Integer)
  29. '   msgbox i
  30. 'End Sub

  31. 'InterFace 类模块的代码如下:
  32. 'Public Sub CallFun(i as Integer)
  33. '
  34. 'End Sub

  35. '接着我们添加一个实现这个接口的类,首先添加一个类模块,把名字改为Func1
  36. '添加以下代码:
  37. 'Implements InterFace
  38. '这一句的意思即是说这个类是要实现InterFace接口的
  39. '然后点击Implements InterFace上面的列表框,是不是看到了一个InterFace的项(如图1所示),我们选择这个项看看会有什么效果
  40. '是不是自动添加了如下代码
  41. 'Private Sub InterFace_CallFun(i As Integer)
  42. '
  43. 'End Sub
  44. '然后我们可以在这个InterFace_CallFun函数中写我们想写的实现代码,我就写一句 msgbox i 代码吧,如下所示
  45. 'Implements InterFace
  46. 'Private Sub InterFace_CallFun(i As Integer)
  47. '    MsgBox i
  48. 'End Sub

  49. '然后我们在Sheet1的代码区中实现MainFun函数,如下
  50. Private Sub MainFun(Fun As InterFace, i As Integer)
  51.     Debug.Print "随便写的代码"
  52.     Debug.Print "随便写的代码"
  53.     Debug.Print "随便写的代码"
  54.     Fun.CallFun i
  55.     Debug.Print "随便写的代码"
  56. End Sub
  57. '接着在Sheet1的Worksheet_BeforeDoubleClick事件中调用MainFun函数,如下代码所示
  58. Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  59.      MainFun New Func1, 10
  60.     '好的,如果我们想把i的值等于99时再Msgbox出来如何是好呢?是不是得回去修改Func1类的,这当然不,而是继续添加另外一个类
  61.     '模块,把名字改为Func2, 添加以下代码
  62.     'Implements InterFace
  63.     'Private Sub InterFace_CallFun(i As Integer)
  64.     '    If i = 99 Then
  65.     '        MsgBox i
  66.     '    End If
  67.     'End Sub
  68.     '好的,我们现在调用一下看看
  69.     MainFun New Func2, 88  '这句没有满足条件没有显示结果
  70.     MainFun New Func2, 99  '这句满足了条件从而显示了结果
  71. End Sub

  72. '本教程是一个简单的例程,如果各位看官有不明白之处请提问,本文有谬误之处亦请指出,谢谢!
复制代码
img1.JPG
演示工程: CallBack.rar (11.67 KB, 下载次数: 476)

点评

知识树内容索引:Implements 语句在其所在的类模块中实现的接口或类。可以用于建立多态类。  发表于 2013-9-26 20:31

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2010-6-2 12:30 | 显示全部楼层

〖Excel Home友情提示〗

   

很遗憾通知楼上朋友,您的帖子在24小时之内没有任何回复!

通常情况下,本论坛发布的主题帖会在8小时被回复或处理。您的帖子在24小时之内未被回复,其中的原因可能是

1、问题表述不清、模棱两可,难以理解,帮助者被搞晕了,夺帖而出;
2、没有上传必要的附件,或附件被遗忘在某个角落;
3、发帖提问时,语气带棱角、带挑衅,不幸被列入不受欢迎的帖子;
4、所提问题不成立,或提不合理的要求,乐于助人者使出“走为上”之计;
5、话题较偏、较冷或者发布到了不合适的版块,暂时无人问津,顾影自怜。


为了提高您的问题解决效率,我们推荐您阅读以下文章:
* 如何发表新话题和上传附件:http://club.excelhome.net/thread-45649-1-1.html
* 发帖的技巧:http://club.excelhome.net/thread-176339-1-1.html
* EH技术论坛的最佳学习方法:http://club.excelhome.net/thread-117862-1-1.html

TA的精华主题

TA的得分主题

发表于 2010-6-2 12:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢分享,好好学习一下

TA的精华主题

TA的得分主题

发表于 2011-2-4 17:04 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-3-20 12:53 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-3-20 12:49 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-5-5 14:50 | 显示全部楼层
非常感谢,学习了,用在异步访问服务端之后的回调

TA的精华主题

TA的得分主题

发表于 2016-4-23 11:09 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-11-30 20:57 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-2-12 11:32 | 显示全部楼层
谢谢分享,好好学习一下。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-12 05:18 , Processed in 0.058005 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表