Страницы: 1
RSS
Функция Evaluate() и FormulaLocal
 
м.б. я уже окончательно туплю, но бьюсь долго...  
 
как можно использовать в макросе 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  
 
Sub Test4()  
Dim ws As Worksheet  
 
Set ws = ActiveSheet  
ws.Range("A1") = 1: ws.Range("A2") = 2  
MsgBox EvalLocal("=СУММ(A1:A2)"): MsgBox EvalLocal("=СУММ(A1:A2)", ws)  
 
Set ws = ThisWorkbook.Worksheets("Лист2")  
ws.Range("A1") = 1: ws.Range("A2") = 2  
MsgBox EvalLocal("=СУММ(A1:A2)"): MsgBox EvalLocal("=СУММ(A1:A2)", ws)  
 
End Sub    
 
 
так что, Казанский, не "лучше перед этим активировать А1 НА НУЖНОМ ЛИСТЕ", а "НУЖНО..." :)  
 
конечно, немного жаль, что без Select не обойтись. но иначе может получиться ерунда. а пользователю, чтобы он не пугался, я буду запоминать и восстанавливать активный лист и ячейку.  
 
вот так, совместными усилиями... :) всем спасибо.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
Страницы: 1
Наверх