我在单元格中输入了字符串0,4*A1
,请问如何将这个“字符串公式”转换成真正的公式,并计算出其值并显示在另一个单元格中?
我在单元格中输入了字符串0,4*A1
,请问如何将这个“字符串公式”转换成真正的公式,并计算出其值并显示在另一个单元格中?
Evaluate
可能适用于:
http://www.mrexcel.com/forum/showthread.php?t=62067
Function Eval(Ref As String)
Application.Volatile
Eval = Evaluate(Ref)
End Function
Evaluate()
函数将在“活动工作表”的上下文中运行,因此像 Eval("0.4*A1")
这样的输出将根据哪个工作表处于活动状态而改变。您可以使用(例如)Application.ThisCell.Parent.Evaluate(Ref)
将上下文限制为包含对 Eval
调用的工作表。 - Tim Williams我像平常一样连接了我的公式,但在开头我使用了'=
而不是=
。
然后我将其复制并粘贴为文本到需要它的地方。然后我突出显示保存为文本的部分,按ctrl + H查找和替换。
我用=
替换了'=
,这样所有的函数都可以正常工作。
虽然这需要几个步骤,但避免了使用VBA。
=
替换为它本身即可。 - Roman Gudkov/=
@=
或其他任何您想要暂时禁用公式并允许公式显示为文本的符号来禁用=
。然后查找/替换您真正想要更改的内容。最终的查找/替换将把/=
@=
等改回=
,它将重新成为自动计算的公式。没有格式更改。 - Jon Grah更新 此公式适用于 Microsoft 365,如同2007年所解释的那样。 原文:这在2007年(我相信)曾经有效,但在Excel 2013中不再有效。
假设我们想要引用单元格'Tab 1'!C3
,但我们希望从列中的选项卡名称和行中的单元格名称进行引用,因此引用是由以下内容构建的:
CONCAT("'",$B2,"'!",D$1)
使用 B2
包含值 Tab 1
和 D1
包含值 C3
。
INDIRECT 公式的工作方式如下
=INDIRECT(CONCAT("'",$B2,"'!",D$1))
"'"
。
虽然不完全相同,但如果可以将0.4放在一个单元格(比如B1),将文本值A1放在另一个单元格(比如C1),在单元格D1中,您可以使用=B1*INDIRECT(C1),这将计算0.4乘以A1的值。
所以,如果A1 = 10,您将在单元格D1中得到0.4*10 = 4
。如果我能找到更好的2013解决方案,我会再次更新,很抱歉微软破坏了INDIRECT的原始功能!
对于非VBA解决方案,请使用INDIRECT
公式。它接受一个字符串作为参数,并将其转换为单元格引用。
例如,=0.4*INDIRECT("A1")
将返回工作表中单元格A1的值乘以0.4的结果。
=0.4*INDIRECT("A1")
将返回4。=INDIRECT("A"&(0.4*5))
这样的操作,即通过数学计算来确定单元格的引用位置,但我相当确定 INDIRECT 函数只会计算引用位置而不会计算其他任何内容。 - stripybadger=0.4*INDIRECT(A1)
。 - LPChip=INDIRECT(CONCAT("'",$B28,"'!",D$1))
,其中B28是一个选项卡的名称,D1是一个单元格的名称。 - undefined只是为了好玩,我发现了一个有趣的文章,介绍如何在Excel中使用一种隐藏的评估函数。诀窍是给它分配一个名称,并在单元格中使用该名称,因为如果直接在单元格中使用EVALUATE(),将会出现错误消息。我尝试了一下,它确实有效!如果你想要在工作表中复制横向行,可以使用相对名称。
针对专业解决方案,我更倾向于使用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表格中使用该过程的示例:
1
,2
,+
,=Evaluate(A1 & A3 & A2)
。我们称此命名区域为“testEval”,=testEval
,E
的列,其中填充了返回字符串的公式,如下所示:= " = " & D7
在这里,D7
单元格包含更为复杂的公式,这些公式组成了最终所需的结果,例如:
= 3.02 * 1024 * 1024 * 1024
因此,在所有大量的行中。
当行数很少时 - 只需将所需单元格作为值复制(通过RMB)到最近的列,例如G
,并在每一行中按下F2,然后按Enter。
但是,在行数巨大的情况下,这是不可能的...
因此,没有VBA。没有额外的公式。没有F&R
没有错误,没有拼写错误,只有愚蠢的机械动作,
就像在福特传送带上一样。而且只需要几秒钟:
D
G1
最好的、非VBA的方法是使用TEXT公式。它以字符串作为参数并将其转换为值。
例如,=TEXT("0.4*A1",'##') 将返回该工作表中单元格A1中的值乘以0.4的结果。