2017-06-16 78 views
0

我正在尝试搜索字符串中的特殊字符。控制字符检查花费太长的时间加载

如果在字符串中存在特殊字符,那么代码会向相邻的单元格返回false。

Dim arr(5) 

arr(1) = "19" 
arr(2) = "26" 
arr(3) = "29" 
arr(4) = "32" 
arr(5) = "50" 

'control characters check 
For n = 1 To 5 
    For x = 1 To 41 
     If InStr(1, Range("b" & arr(n)), Chr(x)) = 0 Then 
      For y = 123 To 255 
       If InStr(Range("b" & arr(n)).Value, Chr(y)) > 0 Then 
        Range("e" & arr(n)).Value = "FALSE" 
        Exit For 
       Else 
        Range("e" & arr(n)).Value = "TRUE" 
       End If 
      Next y 
     Else 
      Range("e" & arr(n)).Value = "FALSE" 
      Exit For 
     End If 
    Next x 
Next n 

我的问题是,只是循环几次,花了很长的时间,有没有通过所有的数据节省更多的时间循环更快的方法?

在单元格中字符串数据的一个例子是:TY56D-CAT131BP342AC46-eL-W-00

+0

你有计算手册吗? –

+0

你能提供一个示例字符串吗? – UGP

+0

TY56D-CAT131BP342AC46-eL-W-00 <<这是哪种字符串@UGP – Hank

回答

2

试试这个:

Sub Test() 
Dim arr(5) As String 
Dim iLen As Integer, strV As String 
Dim Found As Boolean: Found = False 
Dim Test As Variant 

arr(1) = "19" 
arr(2) = "26" 
arr(3) = "29" 
arr(4) = "32" 
arr(5) = "50" 

For x = 1 To 5 
    iLen = Len(Range("B" & arr(x)).Value) 
    strV = Range("B" & arr(x)).Value 
    For i = 1 To iLen 
     Select Case Asc(Mid$(strV, i, 1)) 
     Case 1 To 41, 123 To 255 
      Found = True 
      Exit For 
     End Select 
    Next i 
    If Found = False Then 
     Range("E" & arr(x)).Value = "TRUE" 
    Else 
     Found = False 
     Range("E" & arr(x)).Value = "FALSE" 
    End If 
Next x 
End Sub 

计算时间几乎是瞬间。与你的方法不同的是,我浏览了每个角色,然后检查它是否允许。在这种情况下,Select Case可以比for循环更快地完成每个不允许的字符。

1

它看起来像你正由在环指

Range("b" & arr(n)).Value 

可能高达120+次放慢了很多(它本身嵌套在其他循环中)

什么应该立即提高您的宏的速度是在此循环之前将Range值传递给变量,例如:

dim search_string as string 
search_string = Range("b" & arr(n)).Value 

For y = 123 To 255 
    If InStr(search_string, Chr(y)) > 0 Then 
    Range("e" & arr(n)).Value = "FALSE" 

您也想节省一点时间将你的整个搜索范围到一个数组,并就这一工作,但会采取更多的工作,而这是一个快速变化可以使应大幅度提高性能

+1

在你的答案错字 - 应该是'如果InStr(search_string,Chr(y))> 0然后' –

+0

@RobinMackenzie好点 - 谢谢! – danl

0

试试这个:

Sub CheckCharacters() 
    Dim cl(5) As Integer, n As Integer 

    cls = Array(19, 26, 29, 32, 50) 

    For n = 0 To 4 
     If IsValidString(Range("B" & cls(n))) Then 
      Range("B" & cls(n)).Offset(0, 3) = "TRUE" 
     Else 
      Range("B" & cls(n)).Offset(0, 3) = "FALSE" 
     End if 
    Next n 
End Sub 

Function IsValidString(str As String) As Boolean 
    Dim objRegEx As Object 

    Set objRegEx = CreateObject("vbscript.regexp") 

    objRegEx.Pattern = "^[\x2a-\x7a]+" 
    objRegEx.Global = True 
    objRegEx.IgnoreCase = True 

    IsValidString = objRegEx.test(str) 
End Function 

最重要的一点是:

"^[\x2a-\x7a]+" 

这是一个Regex那就是如果字符串只包含字符之间的ASCII值只有真正的42和122(这是什么你要)。

相关问题