как можно использовать в макросе Evaluate() для формул со ссылками на ячейки и "РУССКИМИ" функциями Excel?
вариант 1. найти аналог Evaluate(), удовлетворяющий такой каприз. вариант 2. простым способом преобразовать "локальную" формулу в "английскую" вариант 3. работать со строкой формулы. последовательно перебирая все пары "английских" "русских" функций.
если с вариантами 1 и 2 ничего не получится, то вариант 3 реализовать проблема небольшая. конечно. но ведь это будет долго :(
помогите кто чем может, плиз.
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
{quote}{login=ikki}{date=27.03.2011 12:58}{thema=Функция Evaluate() и FormulaLocal}{post}... вариант 3 реализовать проблема небольшая... {/post}{/quote} и совсем даже не факт. я предполагал использовать в цикле Replace() и заменять каждую "русскую" функцию на соответствующую "английскую"... но ведь такой же текст может попасться в строке... и тогда вместо "=НЕ(A1="НЕТ")" я получу "=NOT(A1="NOTТ")" :((
а писать универсальный парсер - вообще убиться можно :(
помощь становится всё более необходимой
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
2. Задать формулу ячейке через FormulaLocal, потом можно забрать значение или формулу. Можно задать формулу имени, например activeworkbook.Names.Add "имя1",referstolocal:="=СУММ(F4:F11)" , только надо учитывать, что формула транслируется относительно activecell. Т.е. лучше перед этим активировать А1 НА НУЖНОМ ЛИСТЕ. Потом [имя1] или Evaluate("имя1") или names("имя1").RefersTo
{quote}{login=Казанский}{date=27.03.2011 01:40}{thema=}{post}2. Задать формулу ячейке через FormulaLocal, потом можно забрать значение или формулу. Можно задать формулу имени, например activeworkbook.Names.Add "имя1",referstolocal:="=СУММ(F4:F11)" , только надо учитывать, что формула транслируется относительно activecell. Т.е. лучше перед этим активировать А1 НА НУЖНОМ ЛИСТЕ. Потом [имя1] или Evaluate("имя1") или names("имя1").RefersTo{/post}{/quote}
эх... так-то по ночам работать :( теперь это кажется очевидным. а я голову ломал. еще не проверил, но должно сработать. при аккуратном использовании. хотя в крайнем случае и напильник есть.
Казанский, СПАСИБО. вы меня спасли. тема закрыта.
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
' ZVI:2011-03-27 http://www.planetaexcel.ru/forum.php?thread_id=26023 Function EvalLocal(FormulaLocal As String, Optional Sh As Worksheet) If Sh Is Nothing Then Set Sh = ActiveSheet With Sh.Names.Add("My.Temporary.Name", RefersToLocal:=FormulaLocal) EvalLocal = Evaluate(.RefersTo) .Delete End With End Function
Sub Test() Range("A1") = 1 Range("A2") = 2 MsgBox EvalLocal("=СУММ(A1:A2)") End Sub
{quote}{login=ZVI}{date=27.03.2011 03:09}{thema=}{post}Можно так: ...{/post}{/quote} ZVI, спасибо. правда, для общего случая мне всё-таки пришлось добавить костыль (то, о чём говорил Казанский: "только надо учитывать, что формула транслируется относительно activecell")
' ZVI:2011-03-27 http://www.planetaexcel.ru/forum.php?thread_id=26023 Function EvalLocal(FormulaLocal As String, Optional Sh As Worksheet) If Sh Is Nothing Then Set Sh = ActiveSheet Else Sh.Activate Sh.[a1].Select With Sh.Names.Add("My.Temporary.Name", RefersToLocal:=FormulaLocal) EvalLocal = Evaluate(.RefersTo) .Delete End With End Function
так что, Казанский, не "лучше перед этим активировать А1 НА НУЖНОМ ЛИСТЕ", а "НУЖНО..." :)
конечно, немного жаль, что без Select не обойтись. но иначе может получиться ерунда. а пользователю, чтобы он не пугался, я буду запоминать и восстанавливать активный лист и ячейку.
вот так, совместными усилиями... :) всем спасибо.
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг