3

节日,

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

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

“公司名称” “故障数”
“Be Cool Machine” 7
“Coolant Quarters” 5
“Little Water Coolants” 3
“Air Mover Systems” 7
“Generals Coolant” 5
“Admire Coolants” 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

任何建议 - 如果这有帮助,我稍后会做一个宏计时器测试?

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

4

3 回答 3

5

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

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

于 2012-12-23T03:52:26.897 回答
3

您的两个代码都遍历将成为瓶颈的范围。我建议你

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

代码

Sub QuickFill()
Randomize
Range("CountofFailures").Formula = "=Randbetween(1,10)"
Range("CountofFailures").Value = Range("CountofFailures").Value
End Sub
于 2012-12-23T03:58:20.327 回答
1

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

于 2012-12-23T12:34:47.990 回答