【问题标题】:Running Macro Crashes Excel运行宏会导致 Excel 崩溃
【发布时间】:2018-08-17 23:04:44
【问题描述】:

我正在尝试运行宏,但现在它一直冻结 excel。 它使用 10 个单元格运行,但当宏应用于将近 200 个单元格时,它会冻结并崩溃。

Sub eancheck()

    Dim s1 As Worksheet, s2 As Worksheet
    Dim Msg As String
    Set s1 = Sheets("Sheet1")
    Set s2 = Sheets("Sheet3")
    Dim lr1 As Long, lr2 As Long
    lr1 = s1.Range("A" & Rows.Count).End(xlUp).Row
    lr2 = s2.Range("a" & Rows.Count).End(xlUp).Row
    Dim i As Long, j As Long
    Application.ScreenUpdating = False
    For i = 2 To lr1
   s1.Cells(i, "D").Interior.ColorIndex = 0
        For j = 2 To lr2
            If s2.Range("A" & j) = s1.Range("D" & i) Then
                's1.Range("D" & i) = s2.Range("B" & j)
                s1.Cells(i, "D").Interior.ColorIndex = 3
            End If
        Next j
    Next i
    Application.ScreenUpdating = True

End Sub

我也遇到了其他宏的问题,我认为是因为范围的大小。我该如何解决?

注意:当在包含两列的工作表中搜索 10 个值时,宏会运行,每列几乎有 200.000 个值,但是当 10 不是 200 时,会崩溃。

【问题讨论】:

  • 跨行 lr1= 和 lr2= 时按 F8 一次执行代码,将鼠标悬停在这两个变量上并查看它们的内容。
  • Dim i As Long, j As Long
  • 显而易见的是 lr1 和 lr2 的值是什么。我怀疑你需要两个循环。另外,为什么不使用条件格式?
  • 我认为颜色索引刻度上的无填充是 -4142。
  • @CátiaFonseca 您有两个循环,其中一个 i 值它为 j 在这种情况下迭代 200 次,这不是必需的。

标签: vba excel vlookup


【解决方案1】:

在您的 sheet1 中使用带有公式的条件格式,并将其应用于 D2:D5000 等范围或任何合适的范围。

=COUNTIF(Sheet3!A2,D2)>0

【讨论】:

  • 我认为 CF 是有道理的,但我认为它需要是 =COUNTIF(Sheet3!A2:A1000,D2)>0 或类似的?
  • `=isnumber(match(...)) 是更少的计算周期。 (...)
  • 是的!我去做 !谢谢你。少运行一个宏!
  • @SJR ,没错!像魅力一样工作。我运行了一个宏来避免用户删除条件,但我认为这是不崩溃的唯一方法。
【解决方案2】:
  1. 尝试分别声明所有必需的变量。
  2. 在程序开始时使用 Application.ScreenUpdating = false。
  3. for 循环的第一行也可以在 for 循环之外。
  4. 使用集合进行检查。

例如,我从 Sheet 1 Col A 上的此类数据开始,

Sheet 3 Col A 上的数据类似。

这是我拥有的宏,

Sub eancheck()
    Application.ScreenUpdating = False
    Dim s1 As Worksheet
    Dim s2 As Worksheet
    Dim Msg As String
    Dim lr1 As Long
    Dim lr2 As Long
    Dim i As Long
    Dim j As Long
    Dim Sheet1ObjectsCol As Collection
    Dim Sheet3ObjectsCol As Collection
    Dim IdentifierCol As Collection

Set s1 = ThisWorkbook.Sheets("Sheet1")
Set s2 = ThisWorkbook.Sheets("Sheet3")

Set Sheet1ObjectsCol = New Collection
Set Sheet3ObjectsCol = New Collection
Set IdentifierCol = New Collection

lr1 = s1.Range("A" & Rows.Count).End(xlUp).Row
lr2 = s2.Range("a" & Rows.Count).End(xlUp).Row
s1.Range("D2" & ":" & "D" & lr1).Interior.ColorIndex = 0


'Load the collections
For i = 2 To lr1
Sheet1ObjectsCol.Add s1.Range("A" & i).Value
Next



'Load the collections
 On Error Resume Next
 For i = 2 To lr2
 Sheet3ObjectsCol.Add s2.Range("A" & i).Value, CStr(s2.Range("A" & i).Value)
 Next



'Create the Identifier Collection
For i = 1 To Sheet1ObjectsCol.Count
            ColorValReq = 0
    For j = 1 To Sheet3ObjectsCol.Count
        If Sheet1ObjectsCol(i) = Sheet3ObjectsCol(j) Then
            ColorValReq = 3
            GoTo Idenitified
        End If
    Next

Idenitified:
IdentifierCol.Add ColorValReq
Next

For i = 1 To IdentifierCol.Count
    j = i + 1
    If IdentifierCol(i) = 3 then
      s1.Range("D" & j).Interior.ColorIndex = IdentifierCol(i)
    End if
Next

Application.ScreenUpdating = True

End Sub

这是我得到的输出,

【讨论】:

  • 我在您的代码中遇到了错误。 s1.Range(D2 & ":" & "D" & lr1).Interior.ColorIndex = 0 你能帮忙吗?也许我必须调整范围,但对我来说似乎是正确的。
  • 我的错误 - 试试这个 - s1.Range("D2" & ":" & "D" & lr1).Interior.ColorIndex = 0 这应该可以工作。你能告诉我工作簿上 Sheet1 中的 A 列和 Sheet3 中的 A 列的最后一行吗?
  • 您还可以将所有这些对象加载到集合中并运行它。这将比这快得多。
  • 它成功了,但它又冻结了!我的错。那么我如何加载到集合中。抱歉,我在 excel 方面不是那么专业,我只是想制作几个宏来让某人的生活更轻松/更快。
  • 没问题。您能否在表格 1 上的 colA 和表格 3 上的 ColA 中提供一小部分数据样本以及您的预期输出。我更感兴趣的是看到预期的输出。
猜你喜欢
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-23
  • 1970-01-01
  • 2013-05-24
  • 2021-10-01
相关资源
最近更新 更多