以更好的例子编辑
我正在尝试使用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
答案 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 Balhoff指出的那样,允许你控制不合格的引用。 但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