【问题标题】:MS Access 2007 VBA: validating text field with VBA and Chr()MS Access 2007 VBA:使用 VBA 和 Chr() 验证文本字段
【发布时间】:2012-11-13 14:45:55
【问题描述】:

我正在尝试使用以下 VBA 验证表单字段的输入。这很好用。我的问题是这个 Access 应用程序创建了各种 XML 数据文件,我不希望该 xml 中的某些字符......即软返回(Shift+Enter)。我相信这个 Chr 是 Chr(11),但我认为我不能只将 , Chr(11)) 添加到下面数组的末尾,这将起作用......我如何使用 Chr(# ) 以链接方式?

 Dim i, j As Integer
 dim myField as variant

 varNo = Array("\", "/", ":", "*", "?", """", "<", ">", "|")

 If IsNull(Me.FieldValue) = False Then
    myField = Me.FieldValue 
    For i = 0 To UBound(varNo)
    j = InStr(1, myField , varNo(i))
    If j > 0 Then
        MsgBox "Cannot use character:" & Chr(13) & Chr(10) & Chr(13)
        & Chr(10) & varNo(i), vbCritical, " Illegal Character"

        Exit Sub
        Exit For
    End If
    Next
 End If

同样,上述方法非常适合数组中的那些东西,但我也想包括 Chr()。

【问题讨论】:

  • 我认为您可能会更好地使用正则表达式并检查您被允许的内容,这似乎只包含字母数字。
  • 你可以有另一个数字数组并检查 instr 的 chr(numarray(i))
  • @Remou...我明白了。也许这是要走的路,只是不知道 RegEx 或如何实现这一点,但我很欣赏这个方向。我真的只想允许字母数字字符。

标签: validation vba ms-access chr


【解决方案1】:

您可以使用空字符串作为新的最后一个元素来构建数组,然后将最后一个元素的值更改为Chr(11)。

varNo = Array("\", "/", ":", "*", "?", """", "<", ">", "|", "")
varNo(UBound(varNo)) = Chr(11)

实际上,我不确定为什么有必要这样做。这对我有用...

varNo = Array("\", "/", ":", "*", "?", """", "<", ">", "|", Chr(11))

根据 cmets,我认为确认您正在评估的文本实际上包含您期望的字符会很有用。将文本输入此过程并在“立即”窗口中检查其输出。

Public Sub AsciiValues(ByVal pInput As String)
    Dim i As Long
    Dim lngSize As Long
    lngSize = Len(pInput)
    For i = 1 To lngSize
        Debug.Print i, Mid(pInput, i, 1), Asc(Mid(pInput, i, 1))
    Next
End Sub

【讨论】:

  • @Hans...有一段时间了。你好吗?所以除非我想添加多个,否则这将起作用吗?
  • 我似乎也没有抓住它......不知道为什么,但访问似乎不像它知道它在那里?更正:如果我在末尾添加非法 chr,则 msgbox 显示该值,即:所以它可以看到它,但上面不会导致 j 变量变为 1 只是评估软返回......我可以看到带有箭头符号的奇怪圆圈,最终出现在 xml 中
  • 在您的编辑中:真的!?!我无法让它为我工作......它有一个设置或我错过了什么?谢谢你的帮助顺便说一句
  • 很高兴再次见到你,贾斯汀。好像没看懂是什么意思?我迷路了。
  • 我不知道我对那个编辑做了什么特别或不寻常的事情。我在分配给varNo 之后添加了一个断点,然后在即时窗口中? varNo(UBound(varNo)) 给了我[] 和? Asc(varNo(UBound(varNo))) 给了我11。
【解决方案2】:

这里有一些关于另一种方法的注意事项:

'' Microsoft VBScript Regular Expressions library
'' or CreateObject ("VBScript.RegExp")

Dim rex As New RegExp

With rex
   .MultiLine = False
   .Global = True
   .IgnoreCase = False
End With

'A line for testing
sLine = "abc" & Chr(11)

'Anything that is NOT a-zA-Z0-9 will be matched
rex.Pattern = "[^a-zA-Z0-9]"
If rex.Test(sLine) Then
    Debug.Print "Problem: include only alpha numeric"
End If

【讨论】:

  • 非常感谢上述 Remou....最后一个问题....您知道简单学习该模式方面的好资源吗?就像我想在上述内容中添加空格一样?感谢您的帮助
  • @Justin Your Access 应用程序创建 XML 文件。当这些文件包含不需要的字符时是否需要通知用户? IOW,丢弃(或替换)不需要的字符是否合理?如果是这样,请查看正则表达式替换方法。 regular-expressions.info/vbscript.html
  • 谢谢你们俩。 @Remou ...我现在正在使用它,并在正则表达式测试列表中添加了一些东西,例如 [^a-zA-Z0-9\s'-] 并且它捕获了很多东西,但它并没有捕获所有东西....就像大于/小于考虑到 xml 可能是一个问题。我错过了一些关于这个概念的东西吗?假设将该行用作唯一可接受的值吗?
  • @Hans ...是的,这是一个很酷的主意。如果没有好的角色只是为了将它们排除在外,我只是不让他们在开始时保存值。但我肯定也会检查一下。谢谢大家!
  • 我想你可能正在寻找 rex.Pattern="\W." 回复 regular-expressions.info/reference.html 另请参阅 stackoverflow.com/questions/2991901/…
猜你喜欢
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 2018-06-24
  • 2017-01-16
  • 2011-04-28
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
相关资源
最近更新 更多