它应该返回什么结果?

时间:2015-05-01 05:04:22

标签: vba ms-access access-vba

我有这个VB脚本。我不知道这会产生什么结果?

expressao = "Format(#30/04/2015#,""Short Date"")<=Format(#01/05/2015#,""Short Date"")"
        Debug.Print "Resultado 6: " & Eval(expressao)

我改变了上面的代码片段,但它仍然带来了相同的结果:false(0):

expressao = "Format(#30/04/2015#,""dd/mm/yyyy"")<=Format(#01/05/2015#,""dd/mm/yyyy"")"
Debug.Print "Resultado 8: " & Eval(expressao)

这是使用相应控件的绑定字段的ValidationRule测试任何表单控件的值的最终代码。您只需在表格源表中设置一次ValidationRule,并在保存记录集更改之前使用此ValidationRule测试每个控件。如果通过测试没有任何反应,但如果失败,您可以向用户显示ValidationText,并向相应的控件显示相应的更改。

Private Function TestarValidationRule(tela As Form, campoTestado As Control) As Variant
    'Author: Alex Borges
    'Location: Rio de Janeiro, Brazil
    'With the help of Adrian and Mat
    On Error GoTo ErroGeral
    Dim registro As DAO.Recordset
    Dim regraValidacao As Variant
    Dim textoValidacao As Variant
    Dim resultado As Variant
    Dim mensagem As String
    Dim expressao As String

    Set registro = tela.Recordset

    regraValidacao = registro.Fields(Right(campoTestado.Name, Len(campoTestado.Name) - 4)).ValidationRule
    textoValidacao = registro.Fields(Right(campoTestado.Name, Len(campoTestado.Name) - 4)).ValidationText

    'Campo sem regra de validação
    If ((regraValidacao & "") = "") Then
        GoTo Erro1

    'Campo com regra de validação
    Else
        Select Case VarType(campoTestado.Value)
            Case vbString
                expressao = """" & CStr(campoTestado.Value) & """" & regraValidacao
                expressao = Replace(expressao, "And ", "And """ & CStr(campoTestado.Value) & """")
                expressao = Replace(expressao, "Or ", "Or """ & CStr(campoTestado.Value) & """")
            Case vbDate
                expressao = "#" & Format(campoTestado.Value, "mm/dd/yyyy") & "#" & regraValidacao
                expressao = Replace(expressao, "And ", "And #" & Format(campoTestado.Value, "mm/dd/yyyy") & "#")
                expressao = Replace(expressao, "Or ", "Or #" & Format(campoTestado.Value, "mm/dd/yyyy") & "#")
                expressao = Replace(expressao, "Now()", "#" & Format(Now(), "mm/dd/yyyy") & "#")
        End Select

        resultado = Null
        resultado = Eval(expressao)

        If (resultado = -1) Then
            TestarValidationRule = vbSim

        'Se campo não passou na regra de validação
        ElseIf (resultado = 0) Then
            'Campo deveria ter texto de validação, mas, não tem
            If ((textoValidacao & "") = "") Then
                    mensagem = MsgBox("Este campo deveria apresentar instruções de preenchimento já que não passou no teste de validação." & Chr(13) + Chr(10) & _
                        "Favor, informar ao desenvolvedor do sistema.", vbExclamation + vbOKOnly, "Validação do Campo")
            Else
                mensagem = MsgBox(textoValidacao, vbInformation + vbOKOnly, "Validação do Campo")
            End If

            campoTestado.SetFocus
            TestarValidationRule = vbNao

        'Se teste gerou um resultado inesperado
        Else
            GoTo ErroGeral
        End If
    End If

Sair:
    Set registro = Nothing
    Exit Function
ErroGeral:
    TestarValidationRule = CVErr(513)
    GoTo Sair
Erro1:
    'Resultado de campo sem regra de validação
    TestarValidationRule = Null
    GoTo Sair
End Function

3 个答案:

答案 0 :(得分:3)

它返回False因为您没有比较日期 - 您正在比较Format次调用的结果,这些调用会返回String个值。< / p>

"30*" <= "01*"False

删除Format来比较日期文字,然后使用可排序的日期格式:

expressao = "#2015-04-30# <= #2015-05-01#"

答案 1 :(得分:2)

正如几位提到的,你原来的:

expressao = "Format(#30/04/2015#,""Short Date"")<=Format(#01/05/2015#,""Short Date"")"

永远不会奏效。有两个原因:

  1. 您比较字符串而不是日期。

  2. 您的日期值语法错误

  3. 语法必须是mm / dd / yyyy或 - 首选 - yyyy / mm / dd。

    如果您使用dd / mm / yyyy,Access非常聪明,可以确定2015年4月30日应该读取2015年4月30日。

    所以请按照Mat:

    expressao = "#2015-04-30# <= #2015-05-01#"
    

    这绝不会失败。

答案 2 :(得分:0)

我假设你对它返回0的原因感到困惑?这是因为在vba 0 = false,-1 = true。如果这个假设是正确的,那么在这种情况下得到假,请使用以下内容:

Debug.Print "Resultado 6: " & cbool(Eval(expressao)) 

希望有所帮助。

编辑:好的,这是一个有趣的,##似乎将日期格式化为dd / mm / yyyy,但有趣的是,如果你debug.print #01/05/2015#输出是05/01/2015这就是为什么它最终是假的。删除## ...

有关此内容的更多信息,请参阅: http://www.vb123.com/Pages/kb/200309_ds_aa.aspx

它相当长,但似乎比我现在更好地解释它。