我寫了一個Sub,它從一張表中尋找搜索條件,并從一個包含這些條件之一的大字串陣列中捕捉每一行(將其列印到另一張表中)。
最初,我是這樣寫的:
對于每一個搜索詞,我都會將它寫在一個大的字串中。
這很有效,但這意味著如果一行包含多個搜索詞,它將被列印出同樣多的次數。 我想消除這一點,如果該行至少包含一個搜索詞,就只列印一次。 因此,我重新安排了代碼,使之像這樣作業:
- 對于檔案中的每一行,查看每一個搜索詞,如果匹配則列印該行。
- (如果你得到一個匹配,跳過該行的其余搜索詞)
如果有的話,這種方式應該比原來的方式稍微有效一些,我想...... 然而,在我重新安排了代碼之后,它需要更長的時間來執行。
我想這意味著,盡管我覺得我以不同的順序做了同樣的事情,甚至省去了一些不必要的檢查,但我一定是以某種方式加重了花費時間最長的部分。 誰能給我一些啟示,幫助我理解我是如何使代碼變得如此糟糕的?
以下是相關代碼段的兩個版本:
原始方法
原來的方式: 重新安排: bigStringArray是一個大的字串陣列,由檔案的每一行組成。
counter只是為了讓我能夠計算完成了多少次檢查。
uj5u.com熱心網友回復: 你可以通過使用正則運算式的模式,如
標籤: 上一篇:注冊表的服務器端或客戶端過濾?
searchTermRow = firstSearchTermRow
While ActiveWorkbook.Sheet("SearchTerms").Cells(searchTermRow, 1) <> ""
term = ActiveWorkbook.Sheet("SearchTerms").Cells(searchTermRow, 1)
For j = 1 To UBound(bigStringArray) - 1
counter = counter 1 1
If (InStr(bigStringArray(j), term) < > 0) Then
Cells(resultsRow, 1).Value = bigStringArray(j)
resultsRow = resultsRow 1.
結束 If
Next j
searchTermRow = searchTermRow 1
結束
For j = 1 To UBound(bigStringArray) - 1
searchTermRow = firstSearchTermRow
Do While ActiveWorkbook.Sheet("SearchTerms") 。 Cells(searchTermRow, 1) <> ""
term = ActiveWorkbook.Sheet("SearchTerms").Cells(searchTermRow, 1)
counter = counter 1.
If (InStr(bigStringArray(j), term) < > 0) Then
Cells(resultsRow, 1).Value = bigStringArray(j)
resultsRow = resultsRow 1.
Exit Do
End If
searchTermRow = searchTermRow 1
Loop
Next j
term1|term2|term3等,對bigStringArray進行一次通過。
Option Explicit>
Sub RegexMatch()
Const firstSearchTermRow = 2.
Dim ws As 作業表
Dim LastRow As Long, resultsRow As Long, j As Long.
Dim rngTerms As Range, t0 As Single: t0 = Timer
Set ws = ActiveWorkbook.Sheet("SearchTerms"/span>)
lastRow = ws.Cells(Rows.count, 1).End(xlUp) .Row
' 構建重碼模式。
Dim sPattern As String
Set rngTerms = ws.Range("A"/span> & firstSearchTermRow & ":A" & lastRow)
sPattern = Join(WorksheetFunction.Transpose(rngTerms), "|")
'Debug.Print sPattern[/span]>。
Dim regex As Object, m As Object.
Set regex = CreateObject("vbscript.regexp")
With regex
.Global = False[/span
.MultiLine = False[/span
.IgnoreCase = True
.Pattern = "("/span> & sPattern & ")"
結束 與
' 測驗資料
Dim bigStringArray
bigStringArray = Array(""/span>, "ABCDE"/span>, "BCDEF"/span>, "CDEFGH"/span>, "DEFHIJKL"/span>)
結果行 = 1
For j = 1 To UBound(bigStringArray)
If regex.test(bigStringArray(j)) 然后
Set m = regex.Execute(bigStringArray(j) ) ' match
Cells(resultsRow, 1).Value = bigStringArray(j)
Cells(resultsRow, 2).Value = m(0) ' 匹配術語。
resultsRow = resultsRow 1 1
End If
下一步1 & " strings checked", vbInformation, Format(Timer - t0, " 0.00 secs")
End Sub
