用于循环崩溃的VBA嵌套

用于循环崩溃的VBA嵌套,vba,excel,Vba,Excel,我在VBA中有这个函数,除了当它到达For循环时,所有功能都可以工作。它只是崩溃了,我必须关闭Excel和所有功能,不确定如何修复它 Private Sub checkDuplicates(x As Worksheet) Dim n As Integer, i As Long, j As Long Sort x addheader x, "checkDup." n = searchHeader(x, "checkDup.") x.Columns(n) =

我在VBA中有这个函数,除了当它到达
For
循环时,所有功能都可以工作。它只是崩溃了,我必须关闭Excel和所有功能,不确定如何修复它

Private Sub checkDuplicates(x As Worksheet)
    Dim n As Integer, i As Long, j As Long

    Sort x
    addheader x, "checkDup."
    n = searchHeader(x, "checkDup.")
    x.Columns(n) = 1
    For i = 50 To 3 Step -1
        For j = 1 To 5
            If Not x.Cells(i, j) = x.Cells(i - 1, j).Value Then
                x.Cells(i, n) = 0
                Exit For
            End If
        Next j
    Next i
End Sub
根据评论对话,您的代码没有“崩溃”非常努力地工作并在一个紧密的循环中访问单元格值,这是VBA代码所能做的最慢的事情,并且您正在为大量单元格执行此操作

等等。Excel“没有响应”,因为它正忙于运行您的循环并跟上所有正在进行的更新

下面是一些可以帮助它更快完成的内容:

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False

' your code here

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.EnableEvents = True
如果无法在更合理的时间内完成,则需要研究基于数组的方法,将感兴趣的范围转储到内存数组中,对数组进行操作,修改数组值,然后在一次写入操作中将数组转储到工作表中。

根据注释对话,您的代码没有“崩溃”非常努力地工作并在一个紧密的循环中访问单元格值,这是VBA代码所能做的最慢的事情,并且您正在为大量单元格执行此操作

等等。Excel“没有响应”,因为它正忙于运行您的循环并跟上所有正在进行的更新

下面是一些可以帮助它更快完成的内容:

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False

' your code here

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.EnableEvents = True

如果这不能在更合理的时间内完成,那么您需要研究一种基于数组的方法,在这种方法中,您可以将感兴趣的范围转储到内存数组中,对数组进行操作,修改数组值,然后在一次写入中将数组转储到工作表上。

i=lastRow(x)
您在这里调用函数吗?是的,如果在同一模块中调用另一个函数,它将返回一个整数,您所说的“它崩溃”是什么意思?Excel是否只是简单地退出声明它不再工作?或者您的代码只是引发了一个运行时错误,并显示一条错误消息,说明问题可能是什么?在这种情况下,我们需要知道错误消息。@dave我去掉了lastcol和最后一行并用整数替换了它,它仍然不起作用,只是为了使它更简单。您意识到这是在将一个1放入一百万行吗?
I=lastRow(x)
您在这里调用函数吗?是的,在同一模块中调用另一个函数,它返回一个整数“它崩溃”是什么意思?Excel是否只是简单地退出声明它不再工作?或者您的代码只是引发了一个运行时错误,并显示一条错误消息,说明问题可能是什么?在这种情况下,我们需要知道错误消息。@dave我去掉了lastcol和最后一行,用整数替换了它,它仍然不起作用,只是为了简单一点。你意识到这是在将一个1放入一百万行吗?这是有道理的,但OP对
I
使用50,并且仍然“崩溃”。@findwindow Excel总是说“(无响应)“每当VBA代码运行循环且用户开始到处单击时。所有内容都在单个线程上运行。OP可能会有非常慢的PC。这是有道理的,但OP对
i
使用50,并且仍在“崩溃”。@findwindow Excel将始终说(无响应)每当VBA代码运行循环时,用户开始到处点击。所有东西都在单线程上运行。OP的pc速度可能非常慢