当引用不是活动工作表的命名范围时,Excel VBA评估函数错误

编辑更好的例子

我正在尝试使用评估函数来评估命名范围的公式引用。 但是,使用评估函数时,如果您没有明确说明表单引用以及单元格引用,它将假定活动工作表作为单元格引用。 这会导致错误的结果

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

使用我想要做的基本示例,假设您在Sheet 1单元格A1中的名称为MyCell的公式如下:

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

如果活动工作表是Sheet 2,并且运行下面的代码,它会给你错误的结果(这是一个快速而脏的例子来说明问题)

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

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

任何想法呢?

这是我发现最接近,但它不是我确切的问题(尽pipe类似的标题),它不提供解决scheme: Excel VBA评估公式从另一个工作表

它几乎总是更好地使用Worksheet.Evaluate而不是默认的Application.Evaluate:正如Mark Ba​​lhoff指出的,允许您控制不合格的引用。 但是Worksheet.Evaluate通常也是Application.Evaluate的两倍。 详情请参阅我的博客posthttps://fastexcel.wordpress.com/2011/11/02/evaluate-functions-and-formulas-fun-how-to-make-excels-evaluate-method-twice-as-fast /

您遇到的问题是,通过deviseExcel将假定所有非特定单元格引用是指现有的工作表。 这就是为什么只要有可能,build议在所有代码中明确指出工作表。

最清洁的方式(用一些MSDN定义狩猎validation)是明确地声明工作表而不激活它:

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

或者,这段代码会将活动工作表更改为正确的工作表,然后在评估之后将其更改回来。 不build议像下面的代码一样执行表单激活,而不会减less情况。 甚至不在这里。

 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是一个简单的单元格引用,如问题中所述。 否则,您将需要使用其他方法来确定目标工作表名称(或硬编码)。

你的路线:

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

相当于:

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

这就是为什么你要根据ActiveSheet中A2的值得到结果的原因。

如果你想检查公式的内容,你可以使用这一行:

Debug.Print [MyCell].Formula

如果您希望Sheet1的MyCell的值,那么您有两个选项:

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

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