【问题标题】:How to adapt a loop's structure to a user's preference?如何使循环的结构适应用户的偏好?
【发布时间】:2012-02-25 18:44:42
【问题描述】:

我正在使用循环来填充集合。集合的每个项目都有一些属性,但其中一些属性是可选的。系统会提示用户选择将哪些属性复制到集合中。如果用户选择忽略它们,是否可以省略可选属性的代码?

Sub fillcoll()
    Dim coll as Collection
    Set coll = New Collection
    Dim NewItem as Class1

    For each r in Selection.Rows
        Set NewItem = New Class1

        If Userform1.Checkbox1.Value = True then
            NewItem.Property1 = somearray1(r.Row)
        End If

        If Userform1.Checkbox2.Value = True then
            NewItem.Property2 = somearray2(r.Row)
        End If

        If Userform1.Checkbox3.Value = True then
            NewItem.Property3 = somearray3(r.Row)
        End If

    Next r
End Sub

使用此代码,在每次迭代时都会读取 Checkboxes 的值。我担心这可能会不必要地减慢程序的执行速度。复选框可以被读取一次,循环的内容将适应复选框的值。这可能吗?

提前致谢。

【问题讨论】:

  • “我担心这可能会不必要地减慢程序的执行速度。”害怕还是知道?问之前你检查过自己吗?除非您知道必须优化,否则不要优化。如果你不知道,那就找出来。
  • 如果您有一个涉及 10,000 次迭代的后台进程,那么每次迭代节省一到两微秒是值得的。但是您的用户必须阅读屏幕、做出决定、移动手指、按键和单击鼠标。用户永远不会注意到节省的时间。
  • 我同意 JCM 和 Tony 的观点。你可能只是担心一些可能根本不存在的事情。顺便说一句 somearray1,2,3 做什么?此外,您可能想读取数组中的范围,然后循环遍历它,而不是循环行本身。这也会提高循环的速度。
  • 谢谢大家。我只是想知道是否有我不知道的编程技术。

标签: vba loops excel


【解决方案1】:

从循环中读取开头的复选框,并将它们的值分配给三个布尔值或一个布尔值数组。然后你每次都从布尔变量中读取。

这将提高性能,因为您不需要访问任何对象变量,而只需访问类/对象内部的布尔值。

【讨论】:

  • 谢谢。但是甚至可以避免从变量中读取吗?我的代码中的三个 IF 似乎没有必要。
  • 如果你想避免代码重复,最好使用布尔值。无论如何,访问布尔值很快。我认为您每秒可以访问超过数十亿次的布尔值
  • 重复引用单元格(r.Row) 也会减慢代码速度,可能不仅仅是选中复选框
猜你喜欢
  • 1970-01-01
  • 2013-09-01
  • 2012-06-13
  • 2010-09-07
  • 1970-01-01
  • 2018-01-08
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
相关资源
最近更新 更多