Excel – 将string转换为公式

我有一个通过一系列连接string生成的公式。 举一个例子来解释一下:

打开一个新的Excel工作簿

A1 = 5 C1 = 5 & "+A1" [A1 is seen as text. C1 will contain "5+A1" ] 

我想E1将C1的结果作为一个公式来计算,所以基本在这个例子中。

我试图使用INDIRECT(C1)但它没有工作。

更新:它必须使用自定义单元格名称。 所以如果例如我把名字“mycell”分配给A1,那么字段C1将包含“5 + mycell”

更新2:我的真实数据:

表单1,单元格Y20包含此:

 -0,0000014369849267*Drehzahl^2 + 0,0401449351560780*Drehzahl - 32,5068828005099000 

工作表2,单元格J7包含此:

 = 'Sheet 1'!Y20 

表单2,单元格J8包含这个:

 = eval(J7) 

表格2,单元格C7更名为Drezahl

更新3:一个不适合我的公式:

它需要4个自定义的重命名单元格:“Drezahl”(value = 3550)Kondtemp(45)Saugtemp(-45)Schlitten(100)calc的结果必须是大约91,17

 ((((-0,0000014369849267*Drehzahl^2 + 0,0401449351560780*Drehzahl - 32,5068828005099000) + ((8,95609756097562+(18,1/2050)*Drehzahl))*(1/25)*(45-Kondtemp))*((0,0000262088992942*Saugtemp^3 + 0,0050210402289170*Saugtemp^2 + 0,3711985619535020*Saugtemp + 9,9227907759641600)*((0,361075074412964)*(3550/Drehzahl)-0,361075074412964+1))*((((100-50)/(91,4-46,3))*((0,014285714285714*Schlitten^2 - 1,262285714285720*Schlitten + 74,214285714286400)-46,3)+50)-50))/50)+((0,0000063790283394*Drehzahl^2 - 0,0103039106823734*Drehzahl + 2,6771661029208000)*(-0,0002159827213823*Kondtemp^2 - 0,0034865782165998*Kondtemp + 1,5954952175254600))*(((0,000000003885345*Saugtemp^6 + 0,000000666998414*Saugtemp^5 + 0,000042907134551*Saugtemp^4 + 0,001268740583850*Saugtemp^3 + 0,020179866978636*Saugtemp^2 + 0,418860651690801*Saugtemp + 9,465861006018070)*((((7,68293017999336)/(-2050)*(Drehzahl-3550)+1)-1)/(45)*(Saugtemp+45)+1)))*(1/-50*((((100-50)/(91,4-46,3))*((0,014285714285714*Schlitten^2 - 1,262285714285720*Schlitten + 74,214285714286400)-46,3)+50)-100))` 

您可以添加非常简单的用户定义函数到您的工作簿:

 Function eval(str As String) Application.Volatile eval = Evaluate(Evaluate(Replace(str, ",", "."))) End Function 

并像这样在E1调用它: =eval(C1)

笔记:

1)当C1数据存储如不带= sign: 5 & "A1"文本时,我使用了双重Evaluate 。 如果你的数据是用= sign: =5 & "A1" ,你可以使用eval = Evaluate(str)或者eval = Evaluate(Evaluate(str)) – 它不会改变

2)自VBA需要. 作为分隔符,我使用了Replace函数

新的更新:

但是, Evaluate只能使用less于或等于255个字符的string操作。在这种情况下,您可以使用以下UDF:

 Public app As Excel.Application Public wb As Workbook Function getValue(formulaString As String) Application.Volatile Application.DisplayAlerts = False 'set default falue to #REF..if we'd get normal value - we'll change getValue to it' getValue = CVErr(xlErrRef) getValue = Evaluate(Evaluate(Replace(formulaString, ",", "."))) If Not IsError(getValue) Then Exit Function End If 'if we appear here - second WB is closed...' On Error GoTo ErrHandler If app Is Nothing Then Set app = New Excel.Application If wb Is Nothing Then Set wb = app.Workbooks.Open(ThisWorkbook.FullName) With wb.Sheets(ThisWorkbook.ActiveSheet.Name) With .Range(Application.ThisCell.Address) .FormulaLocal = IIf(Left(formulaString, 1) <> "=", "=" & formulaString, formulaString) .Calculate getValue = .Value End With End With ErrHandler: Application.DisplayAlerts = True End Function 

最后一件事:将以下代码添加到ThisWorkbook模块:

 Private Sub Workbook_BeforeClose(Cancel As Boolean) If Not wb Is Nothing Then wb.Close False If Not app Is Nothing Then app.Quit Set app = Nothing Set wb = Nothing End Sub 

我几乎有确切的问题,除了我没有命名单元格和less于255个字符。 去试试

 Function eval(str As String) Application.Volatile eval = Evaluate(Evaluate(Replace(str, ",", "."))) End Function