如何将字符串公式转换为“真实”公式?

92

我在单元格中输入了字符串0,4*A1,请问如何将这个“字符串公式”转换成真正的公式,并计算出其值并显示在另一个单元格中?


Excel函数可以将字符串作为公式进行计算吗? - phuclv
你能否换个方式来做吗?从Excel 2013开始,FORMULATEXT()函数可以显示创建结果的公式。从最终用户的角度来看,两个单元格中的值看起来与您所要求的相同。 - cartbeforehorse
9个回答

59

22
使用此方法时要小心:默认情况下,Evaluate() 函数将在“活动工作表”的上下文中运行,因此像 Eval("0.4*A1") 这样的输出将根据哪个工作表处于活动状态而改变。您可以使用(例如)Application.ThisCell.Parent.Evaluate(Ref) 将上下文限制为包含对 Eval 调用的工作表。 - Tim Williams
@PrzemyslawRemin 是的,它至少在 Excel 2016 上仍然有效。 - phuclv
这对我来说是有效的,但当要评估的字符串过长时,它开始出现“#VALUE!”错误。我认为该字符串必须严格控制在256个字符以下(Excel 2010)。 - alejandro

58

我像平常一样连接了我的公式,但在开头我使用了'=而不是=

然后我将其复制并粘贴为文本到需要它的地方。然后我突出显示保存为文本的部分,按ctrl + H查找和替换。
我用=替换了'=,这样所有的函数都可以正常工作。

虽然这需要几个步骤,但避免了使用VBA。


4
这是一个胜利者!我使用@符号,因为'是我公式中的一个字符。 - Xcheque
15
不需要使用撇号,只需将 = 替换为它本身即可。 - Roman Gudkov
1
太棒了!我发现只需找到并替换“=”符号就可以解决我的问题,因为我没有在开头加上“'”字符。 - stuartm
如果您想使用“查找/替换”功能在多个单元格中进行重复的相似编辑,也可以使用此方法。使用/= @=或其他任何您想要暂时禁用公式并允许公式显示为文本的符号来禁用= 。然后查找/替换您真正想要更改的内容。最终的查找/替换将把/= @=等改回=,它将重新成为自动计算的公式。没有格式更改。 - Jon Grah
这绝对是天才之举,刚刚为我节省了数小时的时间! - PeterH
不幸的是,对于我(Excel 365 v2102),查找和替换无法找到前导的'。所以我复制到记事本并粘贴回来,这样可以正常工作。 - Peter Smallwood

16

更新 此公式适用于 Microsoft 365,如同2007年所解释的那样。 原文:这在2007年(我相信)曾经有效,但在Excel 2013中不再有效。

EXCEL Microsoft 365

假设我们想要引用单元格'Tab 1'!C3,但我们希望从列中的选项卡名称和行中的单元格名称进行引用,因此引用是由以下内容构建的:

CONCAT("'",$B2,"'!",D$1)

使用 B2 包含值 Tab 1D1 包含值 C3

INDIRECT 公式的工作方式如下

=INDIRECT(CONCAT("'",$B2,"'!",D$1))

请注意需要在开头加上所需的"'"

EXCEL 2013:

虽然不完全相同,但如果可以将0.4放在一个单元格(比如B1),将文本值A1放在另一个单元格(比如C1),在单元格D1中,您可以使用=B1*INDIRECT(C1),这将计算0.4乘以A1的值。

所以,如果A1 = 10,您将在单元格D1中得到0.4*10 = 4。如果我能找到更好的2013解决方案,我会再次更新,很抱歉微软破坏了INDIRECT的原始功能!

EXCEL 2007版本:

对于非VBA解决方案,请使用INDIRECT公式。它接受一个字符串作为参数,并将其转换为单元格引用。

例如,=0.4*INDIRECT("A1")将返回工作表中单元格A1的值乘以0.4的结果。

如果A1单元格的值是10,那么=0.4*INDIRECT("A1")将返回4。

10
我对这 16 个点赞很感兴趣 - 根据我对 INDIRECT 函数的理解,这种方法是行不通的。我可以看到你可能会尝试像 =INDIRECT("A"&(0.4*5)) 这样的操作,即通过数学计算来确定单元格的引用位置,但我相当确定 INDIRECT 函数只会计算引用位置而不会计算其他任何内容。 - stripybadger
4
这种方法行不通 - 我们该如何修正这个答案? - Tim Williams
3
它不能工作的原因是公式使用错误。正确的公式是=0.4*INDIRECT(A1) - LPChip
1
@Brunox13 - 撤销了已批准的编辑。实际上,这个答案应该被删除。截至发表此评论时,它已经有26个反对票,这是有原因的。 - BigBen
这是我在几分钟内完成预定任务的方法,它对我非常有帮助。我需要在公式中加上一些引号,但它在2023年的Microsoft 365(Office)上完成了工作。这是我的工作示例=INDIRECT(CONCAT("'",$B28,"'!",D$1)),其中B28是一个选项卡的名称,D1是一个单元格的名称。 - undefined
显示剩余3条评论

12

只是为了好玩,我发现了一个有趣的文章,介绍如何在Excel中使用一种隐藏的评估函数。诀窍是给它分配一个名称,并在单元格中使用该名称,因为如果直接在单元格中使用EVALUATE(),将会出现错误消息。我尝试了一下,它确实有效!如果你想要在工作表中复制横向行,可以使用相对名称。


