Vba 循环使用For i=。。。对于大i值或大数据,速度会非常慢并停止
我试图通过比较两组数据的日期来匹配它们 如果数据匹配,则复制两组数据,否则,将搜索第二组数据上的下一个日期,以匹配第一组数据上的日期(第一组数据存储的数字量小于第二组数据) 对于Vba 循环使用For i=。。。对于大i值或大数据,速度会非常慢并停止,vba,excel,Vba,Excel,我试图通过比较两组数据的日期来匹配它们 如果数据匹配,则复制两组数据,否则,将搜索第二组数据上的下一个日期,以匹配第一组数据上的日期(第一组数据存储的数字量小于第二组数据) 对于i的小值,它可以正常工作;对于较大值的i非常慢;如果使用整个i范围(即3到51490),则停止 我相信这一定与的有关,与循环有关,与我正在向单元格而不是数组写入的事实有关,但我不知道如何更改代码 这里是(顺便说一下,所有的应用程序更改都没有任何改进): 这是基于数组的代码 Sub Merge_data() Dim
i
的小值,它可以正常工作;对于较大值的i
非常慢;如果使用整个i范围(即3到51490),则停止
我相信这一定与的
有关,与循环有关,与我正在向单元格而不是数组写入的事实有关,但我不知道如何更改代码
这里是(顺便说一下,所有的应用程序更改都没有任何改进):
这是基于数组的代码
Sub Merge_data()
Dim i As Long, m As Long, j As Long
Dim vR() As Variant, vR2() As Variant, vDB As Variant
Dim r As Long
r = 511103 - 51003 + 1
ReDim vR(1 To r, 1 To 3): ReDim vR2(1 To r, 1 To 3)
vDB = Range("a" & 51003).Resize(r, 8)
For i = 1 To r ' 3 To 51490 until the cell where the date is equal to: 12/30/2016 11:50:00 PM, i.e. row 51490
If vDB(i, 1) = vDB(i, 5) Then
For m = 1 To 3 '
vR(i, m) = vDB(i, m)
vR2(i, m) = vDB(i, m + 4)
Next m
Else
For j = 1 To r
If vDB(i, 1) = vDB(j, 5) Then
For m = 1 To 3 ' 11
vR(i, m) = vDB(j, m)
vR2(i, m) = vDB(j + 1, m + 4)
Next m
Exit For
End If
Next j
End If
Next i
Range("i51003").Resize(r, 3) = vR
Range("m51003").Resize(r, 3) = vR2
End Sub
这是基于数组的代码
Sub Merge_data()
Dim i As Long, m As Long, j As Long
Dim vR() As Variant, vR2() As Variant, vDB As Variant
Dim r As Long
r = 511103 - 51003 + 1
ReDim vR(1 To r, 1 To 3): ReDim vR2(1 To r, 1 To 3)
vDB = Range("a" & 51003).Resize(r, 8)
For i = 1 To r ' 3 To 51490 until the cell where the date is equal to: 12/30/2016 11:50:00 PM, i.e. row 51490
If vDB(i, 1) = vDB(i, 5) Then
For m = 1 To 3 '
vR(i, m) = vDB(i, m)
vR2(i, m) = vDB(i, m + 4)
Next m
Else
For j = 1 To r
If vDB(i, 1) = vDB(j, 5) Then
For m = 1 To 3 ' 11
vR(i, m) = vDB(j, m)
vR2(i, m) = vDB(j + 1, m + 4)
Next m
Exit For
End If
Next j
End If
Next i
Range("i51003").Resize(r, 3) = vR
Range("m51003").Resize(r, 3) = vR2
End Sub
“我写的是单元格而不是数组”这一事实是正确的。检查“请编辑您的问题”中的“在一次操作中读取/写入大块单元格”部分,使其不是大块文本。没有间隔的阅读会让人讨厌。你忘了重新打开屏幕更新。与性能相关,使用阵列可以解决一半的问题,但在循环中也有三个嵌套级别—每个级别都会以指数方式增加处理时间。如果你不能用一种更简单的方式解释最终目标,那么很难改进下半部分。我不打算用我看不见的数据来环绕所有的循环,但似乎有一个直接的机会,使用m=1到3,并简单地使用一个范围大小,例如单元格(i,9)。调整大小(,3)。值2=单元格(i,1).Resize(,3).Value2和单元格(i,13).Resize(,3).Value2=单元格(i,5).Resize(,3).Value2和以后的Do循环单元格(i,9).Resize(,3).Value2=单元格(i,1).Resize(,3).Value2和单元格(i,13).Resize(,3).Value2=单元格(j+1,5).Resize(,3).value2您没有在子文件末尾重置事件处理(可能需要交换该行?“我正在写入单元格而不是数组的事实”是正确的。检查“请编辑您的问题”中的“在一次操作中读取/写入大块单元格”部分,使其不是大块文本。没有间隔的阅读会让人讨厌。你忘了重新打开屏幕更新。与性能相关,使用阵列可以解决一半的问题,但在循环中也有三个嵌套级别—每个级别都会以指数方式增加处理时间。如果你不能用一种更简单的方式解释最终目标,那么很难改进下半部分。我不打算用我看不见的数据来环绕所有的循环,但似乎有一个直接的机会,使用m=1到3,并简单地使用一个范围大小,例如单元格(i,9)。调整大小(,3)。值2=单元格(i,1).Resize(,3).Value2和单元格(i,13).Resize(,3).Value2=单元格(i,5).Resize(,3).Value2和以后的Do循环单元格(i,9).Resize(,3).Value2=单元格(i,1).Resize(,3).Value2和单元格(i,13).Resize(,3).Value2=单元格(j+1,5).Resize(,3).value2您没有在子项末尾重置事件处理(可能需要交换该行?)