【问题标题】:Excel VBA - Any performance benefits between const string range or define names for ranges?Excel VBA - 常量字符串范围或定义范围名称之间的任何性能优势?
【发布时间】:2012-12-23 03:27:04
【问题描述】:

节日,

我有一个问题要帮助我更多地了解 Excel VBA 如何有效地管理已在一个地方声明的已定义范围,以便很好地执行数据。只是想在更多地研究这个项目之前确定哪两个选项(我目前知道)更好或不是首选的最佳实践。

我要解决的问题是制作一个小表格,其中包含一组虚构供应商的许多故障,因此表格看起来像这样(抱歉它是原始形式)

“公司名称”“失败次数”
“做酷机器” 7
“冷却剂区” 5
《小水冷3
“空气动力系统” 7
“将军冷却液”5
“欣赏冷却液”4

我的第一个选项(常量字符串)是这个模块/公式如下。

Option Explicit
Public Const CountofFailures As String = "J7:J12"
Sub btnRandom()
    ' Declaration of variables
    Dim c As Range

    ' Provide a random number for failures across Suppliers
    For Each c In ActiveSheet.Range(CountofFailures)
        c.Value = Random1to10
    Next c
End Sub

Function Random1to10() As Integer
    'Ensure we have a different value each time we run this macro
    Randomize
    ' Provide a random number from 1 to 10 (Maximum number of Failures)
    Random1to10 = Int(Rnd() * 10 + 1)
End Function

第二个选项(定义名称)是这个模块/公式如下。

Option Explicit
Sub btnRandom()
    ' Declaration of variables
    Dim c As Range
    Dim iLoop As Long

    ' Provide a random number for Suppliers with Defined Range
    For Each c In ActiveWorkbook.Names("CountofFailures").RefersToRange
        c.Value = Random1to10
    Next c
End Sub

Function Random1to10() As Integer
    'Ensure we have a different value each time we run this macro
    Randomize
    ' Provide a random number from 1 to 10 (Maximum number of Failures)
    Random1to10 = Int(Rnd() * 10 + 1)
End Function

有什么建议 - 如果有帮助,我会稍后进行宏计时器测试?

如果我获取单元格中列出的范围作为值,是否还有第三种选择?我还没有看到实际执行此操作的代码?

【问题讨论】:

    标签: performance excel defined named-ranges vba


    【解决方案1】:

    我不知道性能差异 - 我怀疑 const 更快。我的一般建议是“在遇到性能问题之前不要担心性能”。否则,您最终会猜测将优化时间花在什么方面,这可能是不正确的。

    对于命名范围,好处是当您插入行和列时它们会移动。如果您在 I 列插入一个新列,您的第一个示例需要编辑,您的第二个示例将继续工作。

    【讨论】:

    • 好的。我会停止思考,直到我知道我有性能问题。
    【解决方案2】:

    您的两个代码都在成为瓶颈的范围内循环。我建议你

    1. 使用范围名称自动“定位”您的数据 - 即,如果您插入/删除行和列,您的引用将保持不变。不过我的经验是,文件中的许多范围名称最终可能会混淆工作簿的功能
    2. 对该范围执行一次写入

    代码

    Sub QuickFill()
    Randomize
    Range("CountofFailures").Formula = "=Randbetween(1,10)"
    Range("CountofFailures").Value = Range("CountofFailures").Value
    End Sub
    

    【讨论】:

    • Brett,我说最后 .value = .value 行与复制相同,粘贴特殊相等值对吗?
    • 是的 - 它将公式转换为值
    • 这么想,感谢布雷特的建议。我将按照这个一般模式安排子例程。
    【解决方案3】:

    我发现命名范围较慢(可能是因为 Excel 必须对名称进行内部查找以找到它所指的内容),但您不太可能找到显着的差异,除非在非常极端的情况下(数万个名称被引用数万或数十万次)。
    正如迪克所说:好处远远超过了微不足道的速度损失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 2019-12-05
      • 2017-10-01
      • 1970-01-01
      相关资源
      最近更新 更多