Excel VBA评估功能错误当参考不是活动表时命名范围

时间:2016-05-21 02:16:30

标签: excel vba evaluate named-ranges

以更好的例子编辑

我正在尝试使用Evaluate函数来评估命名范围的公式引用。但是,使用“评估”功能时,如果未明确说明工作表引用以及单元格引用,则会将活动工作表视为单元格引用。这会导致错误的结果

在我的真实项目中,我试图只评估命名范围公式的一部分,因此它更加棘手。

使用我正在尝试做的基本示例,假设您在Sheet 1单元格A1中具有以下公式,其名称为MyCell:

="Don't evaluate this part"&"My Result Is " & A2

如果活动工作表是工作表2并且您运行以下代码,它将给出错误的结果(这是一个快速而肮脏的示例来说明问题)

Dim s As String
s = Replace(Range("MyCell").Formula, """Don't evaluate this part""&", "")
Debug.Print Evaluate(s)

它不是给我在Sheet 1的单元格A2中的值,而是给出了Sheet2的单元格A2中的值。

有关于此的任何想法吗?

这是我发现的最接近的,但这不是我的确切问题(尽管有相似的标题)并且它没有提供解决方案: Excel VBA evaluate formula from another sheet

3 个答案:

答案 0 :(得分:2)

您遇到的问题是,设计Excel会假设所有非特定的单元格引用都指的是现有的工作表。这就是为什么建议在所有代码中明确说明工作表的原因。

最干净的方法(通过某些MSDN定义搜索验证)是明确说明工作表而不激活它:

Sub test2()
    Debug.Print Range("MyCell").Worksheet.Evaluate(Range("MyCell").Formula)
End Sub

或者,此代码会将活动工作表更改为正确的工作表,然后在评估后将其更改回来。 不建议在没有情有可原的情况下执行下面的代码表单激活。甚至不在这里。

Sub test()
    Dim ws As Worksheet
    Set ws = ActiveSheet
    Dim s As String
    s = Replace(Range("MyCell").Formula, """Don't evaluate this part""&", "")
    Range("MyCell").Worksheet.Activate  ' Don't remember if .Worksheet or .Parent ??
    Debug.Print Evaluate(s)
    ws.Activate
End Sub

正如ThunderFrame的评论所指出的,重要的是要记住这段代码假定MyCell是一个简单的单元格引用,如问题中所述。否则,您将需要使用其他方法来确定目标工作表名称(或硬编码)。

答案 1 :(得分:1)

使用Worksheet.Evaluate而不是默认的Application.Evaluate几乎总是更好:正如Mark Ba​​lhoff指出的那样,允许你控制不合格的引用。 但Worksheet.Evaluate的速度通常也是Application.Evaluate的两倍。 有关详细信息,请参阅我的博客文章 https://fastexcel.wordpress.com/2011/11/02/evaluate-functions-and-formulas-fun-how-to-make-excels-evaluate-method-twice-as-fast/

答案 2 :(得分:0)

你的专栏:

Debug.Print Evaluate(Range("MyCell").Formula)

相当于:

Debug.Print Evaluate("=""My Result Is "" & A2")

这就是根据ActiveSheet中A2的值得到结果的原因。

如果要检查公式的内容,可以使用以下行:

Debug.Print [MyCell].Formula

如果你想要MyCell相对于Sheet1的值,那么你有两个选择:

1 - 使用Debug.Print Range("Sheet1!MyCell").Value

2 - 使用Debug.Print Sheet1.Range("MyCell").Value