2014-01-15 2 views
1

У меня есть формула, которая генерируется с помощью ряда конкатенированных строк. Это лучше всего объяснить на примере:Excel - преобразовать строку в формулу

открыть новую рабочую книгу Excel

A1 = 5 

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

Я хотел бы, чтобы содержать Е1 результат С1 оценивается как формулы, так что в основном в этом примере 10.

Я попытался использовать INDIRECT(C1), но это не сработало.

ОБНОВЛЕНИЕ: Он должен работать с пользовательскими именами ячеек. так что, если, например, я присвоить имя «mycell» А1, то поле С1 будет содержать «5 + mycell»

ОБНОВЛЕНИЕ 2: мой реальные данные:

лист 1, ячейка Y20 содержит следующее:

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

лист 2, J7 клеток содержит следующее:

= 'Sheet 1'!Y20 

лист 2, клеточный J8 содержит следующее:

= eval(J7) 

лист 2, ячейка С7 переименована в 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

Есть ли причина, почему вы храните '5 + A1' в С1 как текст? Откуда берется первый «5»? Возможно ли это в 'B' col? –

+0

да, это только пример .. в моем файле текст генерируется из разных источников, которые вводятся как текст. первые 5 - это просто случайное число. – sharkyenergy

ответ

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)) - это doesen't имеет значения

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 
+0

спасибо! тестирование и отчитается – sharkyenergy

+0

, он частично работает. работает нормально, пока я пишу «A1» в формуле, но перестает работать, если я использую назначенные имена. Обновление моего сообщения – sharkyenergy

+0

hm..it работает для меня .. Я дал 'test' имя для' A1' и написал в 'C1' folloring formula:' = 5 & "+ test" '. –

0

У меня есть почти точный вопрос, за исключением шахты не называются клетки и его менее 255 символов. собирается попробовать  

Function eval(str As String) 
    Application.Volatile 
    eval = Evaluate(Evaluate(Replace(str, ",", "."))) 
End Function 
Смежные вопросы