有没有一个函数可以做相反的事情FORMULATEXT
例如在单元格中B2
我有:
='[Workshop Schedule 2020.xlsx]Lisburn'!D7
在C2
我使用FORMULATEXT
和中REPLACE
,将 LISBURN 替换为 CANNOCK:
=REPLACE(FORMULATEXT(B2),32,7,"CANNOCK")
以字符串形式返回以下内容。
='[Workshop Schedule 2020.xlsx]CANNOCK'!D7
我现在想将此字符串用作公式。我无法使用,INDIRECT
因为它指向外部工作簿。
答案1
您可以创建一个用户定义函数,例如:
Public Function eval(s As String) As Variant
eval = Evaluate(s)
End Function
因此,如果A1包含文本字符串:
=1/2 & " some text"
然后:
用户定义函数 (UDF) 非常容易安装并使用:
- ALT-F11 打开 VBE 窗口
- ALT-I ALT-M 打开新模块
- 粘贴内容并关闭 VBE 窗口
如果您保存工作簿,UDF 将随之保存。如果您使用的是 2003 之后的 Excel 版本,则必须将文件保存为 .xlsm 而不是 .xlsx
到消除UDF:
- 调出如上所示的 VBE 窗口
- 清除代码
- 关闭 VBE 窗口
到使用Excel 中的 UDF:
=eval(A1)
要了解有关宏的更多信息,请参阅:
http://www.mvps.org/dmcritchie/excel/getstarted.htm
和
http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx
有关 UDF 的详细信息,请参阅:
http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx
必须启用宏才能使其工作!
答案2
我赞赏您愿意使用 VBA 和 UDF,它们让很多事情变得更容易。对于那些不熟悉 VBA 的人来说,UDF 是让他们熟悉 VBA 的好地方,因此它既是入门工具,又常常是绝佳的解决方案。
不过,如果您愿意,您可以不使用 UDF 来做到这一点。这样做非常快,而且不需要像 UDF 那样规划方法,因为您将让 Excel 来弄清楚如何评估结果。
它还可以对您对类似于该INDIRECT()
功能的愿望直接表示“是”。
您可以使用旧的宏语言(已有 25 年历史)函数EVALUATE
。它可用,但仅在命名范围函数中可用。(在宏中,但 Gary 的学生已经完成了一个很好的宏。)将函数输入到工作表本身将失败。
创建一个Named Range
(可能名为“horsey”)。为其Refers to
值输入以下公式:
=EVALUATE(C2)
并保存,关闭命名范围管理器。
现在输入
=horsey
放入工作表上的任何单元格(嗯,B2 和 C2 除外!)将执行INDIRECT()
与单元格引用完全相同的操作。它获取 C2 中的字符串(包括“=”或不包括“=”都没有区别)并将其视为公式。
人们通常认为,EVALUATE()
它的作用有限,只是将一些单元格输入转换17-5+32
为计算结果,即使它是文本且没有等号,所以他们认为它没有什么价值。但它可以做更多复杂的事情,就像你今天要求的那样。
特别是因为我们现在FORMULATEXT()
可以轻松修改工作公式。