有趣但似乎不适用于较新版本的Excel。如果我理解正确,这是一种将被抑制的1990年代Excel行为访问到早期2000年代Excel的技巧,但在2010年、2013年、Office 365等方面已经过时了? - Craig Celeste
2
如果它能够正常工作,那么就没有过时的概念!4.0宏语言提供了一些巧妙的技巧。 - johny why
1
遗憾的是,Excel 2013 中没有 =EVALUATE() 函数。 - Ward W
它仍然在Excel for Mac 2011中起作用-参见这里 - Paschi
它仍然适用于Excel 2013。我刚刚测试了一下,但你必须按照链接中描述的“名称”技巧进行操作。 - iDevlop
名称技巧仍将调用VBA中的EVALUATE函数,因此您需要保存为启用宏的文件格式(xlsm)。 - Alexander

5

针对专业解决方案,我更倾向于使用VBA解决方案。

仅搜索和替换完整单词的问题中,我使用以下VBA过程进行替换:

''
' Evaluate Formula-Text in Excel
'
Function wm_Eval(myFormula As String, ParamArray variablesAndValues() As Variant) As Variant
    Dim i As Long

    '
    ' replace strings by values
    '
    For i = LBound(variablesAndValues) To UBound(variablesAndValues) Step 2
        myFormula = RegExpReplaceWord(myFormula, variablesAndValues(i), variablesAndValues(i + 1))
    Next

    '
    ' internationalisation
    '
    myFormula = Replace(myFormula, Application.ThousandsSeparator, "")
    myFormula = Replace(myFormula, Application.DecimalSeparator, ".")
    myFormula = Replace(myFormula, Application.International(xlListSeparator), ",")

    '
    ' return value
    '
    wm_Eval = Application.Evaluate(myFormula)
End Function


''
' Replace Whole Word
'
' Purpose   : replace [strFind] with [strReplace] in [strSource]
' Comment   : [strFind] can be plain text or a regexp pattern;
'             all occurences of [strFind] are replaced
Public Function RegExpReplaceWord(ByVal strSource As String, _
ByVal strFind As String, _
ByVal strReplace As String) As String

    ' early binding requires reference to Microsoft VBScript
    ' Regular Expressions:
    ' with late binding, no reference needed:
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")

    re.Global = True
    're.IgnoreCase = True ' <-- case insensitve
    re.Pattern = "\b" & strFind & "\b"
    RegExpReplaceWord = re.Replace(strSource, strReplace)
    Set re = Nothing
End Function

在Excel表格中使用该过程的示例:

在Excel表格中的使用


3
我认为最好的解决方案在这个链接中: http://www.myonlinetraininghub.com/excel-factor-12-secret-evaluate-function 以下是摘要:
  1. 在单元格A1中输入1
  2. 在单元格A2中输入2
  3. 在单元格A3中输入+
  4. 创建一个命名区域,在创建命名区域时,在“引用”字段中输入=Evaluate(A1 & A3 & A2)。我们称此命名区域为“testEval”,
  5. 在单元格A4中输入=testEval
单元格A4应该有值3。
注意事项:
a)不需要编程/VBA。
b)我在Excel 2013中完成了这个操作并且它是有效的。

给出的例子没有起作用,但链接中的例子起作用了。这正合适。谢谢。 - JayJay123
Excel用户的完美解决方案 - Suhail Abdul Rehman Chougule

2
这是Excel 2019。"EVALUATE"不是有效的命令。

evaluate isn't valid

如果我们将其创建为命名区域,它将起作用:
edit name dialog 但在这种情况下,我们提供了绝对引用,这不好:
  1. 每次重复使用时都需要修改公式。
  2. 当A1中的值发生更改时,计算结果不会更改。

解决方案:

=EVALUATE(GET.CELL(5,OFFSET(INDIRECT("RC",FALSE),0,-1)))

edit name dialog

result EVAL_ON_LEFT


2
假设我们有一列名为 E 的列,其中填充了返回字符串的公式,如下所示:
= " = " & D7

在这里,D7单元格包含更为复杂的公式,这些公式组成了最终所需的结果,例如:

= 3.02 * 1024 * 1024 * 1024

因此,在所有大量的行中。

当行数很少时 - 只需将所需单元格作为值复制(通过RMB)到最近的列,例如G,并在每一行中按下F2,然后按Enter
但是,在行数巨大的情况下,这是不可能的...

因此,没有VBA。没有额外的公式。没有F&R

没有错误,没有拼写错误,只有愚蠢的机械动作,

就像在福特传送带上一样。而且只需要几秒钟

  1. [假设,所有涉及的列都是“常规”格式。]
  2. 打开Notepad ++
  3. 选择整个列D
  4. Ctrl + C
  5. Ctrl + V在NPP中
  6. Ctrl + A在NPP中
  7. 选择所需列的第一行中的单元格G1
  8. Ctrl + V
  9. 享受 :)

记事本的解决方案对我很有效。 - Peter Smallwood

-4

最好的、非VBA的方法是使用TEXT公式。它以字符串作为参数并将其转换为值。

例如,=TEXT("0.4*A1",'##') 将返回该工作表中单元格A1中的值乘以0.4的结果。


1
这个不起作用,而且公式是错误的(应该使用“而不是'来围绕##。) - Ward W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接