更快地比较值的速度改进
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
我尝试比较两个不同 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