查询错误中的 VBA 评估 IIF 的错误部分
Posted
技术标签:
【中文标题】查询错误中的 VBA 评估 IIF 的错误部分【英文标题】:VBA in query error evaluating false part of IIF 【发布时间】:2012-12-26 20:15:00 【问题描述】:我在查询中有以下列。
iif(Len([Field1])=0,0,Asc(Mid([Field1] & "",Len([Field1]))))
这个想法是它应该返回字符串字段中最后一个字符的 ASCII 值。 问题是,如果 Field1 为空,则语句错误并显示以下消息:“无效的过程调用或参数(错误 5)”。如果该字段为空,则应返回 0。
【问题讨论】:
别忘了有时编译器doesn't short circuit within IIF() statement。因此,在您的情况下,将field1
评估为不为空...
@bonCodigo 您在 VBA 代码中对 IIf()
是正确的。但是IIf()
确实在查询中使用时会短路。
@HansUp 同意你的看法。瑞克,如果您的 IIF()
会变得过长,那么您可能需要考虑使用 UDF
和 case
...相对较快并保持查询的清晰度。
【参考方案1】:
假设空白表示Null或空字符串,则可以将空字符串连接到[Field1]
,如果组合长度为0,则返回0。
Right()
函数比Mid()
更直接地获取最后一个字符。
SELECT IIf(Len([Field1] & "")=0,0,Asc(Right([Field1],1)))
FROM YourTable;
【讨论】:
【参考方案2】:无论如何,你有 HansUp 的答案可以继续。 :)
..在此查询航程的任何时候,您对IIF
的查询都会变得非常非常长... ;) 这里以使用 @ 的UDfunction
开头987654324@。在您的情况下,最重要的方面是验证输入 - 获得 ASCII
值的意义不大。由于您主要关注最后一个character
,如果您的Field1 包含alphanumeric
值并且您的最后一个字符恰好是digit
、special character
而不是String
,该怎么办。好吧,为了安全起见,我们可以在以下函数中验证这一点,该函数将仅响应Strings
。另一个优点是你可以在你的数据库中重复使用这个函数。
也许这确实使您的过程复杂化:D
Option Compare Database
Option Explicit
Public Function GetASCII(strField1 As String) As Integer
Dim regex As Object
Dim strTemp As String
Set regex = CreateObject("vbscript.regexp")
'--assume strField1 = "hola", you may enter different types
'-- of values to test e.g. "hola1, hola$ , hola;
With regex
.IgnoreCase = True
.Global = True
.Pattern = "[a-zA-Z]+"
'--check for null
Select Case IsNull(strField1) '-- validates any other datatype than String
Case True
GetASCII = 0
Case Else
Select Case IsError(strField1)
Case True
GetASCII = 0
Case Else
Select Case IsEmpty(strField1)
Case True
GetASCII = 0
'--check if entire string is String
'--only (no special characters, digits)
'--you may change this to only check the
'----last character if your Field1 is alphanumeric
Case Else
Select Case .Test(strField1)
Case True
strTemp = Mid(strField1, Len(strField1), 1)
GetASCII = Asc(strTemp)
Case Else
GetASCII = 0
End Select
End Select
End Select
End Select
End With
Set regex = Nothing
End Function
注意:认为这从长远来看会有所帮助:) Access Query Primer Article。
【讨论】:
@Rick 如果您需要使用某个功能,您可以查看此答案 ;) 甚至对其进行相应的定制或改进。 @HansUp 你可以加Dim strNull as String
,不要赋值;并在Select case IsNull(strNull)
中使用该字符串变量。它为 null 返回 true。因此,在 VBA Excel 中,Access 您似乎可以为字符串设置 null ......我还提到,无论如何,如果 Field1
恰好包含 alphanumeric
或 numeric
。
Rick 说他想要“字符串字段中最后一个字符的 ASCII 值” ... 字符串 字段。不要为了让你的答案合适而重新定义他的问题。 ;-)
不,strNull 在声明为字符串时不能包含 Null。如果你尝试这个赋值,你会触发错误 #94, 'Invalid use of Null' : strNull = Null
我试图帮助您了解 VBA 字符串变量永远不能包含 Null。如果您将strNull
声明为字符串,它将被初始化为空字符串 ("") 而不是 Null。如果您不指定任何内容,strNull
将保持为“”。所以IsNull(strNull)
将等价于IsNull("")
...并且将返回 False。 VBA 字符串变量在任何情况下都不能包含 Null。以上是关于查询错误中的 VBA 评估 IIF 的错误部分的主要内容,如果未能解决你的问题,请参考以下文章
SQL 编译错误:无法评估不受支持的子查询类型 - SELECT 子句中的函数调用