作者:盗梦-Access中国
有时候,我们很多代码结构很类似,前后都一样,就中间不一样。
提取不了为一个公共函数直接调用,不得不写成很多重复代码
如果用回调方式就能轻松解决问题
但vb,vba中实现回调要通过一个API函数,十分不方便
最近研究发现,可以利用Eval函数的特性(可以执行文本表达的代码),简单实现回调机制
优点:容易理解和使用
缺点:窗体的函数调用不到
没有返回值(可以通过公共临时变量得到返回值)
传递参数不方便
调用的函数或者过程必须是公共的
附上我研究的几个模型,包括有无参数和返回值
1、示例(无参数,无返回值)
'说明:无参数传递,没返回值
'参数:funcName,函数表达式(字符串)。要调用的函数名,函数名后一定要加括号
'示例:funcEvalEasy('funcTestEasy()')
Public Function funcEvalEasy(funcName As String)
'其他代码过程
'...
'回调函数部分
MsgBox '开始执行函数' & funcName
Eval funcName
End Function
Public Function funcTestEasy()
MsgBox '我是测试函数,用于测试回调'
End Function
2、示例(有参数,无返回值)
'说明:有参数传递,没返回值
'参数:funcName,函数表达式(字符串)。要调用的函数名,函数名后一定要加括号
'方法1:在funcName,函数表达式中就写好参数
'示例:funcEvalPara1('funcTestPara(1)')
'特点:较为灵活
Public Function funcEvalPara1(funcName As String)
'其他代码过程
'...
'回调函数部分
MsgBox '开始执行函数' & funcName
Eval funcName
End Function
'方法2:在执行回调的函数里面合并一个函数表达式
'示例:funcEvalPara2(1,'funcTestPara') '为了方便合成函数表达式,就不加括号
'特点:有什么参数,一目了然,就是不灵活
Public Function funcEvalPara2(i As Integer, funcName As String)
'其他代码过程
'...
'回调函数部分
MsgBox '开始执行函数' & funcName
Eval funcName & '(' & i & ')'
End Function
Public Function funcTestPara(i As Integer)
MsgBox '我是测试函数,用于测试回调' & vbCrLf & '你传进来的数字是' & i
End Function
'方法3:利用公共变量传递参数(这个可以参考下面的示例,一样道理,这里就不赘述)
3、示例(有返回值)
Public intEvalReturn As Integer '临时变量,用于保存返回值
'说明:有返回值
'参数:funcName,函数表达式(字符串)。要调用的函数名,函数名后一定要加括号
'示例:funcEvalReturn('funcTestReturn(1)')
Public Function funcEvalReturn(funcName As String) As Integer
'其他代码过程
'...
'回调函数部分
MsgBox '开始执行函数' & funcName
Eval funcName
'获取返回值
MsgBox '返回结果' & intEvalReturn '弹窗显示
funcEvalReturn = intEvalReturn '返回结果
End Function
Public Function funcTestReturn(i As Integer)
MsgBox '我是测试函数,用于测试回调' & vbCrLf & '你传进来的数字是' & i & vbCrLf & '将执行计算返回一个值'
'计算
i = i + 1
'返回
intEvalReturn = i
End Function
追加更新:
2015-01-21: 多谢todaynew版主告知,Eval本身可以返回值。例如Eval('1+1'),返回2。
那就不用像上面那么麻烦。详请见6楼。
todaynew版主补充
其实不必设公共变量,Eval是可以返回值的。
Public Function getDate(ByVal y As Integer, ByVal m As Integer, ByVal d As Integer) As Date
getDate = DateSerial(y, m, d)
End Function
Private Sub 确定_Click()
Me.日期.Value = Eval('getDate(' & Me.年.Value & ',' & Me.月.Value & ',' & Me.日.Value & ')')
End Sub
如想更快的系统地学习Access数据库,请点右上角 关注 部落 点击加入群:access学习群 与更多Access大牛交流 如果您觉得这篇技巧真的有用,请关注我们。更重要手机转发分享一下!
如喜欢此技巧,手机右上角点开,分享到QQ空间,方便自己以后看
联系客服