【问题标题】:Inconsistent Runtime error '1004' - Delete method of range class failed不一致的运行时错误“1004” - 范围类的删除方法失败
【发布时间】:2018-04-11 18:35:27
【问题描述】:

我已经在 excel 中编写了一些 VBA 来迭代一组相对较大的数据,以便执行一些基本的格式化和整理。该代码以前有效,并且当我使用断点并单步执行时仍然有效。但是,当我不单步执行它并让代码自行运行时,电子表格会变得无响应。一旦我按了几次转义键,我就会收到运行时 1004 错误(见标题),并且相关行被突出显示。

我想重申,当我在违规行上设置断点并单步执行时,它可以正常工作,并且该行会被适当地删除。此外,当我在更小的数据集中测试语法时,它可以完美运行,因此这与语法无关。

任何帮助将不胜感激,因为我很难过。代码如下:

Private Sub CommandButton21_Click()

Dim index As Integer, lapsedSchemes As New Collection, lapseDates As New 
Collection
Dim iRow As Long
Dim iCol As Integer

Sheet1.Columns(5).NumberFormat = "dd-mmm-yy"                   
Sheet1.Columns(14).NumberFormat = "dd-mmm-yy"                   

iRow = 2

Do While Sheet3.Cells(iRow, 1).Value <> ""                      

    lapsedSchemes.Add Sheet3.Cells(iRow, 1).Value
    lapseDates.Add Sheet3.Cells(iRow, 2).Value
    iRow = iRow + 1

Loop

iRow = 2

Do While Cells(iRow, 7).Value <> ""                            

    index = 1

    If Cells(iRow, 9).Value = "" Then                           
        If Cells(iRow, 7).Value = Cells(iRow, 8).Value Then
           Cells(iRow, 9).Value = "Policy Holder"
        Else
           Cells(iRow, 9).Value = "Dependant"
        End If
    End If

    For Each scheme In lapsedSchemes                                                    

        If Cells(iRow, 4).Value = scheme And Cells(iRow, 5) = lapseDates(index) Then  
            Cells(iRow, 4).EntireRow.Delete                                            
            iRow = iRow - 1
            Exit For
        End If

        index = index + 1

    Next scheme

    iRow = iRow + 1

Loop

appendLegacyData (iRow)
Range("A1:AZ10000").Sort Key1:=Range("A1"), Order1:=xlAscending, Key2:=Range("D1"), Order2:=xlAscending, Key3:=Range("E1"), Order3:=xlAscending, Header:=xlYes

End Sub

违规行是:

Cells(iRow, 4).EntireRow.Delete 

工作表变得无响应,只有当我按几次退出时才会显示运行时错误。

【问题讨论】:

  • 错误时iRow 的值是多少。 Cells(0, 4).EntireRow.Delete 将抛出 1004。
  • 5511 这是 IF 语句为真的第一行。总共有c122k行

标签: vba excel


【解决方案1】:

无响应并不意味着 Excel 崩溃了。逐个删除行真是太慢了。

你可以使用

application.statusbar=cstr(iRow)
DoEvents

查看您的进度并让 Excel 保持响应。

如果它会变慢,我建议您在要删除的行中设置一些值,按该值排序,然后将它们一起删除。

【讨论】:

  • 但代码之前运行良好。另外,即使总共有 c122k 行,也可能只有大约 100 行需要删除。我让它运行了大约 10 分钟而没有响应。
  • 我会尝试你的建议,但我需要在哪里粘贴你的代码?
  • 在主循环中。状态栏是左下角的文本。 DoEvents 刷新整个 Excel。
  • 是的,你是对的,代码正在运行,但速度非常慢!!!它运行良好,直到它到达要删除的第一行,然后它永远不会真正恢复,其余部分运行缓慢的运行时间。我会听取你的建议,只标记要删除的每一行,然后在最后对它们进行排序和删除。谢谢兄弟。
  • 在删除行/列时可能存在一些错误,但很难隔离它。祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多