查询错误中的 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() 会变得过长,那么您可能需要考虑使用 UDFcase...相对较快并保持查询的清晰度。 【参考方案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 值并且您的最后一个字符恰好是digitspecial 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 恰好包含 alphanumericnumeric Rick 说他想要“字符串字段中最后一个字符的 ASCII 值” ... 字符串 字段。不要为了让你的答案合适而重新定义他的问题。 ;-) 不,strNull 在声明为字符串时不能包含 Null。如果你尝试这个赋值,你会触发错误 #94, 'Invalid use of Null' : strNull = Null 我试图帮助您了解 VBA 字符串变量永远不能包含 Null。如果您将strNull 声明为字符串,它将被初始化为空字符串 ("") 而不是 Null。如果您不指定任何内容,strNull 将保持为“”。所以IsNull(strNull) 将等价于IsNull("") ...并且将返回 False。 VBA 字符串变量在任何情况下都不能包含 Null。

以上是关于查询错误中的 VBA 评估 IIF 的错误部分的主要内容,如果未能解决你的问题,请参考以下文章

查询表达式中的语法错误(缺少运算符) - VBA

DLOOKUP 返回#NAME? IIF 语句中的错误

SQL 编译错误:无法评估不受支持的子查询类型 - SELECT 子句中的函数调用

VBA中的超时过期错误?

通过 Excel VBA 进行 SQL 查询的复杂 JOIN 子句中的语法错误

VBA-TRANSFORM 语句中的语法错误