【问题标题】:VBA in query error evaluating false part of IIF查询错误中的 VBA 评估 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...相对较快并保持查询的清晰度。

标签: vba ms-access ms-access-2007 ms-access-2010


【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    相关资源
    最近更新 更多