excel - VBA - 避免循环

标签 excel vba

我在 Excel 工作表中分别在 A、B 和 C 列中有以下数据。

+-----------+--------------+----------------+
| RangeName |    Clear?    | Value if Clear |
+-----------+--------------+----------------+
| Name1     | DO NOT CLEAR |                |
| Name2     |              |              6 |
| Name3     |              |              7 |
| Name4     | DO NOT CLEAR |                |
| Name5     | DO NOT CLEAR |                |
| Name6     | DO NOT CLEAR |                |
| Name7     | DO NOT CLEAR |                |
| Name8     | DO NOT CLEAR |                |
| Name9     |              |              5 |
| Name10    |              |              9 |
+-----------+--------------+----------------+

有一个“清除”宏检查每个 excel 范围名称,如果 B 列显示“请勿清除”,那么它将跳过并且什么也不做,如果它是空白的,那么它将清除范围名称并将范围名称值设置为列C、代码如下:
For i = 1 To MaxRowCount

    Select Case Range("RngeTbl").Cells(i, 2).Value
    Case "DO NOT CLEAR" 'do nothing
    Case Else 'set to default value
        Range(Range("RngeTbl").Cells(i, 1).Value).Value = Range("RngeTbl").Cells(i, 3).Value
    End Select

Next i

但是,范围名称的数量正在大量增加,现在我有 32571 个范围名称。

有没有办法可以加快这个宏?我一直在尝试将列放入数组并以某种方式检查,但我没有运气。

请提供任何帮助!

最佳答案

下面的代码应该稍微好一点(如果在 Application.ScreenUpdating = Fasle 的上下文中运行,等等):

Dim A As Variant
Set A = Range("RngeTbl").Value
For i = 1 To UBound(A)
    If A(i,2) <> "DO NOT CLEAR" Then Range(A(i,1)).Value = A(i,3)
Next i

如果 MaxRowCount小于范围内的行数,那么您当然可以使用它而不是 UBound(A)在循环。

关于excel - VBA - 避免循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52534823/

相关文章:

excel - 在用户定义的函数中使用 .find 方法

vba - 使用 VBA 将选项卡添加到 Excel 中的多页用户窗体

excel - 将下一个匹配返回到列中的相等值

vba - 从 Outlook 获取收件箱

excel - 想用一个变量分割列而不用用例

VBA UDF 使用动态数组查找多列条件匹配

c# - 异步读取 Excel 工作表

c# - Excel VBA 项目没有关闭

vba - 创建将分钟转换为 hh :mm:ss 的 VBA 函数

excel - 运行时错误 '1004' : Application Defined or Object-Defined Error