将文本限制为仅允许的字符 - (不是通过枚举错误的字符)| VBA

时间:2018-02-21 08:23:34

标签: string vba validation

我想限制某些文本框只接受[A-Za-z] 我希望,Like的对应物存在。 使用Like我必须列出一长串不允许的字符才能过滤。

Not MyString like [?;!°%/=....]

我可以想到以下形式的解决方案:

For Counter = 1 To Len(MyString)
    if Mid(MyString, Counter, 1) Like "*[a-z]*" = false then
        MsgBox "String contains bad characters"
        exit sub
    end if
next

...但是有更复杂的1liner解决方案吗?

在那之前,我已经创建了一个函数来使它成为“Oneliner”:

Function isPureString(myText As String) As Boolean
    Dim i As Integer
    isPureString = True
    For i = 1 To Len(myText)
        If Mid(myText, i, 1) Like "*[a-zA-Z_íéáűúőöüóÓÜÖÚŐŰÁÉÍ]*" = False Then
            isPureString = False
        End If
    Next
End Function

如果我再添加1个参数,也可以在调用函数时定义允许的字符。

1 个答案:

答案 0 :(得分:0)

好吧,看来我的问题有点重复,即使我的搜索结果中没有弹出。 因此,@ QHarr会发布链接。

我可以通过这个想法为我的" oneliner"是:

If myText Like WorksheetFunction.Rept("[a-zA-Z]", Len(myText))=false then 'do something.

在我的观点中使用.rept是一种鼓舞人心的聪明和优雅。 那么做什么:将每个字符的搜索条件相乘,而不是循环遍历字符。

修改
在最好的解决方案中,最新的领导者是:

If not myText Like "*[!A-Za-z]*" then '... do something

统计信息更新:
我测试了最后3个解决方案'性能: 我在开头,结尾或无处都在下面的文字中粘贴了@。 标准是:"*[a-zA-Z \S.,]*"
重复100000次

text = "This will be a very Long text, with one unwanted in the middle, to be able to test the difference in performance of the approaches."

1。)使用[!...] - >如果没有错误, 30ms 有错误, 80ms 2.)使用.Rept - >所有情况下 1800ms 左右 3.)使用characterLoop + Mid - > 3000ms 如果没有错误/ 40-80ms ms如果早期错误