【发布时间】:2015-05-01 05:04:21
【问题描述】:
我有这个 VB 脚本。我不知道这会产生什么结果?
expressao = "Format(#30/04/2015#,""Short Date"")<=Format(#01/05/2015#,""Short Date"")"
Debug.Print "Resultado 6: " & Eval(expressao)
我稍微改变了上面的 sn-p 代码,但它仍然带来相同的结果: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 并将 SetFocus 显示给相应的控件以进行适当的更改。
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
【问题讨论】:
-
那一点仍然比较
String的值。见my answer。 -
它无论如何都不起作用。 Eval 将 Format 结果转换为日期,因此它不是在比较字符串。
-
?typename(Format(#30/04/2015#,"dd/mm/yyyy"))在即时窗格中输出String。我不知道Eval做了什么,但是Format函数是在VBA.Strings模块中定义的,所以是的,它是在比较字符串。 -
MSDN 不是这么说的。