Excel - преобразование строки в формулу

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

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

 A1 = 5

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

Я хотел бы, чтобы E1 содержал результат C1, вычисленный как формулу, поэтому в основном в этом примере 10.

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

ОБНОВЛЕНИЕ: он должен работать с пользовательскими именами ячеек. поэтому, если, например, я присвою A1 имя «mycell», тогда поле 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))`

person sharkyenergy    schedule 15.01.2014    source источник
comment
Есть ли причина, по которой вы храните 5+A1 в C1 как ТЕКСТ? Откуда первый 5? Это случайно не в B столбце?   -  person    schedule 15.01.2014
comment
да, это только пример .. в моем файле текст генерируется из различных источников, которые вводятся как текст. первые 5 - это просто случайное число ..   -  person sharkyenergy    schedule 15.01.2014


Ответы (2)


Вы можете добавить в свою книгу очень простую пользовательскую функцию:

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

НОВОЕ ОБНОВЛЕНИЕ:

Но 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
person Dmitry Pavliv    schedule 15.01.2014
comment
он частично работает .. работает нормально, пока я пишу в формуле A1, но перестает работать, если я использую назначенные имена ячеек. Обновление моего сообщения - person sharkyenergy; 15.01.2014
comment
хм .. это работает для меня .. Я дал test имя для A1 и написал C1 следующую формулу: =5 & "+test". - person Dmitry Pavliv; 15.01.2014
comment
Я понимаю! Вы должны написать = перед текстом - person Dmitry Pavliv; 15.01.2014
comment
Кажется, это не работает, потому что в моей реальной таблице Excel я беру поле A1 с другого листа. так что вместо A1 у меня есть "sheet2"! A1 .. может это быть причиной? обновление основного поста моими реальными данными. - person sharkyenergy; 15.01.2014
comment
как я могу решить, в чем проблема, если определенная формула не работает? например, как вы узнали о доменах. в моей формуле? Благодарность! - person sharkyenergy; 15.01.2014
comment
@sharkyenergy, это опыт :) У меня раньше было много проблем с локальными настройками) У вас проблемы с формулой? - person Dmitry Pavliv; 15.01.2014
comment
да, у меня очень длинная формула, которая не работает. но сама формула верна, так как она рассчитывается правильно, если я поставлю перед ней = и позволю Excel вычислить ее .. формула должна быть долго, чтобы поделиться здесь, поэтому я должен опубликовать ее в основном вопросе - person sharkyenergy; 15.01.2014
comment
Evaluate может получить строку длиной меньше или равной 255 .. msdn.microsoft.com/en-us/library/office/ - person Dmitry Pavliv; 15.01.2014
comment
он продолжает открывать сотни экземпляров Excel, пока компьютер не выйдет из строя! есть идеи почему? - person sharkyenergy; 15.01.2014
comment
позвольте нам продолжить это обсуждение в чате - person sharkyenergy; 15.01.2014

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

Function eval(str As String)
    Application.Volatile
    eval = Evaluate(Evaluate(Replace(str, ",", ".")))
End Function
person Chrisa Changala    schedule 19.11.2014