Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 循环使用For i=。。。对于大i值或大数据,速度会非常慢并停止_Vba_Excel - Fatal编程技术网

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您没有在子项末尾重置事件处理(可能需要交换该行?)