更快地比较值的速度改进

Speed improvement for Comparing values quicker

我尝试比较两个不同 sheet 中的 2 个值,这里相当简单的逻辑是一个 sheet 中的值 (string2) 需要在另一个的末尾值(字符串 1)。到目前为止,我尝试用一​​个简单的 if:

来检查这个
If string2 like "*" & string1 then
'do stuff
End if

现在的问题是它花费的时间太长了,因为 sheet 1 的每一行都需要与 sheet 2 的每一行进行比较。因为这些是 4600 和 69.000 行,所以相当很多。 在 69.000 行中,只有 50 行是相关的(匹配 if 子句)。

当我手动执行此操作时,它又快又简单,只需过滤相关列即可,甚至没有那么多。但是用 if 子句检查所有这些行需要的时间太长了。

我通过 sheet 的逻辑是这样的:

for i= 2 to AmountOfLinesSheet1

string2 = Sheet1.Cells(i, thisColumn).value

for j = 2 to AmountOfLinesSheet2

string1 = Sheet1.Cells(j, thatColumn).value

'here the if check as shown above

next j

next i

有没有办法改进 if 子句(我不知道如何改进)或者有没有办法更快地进行比较或以某种方式对其进行预排序?所以也许,在开始检查之前,以某种方式将 69.000 行减少到仅相关行?

不是 IF 慢,而是从 Sheet 个单元格中一个一个地获取值。您应该将所有内容放入 Array 以及何时进行 IF 检查。循环所有内容将花费一秒钟或更短的时间:)

Dim MyArrayOne As Variant
Dim MyArrayTwo As Variant

MyArrayOne = Sheets(1).Range("A1:V99").Value
MyArraytWO = Sheets(2).Range("A1:V99").Value

当循环遍历 MyArrayOne 和 MyArrayTwo 时。

循环遍历数组的元素而不是范围的单元格

  • 根据do stuff,这应该会快很多,但肯定需要一秒以上。

  • 如果期望匹配一次(足够),那么 If 语句中的 Exit For 将提高效率。

  • 如果需要一次匹配(足够),通常会使用 Application.Match 而不是第二个循环来加快速度,例如:

    Dim cIndex As Variant: cIndex = Application.Match(string1, Data2, 0)
    If IsNumeric(cIndex) Then
        ' do stuff 
    End If
    
Option Explicit

Sub test()
    
    Dim Data1 As Variant, Data2 As Variant
    Dim thisColumn As Variant, thatColumn As Variant
    Dim AmountOfLinesSheet1 As Long, AmountOfLinesSheet2 As Long
    Dim i As Long, j As Long
    Dim string1 As String, string2 As String
    
    Data1 = Sheet1.Cells(1, thisColumn).Resize(AmountOfLinesSheet1 - 1)
    Data2 = Sheet2.Cells(1, thatColumn).Resize(AmountOfLinesSheet2 - 1)
    
    For i = 2 To AmountOfLinesSheet1
        string1 = Data1(i, 1)
        For j = 2 To AmountOfLinesSheet2
            string2 = Data2(j, 1)
            If string1 Like "*" & string2 Then
            'do stuff
            End If
        Next j
    Next i

End Sub