【问题标题】:How to turn a string formula into a "real" formula?如何将字符串公式转换为“真实”公式?
【发布时间】:2011-05-27 04:36:56
【问题描述】:

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

【问题讨论】:

标签: excel string formula worksheet-function evaluate


【解决方案1】:

Evaluate 可能适合:

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

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

【讨论】:

  • 如果使用这种方法要小心Evaluate() 默认情况下会在活动工作表的上下文中运行,所以输出类似于@ 987654325@ 将根据哪个工作表处于活动状态而变化。您可以使用(例如)Application.ThisCell.Parent.Evaluate(Ref) 将上下文限制在包含对 Eval 的调用的工作表中
  • @PrzemyslawRemin 是的,它至少对 Excel 2016 仍然有效
  • 这对我有用,但是当要评估的字符串太长时,它开始以#VALUE! 失败我认为字符串必须严格低于 256 个字符(Excel 2010)
【解决方案2】:

我像往常一样连接我的公式,但一开始我有'=而不是=

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

这是几个步骤,但它避免了 VBA。

【讨论】:

  • 这是赢家!我使用 @ 因为 ' 是我的公式中的一个字符
  • 你不需要撇号:用它自己替换=就足够了
  • 非常简单!我发现找到并替换 = 符号对我有用,因为我在开头没有 ' 字符。
  • 如果您想使用Find/Replace 函数在多个单元格中进行重复、类似的编辑,也可以使用此方法。禁用 =/= @= 或任何你想暂时禁用公式并允许公式显示为文本的东西。然后查找/替换您真正想要更改的内容。最终的 Find/Replace 将把 /= @= 等改回 = ,它将再次成为自计算公式。没有格式更改。
  • 这绝对是天才,为我节省了好几个小时的时间!
【解决方案3】:

更新这曾经有效(我相信在 2007 年),但在 Excel 2013 中无效。

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") 将返回 0.4 * 该工作表单元格 A1 中的值。

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

【讨论】:

  • 有关更多信息和有用示例,请参阅 - contextures.com/xlFunctions05.htmlcpearson.com/excel/indirect.htm
  • 我对 16 票赞成票很感兴趣 - 据我了解 indirect 函数,这永远不会起作用。我可以看到您可能会如何执行=INDIRECT("A"&(0.4*5)) 之类的操作,即使用数学计算单元格的引用,但我很确定间接不会计算除引用之外的任何其他内容。
  • 这种方法不起作用 - 我们如何解决这个问题?
  • 之所以不行,是因为公式用错了。正确的公式是=0.4*INDIRECT(A1)
  • @Brunox13 - 撤消了已批准的编辑。真的,这个答案应该被删除。在撰写此评论时,它有 26 个反对票是有原因的。
【解决方案4】:

只是为了好玩,我找到了一个interesting article here,以使用 Excel 中确实存在的某种隐藏的评估函数。诀窍是将它分配给一个名称,并在您的单元格中使用该名称,因为如果直接在单元格中使用 EVALUATE() 会给您一个错误消息。我试过了,它有效!如果要跨行复制工作表,则可以将其与相对名称一起使用。

【讨论】:

  • 有趣但似乎不适用于较新版本的 Excel。如果我没看错的话,将 1990 年被抑制的 Excel 行为访问到 2000 年早期的 Excel 中,但在 2010 年、2013 年、Office 365 等中已经过时,这是一个技巧?
  • 如果它有效,没有什么是“过时的”! 4.0 宏语言提供了一些巧妙的技巧。
  • 遗憾的是,Excel 2013 中没有 =EVALUATE() 函数。
  • 它仍然可以在 Excel for Mac 2011 中工作 - 请参阅 [this] (superuser.com/questions/253353/…)
  • 它仍然适用于 Excel 2013。我刚刚测试过,但您必须通过链接中描述的 Name 技巧。
【解决方案5】:

我更喜欢专业解决方案的 VBA 解决方案。

问题中的替换过程部分 search and replace WHOLE WORDS ONLY,我使用以下 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 工作表中的用法如下:

【讨论】:

    【解决方案6】:

    在我看来,最好的解决方案是在这个链接中: http://www.myonlinetraininghub.com/excel-factor-12-secret-evaluate-function

    总结如下:

    1. 在单元格 A1 中输入1
    2. 在单元格 A2 中输入2
    3. 在单元格 A3 中输入+
    4. 创建命名范围,在创建命名范围时在引用字段中使用=Evaluate(A1 &amp; A3 &amp; A2)。我们称这个命名范围为“testEval”,
    5. 在单元格 A4 中输入=testEval

    单元格 A4 中的值应为 3。

    注意事项:
    a) 无需编程/VBA。
    b) 我在 Excel 2013 中执行此操作,并且有效。

    【讨论】:

    • 给定的示例不起作用,但链接中的示例确实有效。这符合要求。谢谢。
    • excel 用户的完美解决方案
    【解决方案7】:

    此处为 Excel 2019。 EVALUATE 无效。

    如果我们从中创建一个命名范围,它会起作用:

    但是在这种情况下,我们提供了一个绝对引用,这并不好:

    1. 每次我们想要重复使用公式时,我们都必须修改它。
    2. 当A1中的值改变时,评估结果不会改变。

    解决办法:

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

    【讨论】:

      【解决方案8】:

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

      = " = " & D7
      

      其中D7 单元格包含更复杂的公式,构成最终所需的结果,例如:

      = 3.02 * 1024 * 1024 * 1024
      

      所以在所有大量的行中。

      当行数很少时 - 将所需的单元格复制为值就足够了(按 RMB)
      到最近的列,比如G,然后按 F2 并在每一行中按 Enter
      但是,如果行数很大,这是不可能的......

      所以,没有 VBA。没有额外的公式。没有 F&R

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

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

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

      【讨论】:

        【解决方案9】:

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

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

        【讨论】:

        • 这行不通,而且公式有误(## 前后用" 代替'。)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 2019-07-12
        • 1970-01-01
        相关资源
        最近更新 更多