【问题标题】:Breaking down evaluate in vba在vba中分解评估
【发布时间】:2015-02-25 03:32:08
【问题描述】:

我一直在网上搜索,试图弄清楚评估的用途。我从 msdn 得到的是:“返回应用到列表中的对象的表达式。”我不知道这是什么意思。

我问的原因是因为我得到了一段代码,我试图从中找出一些逻辑意义。为什么这样写?使用评估而不是更传统的方法有什么优势?一长串嵌套函数的正确语法是什么?

这是我的代码示例:

With Range("B1", Cells(Rows.Count, "B").End(xlUp))
        .Value = Evaluate("Index(If(Left(Trim(" & .Address & "),1)=""."",Replace(Trim(" & .Address & "),1,1,""""),Trim(" & .Address & ")),)")
End With

有人可以帮我分解一下并弄清楚它吗?它应该删除前导句点并消除 b 列中所有单元格中的多余空格。我的问题是它只有在我运行两次时才有效。如果我能对此有所了解,那么我也许可以对其进行操作以使其正常运行。

如果我想通过相同的范围并删除所有破折号(“-”),我将如何构建这样的语句?

我真的很想学习。任何帮助表示赞赏。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    好的:

    Evaluate 告诉应用程序在此上下文中评估函数。

    该函数是"Index(If(Left(... 的字符串连接,其中包括一些动态组件(.Address),因为它被应用于整个范围:

    Range("B1", Cells(Rows.Count, "B").End(xlUp))

    这实际上是为该范围内的每个单元格计算公式,但只将公式的计算值写入每个单元格。

    等效的方法是用公式填充范围,然后对范围执行复制 + 特殊粘贴(仅限值)。就内存和耗时过程而言,这显然更昂贵,尤其是对于更大范围的对象。

    我个人不赞成这种方法,但这主要是我个人喜好的问题。

    在这种情况下的优点是它可以填充整个单元格范围 - 在一个语句中可以是 10 个单元格或 10,000 个单元格或 1,048,576 个单元格(在 Excel 2007+ 中)。

    替代方法是执行For/Next 循环(这在内存方面很昂贵,因此在大范围内速度很慢),即使您正在对内存中的数组执行循环并将结果数组写入工作表,我认为使用像这段代码这样的 single 语句有一定的优雅。

    【讨论】:

    • +1 大卫,对学习者来说很好的解释。特别是What this does, effectively, is to evaluate the formula for each cell in that range, but only writes the formula's evaluated value to each cell. 这应该在 MSDN 上 :) Additionally have a look at Evaluate() in VBA
    • 好的,让我看看我是否理解这一点。使用评估,而不是将值存储到变量,对变量执行操作,然后将变量值返回到工作表,评估函数会即时执行此操作吗?这与使用 Application.WorksheetFunction 属性有何不同?
    • @MatthewPaulin 尝试使用 Application.WorksheetFunction 写出这个公式,看看你能走多远 :) Evaluate 让你或多或少地像在单元格本身中一样编写公式。跨度>
    • 感谢您的耐心等待。我只是想确定为什么评估会比简单的东西更好:Sub test456() Dim myRange As Range, c As Range; Set myRange = Range("B1", Cells(Rows.Count, "B").End(xlUp)); For Each c In myRange c.Value = Trim(Replace(c, ".", "", 1, 1)); c.Value = Replace(c, " ", " "); Next; End Sub
    • 参见这篇文章,了解 Evaluate fastexcel.wordpress.com/2011/11/02/… 的一些怪癖
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 2010-10-03
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    相关资源
    最近更新 更多