我有这个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
答案 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"")"
永远不会奏效。有两个原因:
您比较字符串而不是日期。
您的日期值语法错误
语法必须是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
它相当长,但似乎比我现在更好地解释它。