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


75

0,4*A1在一个单元格中(作为字符串)。如何在另一个单元格中将此“字符串公式”转换为真实公式并计算其值?



你能反过来做吗?从Excel 2013开始,FORMULATEXT()会向您显示创建结果的公式。从最终用户的角度来看,两个单元格中的值看起来都与您所要求的相同。
cartbeforehorse

Answers:


55

Evaluate 可能适合:

http://www.mrexcel.com/forum/showthread.php?t=62067

Function Eval(Ref As String)
    Application.Volatile
    Eval = Evaluate(Ref)
End Function

20
如果使用这种方法,请小心Evaluate()默认情况下,它将在活动工作表的上下文中运行因此类似的输出Eval("0.4*A1")将根据活动的工作表而变化。您可以使用(例如)Application.ThisCell.Parent.Evaluate(Ref)将上下文限制在包含对Eval
Tim Williams

@PrzemyslawRemin是的,它仍然至少对Excel 2016有效
phuclv

这对我有用,但是当要评估的字符串太长时,它开始失败,#VALUE!我认为字符串必须严格小于256个字符(Excel 2010)
alejandro

45

我将公式连接为正常状态,但一开始我没有'=使用=

然后,我将文本复制并粘贴到需要的地方。然后,我突出显示另存为文本的部分,然后按ctrl+H查找并替换。
我替换为'==并且所有功能都处于活动状态。

它的几个阶段,但它避免了VBA。

我希望这有帮助,


4
这是赢家!我使用@是因为'是我公式中的字符
Xcheque 2014年

9
您不需要撇号:它足以替换=为自己
Roman Gudkov

1
非常简单!我发现仅查找和替换=符号对我来说是有效的,因为一开始我没有'字符。
stuartm

如果要使用Find/Replace功能在多个单元格中进行重复的类似编辑,则也可以使用此方法。禁用=with/= @=或任何您想暂时禁用公式并允许公式显示为文本的选项。然后查找/替换您真正想要更改的内容。最终的“查找/替换”将更/= @=改为“ just” =,并将再次变为自计算公式。没有格式更改。
乔恩·格拉

这绝对是GENIUS,只是为我节省了数小时的时间!
PeterH

12

只是为了好玩,我在这里找到了一篇有趣的文章,以使用某种Excel中确实存在的隐藏评估函数。诀窍是将其分配给一个名称,然后在单元格中使用该名称,因为如果直接在单元格中使用EVALUATE()会给您一个错误消息。我尝试了并且有效!如果要在一张纸上跨行复制,可以使用相对名称。


有趣,但似乎不适用于更新版本的Excel。如果我没看错的话,这是将1990年代的Excel行为访问2000年代早期的Excel的技巧,但是在2010、2013,Office 365等中已经过时了?
Craig Celeste 2015年

2
如果可行,什么都不是“过时的”!4.0宏语言提供了一些巧妙的技巧。
约翰尼,为什么

1
不幸的是,没有= EVALUATE()在Excel函数2013
wardw123

它仍然可以在Mac 2011的Excel中正常工作-参见[this](superuser.com/questions/253353/…
Paschi 2015年

它仍然可以在Excel 2013中使用。我刚刚对其进行了测试,但是您必须完成Name链接中描述的技巧。
帕特里克·奥诺涅兹

12

UPDATE以前可以工作(我相信是在2007年),但在Excel 2013中却没有。

EXCEL 2013:

这不是完全一样,但是如果可以在一个单元格(例如B1)中放置0.4,而在另一个单元格(例如C1)中放置文本值A1,则可以在单元格D1中使用= B1 * INDIRECT( C1),则计算出0.4 * A1的值。

因此,如果A1 = 10,您将进入0.4*10 = 4单元格D1。如果可以找到更好的2013解决方案,我将再次更新,对不起,Microsoft破坏了INDIRECT的原始功能!

EXCEL 2007版本:

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

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

如果单元格A1为10,则=0.4*INDIRECT("A1")返回4。


有关详细信息和有用的例子看- contextures.com/xlFunctions05.htmlcpearson.com/excel/indirect.htm
弗兰克

10
indirect对这16个上投票很感兴趣-从我对功能的了解来看,这永远行不通。我可以看到您可能会做些什么,例如=INDIRECT("A"&(0.4*5))使用数学来计算单元格的引用,但是我敢肯定,间接引用不会计算任何东西。
stripybadger 2015年

3
这种方法行不通-如何解决此问题?
蒂姆·威廉姆斯

3
之所以不起作用,是因为公式使用错误。正确的公式是=0.4*INDIRECT(A1)
LPChip

@ Brunox13-撤消了批准的编辑。确实,此答案应该被删除。撰写此评论时,有26票赞成票是有原因的。
BigBen

4

我更喜欢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 '02


0

说,让我们E用返回字符串的公式填充列,例如:

= " = " & D7

其中D7单元格由更复杂的公式组成,它构成最终的期望结果,例如:

= 3.02 * 1024 * 1024 * 1024

因此,在所有巨大的行数中。

当行有一点-它只是够所需的细胞复制的值(人民币)
到最近的塔,比如G,按F2与下面输入每行的。
但是,如果存在大量行,则不可能...

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

没有错误,没有错别字,只是愚蠢的机械动作,

就像在福特传送带上一样。并且仅在几秒钟内

  1. [假设所有涉及的列均为“常规”格式。]
  2. 打开记事本++
  3. 选择整列 D
  4. Ctrl + C
  5. NPP中的Ctrl + V
  6. NPP中的Ctrl + A
  7. 在所需列的第一行中选择单元格 G1
  8. Ctrl + V
  9. 请享用 :) 。

-3

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

例如,= TEXT(“ 0.4 * A1”,'##')将返回值0.4 *该工作表的单元格A1中的值。


1
这是行不通的,公式是错误的(用“而不是用#代替#”。)
wardw123
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.