在vba中打破评价

时间:2013-09-05 00:37:49

标签: excel vba excel-vba

我一直在网上搜索,试图找出评估的用途。我从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中所有单元格中的多余空格。我的问题是它只有在我运行两次时才有效。如果我能从中理解这一点,那么我可以操纵它以使其正常运行。

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

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

1 个答案:

答案 0 :(得分:3)

好的就是:

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

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

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

这实际上是有效的,是评估该范围内每个单元格的公式,但只将公式的评估值写入每个单元格。

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

我个人不喜欢这种做法,但这主要取决于我个人的偏好。

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

替代方法是进行For/Next循环(在内存方面很昂贵,因此在大范围内变慢),即使你在内存中对数组进行循环并编写结果数组也是如此在工作表中,我认为使用像此代码一样的单个语句有一定的优雅。