【问题标题】:Cell comments modifying commands are extremely slow in Excel VBAExcel VBA中的单元格注释修改命令非常慢
【发布时间】:2015-02-23 09:01:43
【问题描述】:

我的问题有点宽泛,但我觉得这个问题非常有趣。

有时我必须使用 VBA 代码在 Excel 工作表中创建/清除 cmets,例如:

Range(someRange).ClearComments

.Comment.Shape.Width = 200

与我的代码中的其他复杂计算相比,这些操作花费了大量的时间(例如每个操作 1 秒)。 每次执行代码时,我都会关闭automaticCalculationsscreenUpdatingEnableEvents 关闭,但这似乎并没有太大的区别。 关于如何加快这些行动的任何想法? 执行这些耗时的命令时,excel 做了什么?

编辑: 该宏在包含大量数据(100x40,000 个单元格)的工作表上运行。 然而,执行只需要该数据的一小部分。 我认为仅在同一数据部分上执行,带到新工作表上的速度要快得多。

【问题讨论】:

  • 我的测试:删除、创建和设置 100k cmets 的宽度 - 不到 14 秒,因此您的工作表或代码可能存在问题。
  • 让我们看看代码,完整的代码
  • 我怀疑我的代码是否有助于解决问题。在这里提供帮助太长了。然而,我发现问题发生在我使用大(40,000 行,100 列)过滤范围时。当我将相同的操作范围切割到另一张纸上时,它的执行速度要快得多....
  • 正如其他人所指出的,您应该至少提供一个您正在使用的代码示例。听起来您有问题,而不是 VBA 自己处理 cmets 的方式。我看不出 Excel 每次需要一秒钟来处理 cmets 的任何理由。
  • 像这样在大范围内循环肯定会导致性能问题。

标签: vba excel


【解决方案1】:

我遇到了同样的问题,发现它可能是Shape.AutoSize 属性。当设置为 true 时,Excel 处理注释的速度明显变慢。在我的情况下,每秒只有大约 4 个。

【讨论】:

    【解决方案2】:

    Application.ScreenUpdating 设置为False。请记住在宏结束时将ScreenUpdating 属性设置回True

    如果您多次使用Comment.Shape.Width, 使用With Statement 使VBA 避免不必要的路径限定。

    With  Comment.Shape
    .Width
    .Height
    ' More properties
    End With
    

    详细了解如何提高宏 here 的速度。

    这将提高您的宏的速度,但是,如果您正在处理大量数据,您会发现几乎没有改进。那么,优化你的代码要好得多。

    【讨论】:

    • 我尝试了所有这些但没有显着效果。另外,为什么 excel 修改一条评论比更改超过 1000 个单元格的值需要更多时间?
    • 你能粘贴你的代码吗?我过去曾与 cmets 打过交道,我对他们没有任何问题。
    【解决方案3】:

    我使用了这个示例,它在 A 列中添加了一个引用 B 列的单元格注释,我在 B 列中填充了 1500 行并运行了大约 4 秒的代码。

    Delete_Comment 代码是即时的。

    Sub Add_Comment()
        Dim Rws As Long, Rng As Range, c As Range
        Rws = Cells(Rows.Count, "B").End(xlUp).Row
        Set Rng = Range(Cells(2, 1), Cells(Rws, 1))
        For Each c In Rng.Cells
    
            With c
                .ClearComments
                .AddComment
                .Comment.Visible = False
                .Comment.Text c.Offset(0, 1).Value
                .Comment.Visible = False
                .Comment.Shape.TextFrame.AutoSize = True
            End With
    
        Next c
    
    End Sub
    
    
    Sub Delete_Comment()
        Dim Rws As Long, Rng As Range
        Rws = Cells(Rows.Count, "B").End(xlUp).Row
        Set Rng = Range(Cells(2, 1), Cells(Rws, 1))
        Rng.ClearComments
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-04
      • 2021-08-14
      • 2014-09-26
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多