【发布时间】:2011-10-29 08:18:25
【问题描述】:
我正在将 Access 2007 查询分配给 Excel VBA 中的 QueryDef。我的查询调用用户定义函数,因为它对使用正则表达式评估字段的结果执行计算。我使用 QueryDef 是因为我在 UserForm 中收集值并希望将它们作为参数传递给查询。
当我运行我的 VBA 代码时,我收到一个错误:“运行时错误 '3085': Undefined function 'regexFunc' in expression。”
This question 提示问题是 DAO 无法从 Excel 调用 Access UDF,因此我将我的 UDF 复制到 Excel VBA 模块中,但仍然出现错误。
访问查询:
select field1 from dataTable where regexFunc(field1)=[regexVal]
这是 Excel VBA 代码:
'QueryDef function
Sub makeQueryDef (str As String)
Dim qdf As QueryDef
Dim db As Database
Set db = OpenDatabase(DBpath)
Set qdf = db.QueryDefs("paramQuery")
qdf.Parameters("regexVal") = (str="test")
doSomething qdf
End Sub
'Regex function copied from Access VBA module to Excel VBA module
Function regexFunc(str As String) As Boolean
Dim re As RegExp
Dim matches As MatchCollection
regexFunc = False
Set re = New RegExp
re.Pattern = "\reg[ex](pattern)?"
Set matches = re.Execute(str)
If matches.Count <> 0 Then
regexFunc = True
End If
End Function
【问题讨论】:
-
你不能这样做:你的函数在 Excel 中,但是你的 SQL 正在通过 DAO 对你的 Access db 执行,它对 VBA/你的函数一无所知。这就是 Dick K. 在您提到的问题中所说的。
-
此知识库链接描述了您的问题:support.microsoft.com/kb/180810
-
@TimWilliams,好的。如果我使用没有 UDF 的查询,我想我可以将一列附加到它的记录集(我从
qdf.openrecordset获得)并使用使用 Excel VBA 版本的 UDF 计算的值填充该列。这是最好的方法,还是有更简单的方法来获得我想要的东西?编辑:感谢您的链接。 -
看起来你正在使用 UDF 来过滤返回的记录,所以如果你要在查询之后使用它,你需要先返回所有记录,或者想出一个普通的SQL“第一次通过”过滤器至少限制了查询的结果。这样做有多重要取决于您的表中有多少条记录:如果一个可管理的数字那么是的,您可以只执行正则表达式后查询。
-
但是 Left()、Mid() 和所有这些字符串处理函数都可以从 Access 外部使用,而 UDF 则不能。所以,这对我来说似乎是最强大的解决方案。
标签: ms-access vba excel dao user-defined-functions