我有一个通过一系列连接字符串生成的公式。用一个例子可以更好地解释这一点:
打开一个新的Excel工作簿
A1 = 5
C1 = 5 & "+A1" [A1 is seen as text. C1 will contain "5+A1" ]
我希望E1包含作为公式计算的C1的结果,所以基本上在这个例子中10。
我尝试使用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”(值= 3550)Kondtemp(45)Saugtemp(-45)Schlitten(100)计算结果必须约为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))`
答案 0 :(得分:3)
您可以向工作簿添加非常简单的用户定义函数:
Function eval(str As String)
Application.Volatile
eval = Evaluate(Evaluate(Replace(str, ",", ".")))
End Function
并在E1
中调用它:=eval(C1)
备注:强>
1)如果Evaluate
中的数据存储为没有C1
符号的文字=
,我就使用了双5 & "A1"
。如果您的数据与=
符号=5 & "A1"
一起存储,您可以使用eval = Evaluate(str)
或离开eval = Evaluate(Evaluate(str))
- 它不会遇到问题
2)由于VBA需要.
作为分隔符,我使用了Replace
函数
NEW UPDATE:
但是,Evaluate
只能使用小于或等于255个字符的字符串。
在这种情况下,您可以使用以下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
答案 1 :(得分:0)
我几乎有确切的问题,除了我的名字不是单元格,而且它的字符少于255个。试试
Function eval(str As String)
Application.Volatile
eval = Evaluate(Evaluate(Replace(str, ",", ".")))
End Function