Страницы: 1
RSS
Как преобразовать формулу из ячейки листа для вставки её в код VBA
 
Может быть я и "открыл Америку", но всё-таки расскажу, а вдруг кому-нибудь понадобится…  
 
Разбираясь с методами программной работы с буфером обмена, случайно выяснил, что при программном копировании формулы из ячейки листа, в буфере обмена она оказывается записана в английской нотации, т.е. в виде, готовом для применения формулы листа в коде VBA.  
Т.е. пусть, к примеру, нам нужно в процедуре VBA выполнить какое-то вычисление, которое достаточно просто выполняется формулами листа. Но для того, чтобы процедура VBA поняла, что мы от неё хотим, необходимо вункцию листа вводить в код в английской нотации, что при сложных формулах вызывает затруднения.  
Есть простой метод перевода.  
1. В любом модуле книги пишем код:  
Sub GetFormula_For_VBA() ' скопировать в буфер обмена формулу из ActiveCell, готовую для вставки в код VBA  
  With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")  
      .SetText ActiveCell.Formula : .PutInClipboard  
  End With  
End Sub  
 
2. В любой ячейке листа книги пишем и отлаживаем свою формулу.  
К примеру, я написАл и отладил в ячейке M2 формулу:  
=ЕСЛИ($L2="";"";ВПР($L2;'Узлы СВЯЗИ'!$B:$P;10;0))  
 
3. Выделяем ячейку M2 и запускаем макрос GetFormula_For_VBA  
После его работы в буфере обмена окажется формула:  
=IF($L2="","",VLOOKUP($L2,'Узлы МВОС'!$B:$P,10,0))  
Т.е. произошёл автоматический перевод нотации формулы с РУС на ENG. А такую формулу уже не сложно встроить в код макроса.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Алекс, а так не тоже самое?  
MsgBox ActiveCell.Formula
 
Алексей, вариант неплохой, хотя (имхо) можно и проще - обращаясь попеременно к Formula и FormulaLocal :)  
 
Но... Вы ничего не попутали?..  
В Вашем примере имя листа "Узлы СВЯЗИ" заменяется на "Узлы МВОС"...
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Юрий, честно говоря, т.к. я недолюбливаю формулы листа, то по другому и не пробовал. Так просто случайно получилось. Да и к тому же формула уже сразу в буфере обмена оказывается, поэтому удобно в код вставлять без лишних телодвижений типа вывода формулы в окно Immediate и копирования оттуда.  
 
ikki, вы такой наблюдательный! Уж не из "органов" ли? Опять меня на чистую воду на опечатке вывели... Хотел утаить, где работаю, да не везде заменил названия...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=18.04.2011 02:26}{thema=}{post}  
ikki, вы такой наблюдательный! Уж не из "органов" ли?{/post}{/quote}Болтун - находка для шпионов:-) Леш, а простой путь тебе Юра показал. Добавлю:  
MsgBox ActiveCell.Formula  
MsgBox ActiveCell.Formulalocal
Я сам - дурнее всякого примера! ...
 
Опять моя невнимательность. ikki уже писал об этом.
Я сам - дурнее всякого примера! ...
 
Алекс, не все так просто. Для того чтобы VBA вставил формулу на лист, формула должна быть записана текстовой строкой, а учитывая, что часть символов является служебными для VBA и формул листа, то строка вырастает в довольно сложные конструкции. Вот к примеру:  
С виду простая формула:  
=СУММЕСЛИ(ДВССЫЛ("ИТОГО!AE10:AE65536");"янв";ДВССЫЛ("ИТОГО!L10:L65536"))  
В VBA это выглядит:  
.Cells(2, 2).FormulaLocal = "=СУММЕСЛИ(ДВССЫЛ(""ИТОГО!AE10:AE65536"");""" & Mounth(i) & """;ДВССЫЛ(""ИТОГО!L10:L65536""))"  
И это с жесткими ссылками, если ссылки заменить переменными то строка увеличивается в разы.  
   
Если бы автоматизировать этот процесс...
 
Спасибо за то, что теперь .PutInClipboard работает без DataObject и без ссылки на MSForms Object Library.  
Где это ты нарыл такой способ?
 
{quote}{login=Hugo}{date=18.04.2011 04:13}{thema=}{post}...  
Где это ты нарыл такой способ?{/post}{/quote}  
ну так эта... вроде бы общеизвестный метод неявного объявления объекта при позднем связывании…  
А про PutInClipboard мне только что Казанский в посте про кракозябры пример привёл.  
Ну, я и начал осваивать, как можно применять...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
А если ты про    
With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")  
то это всё он же показал. Честно попытался разобраться с этой цифирью - не смог. Самое интересное, что судя по поиску в Гугле фразы GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"), этим пользуются ТОЛЬКО китайцы. Ничего на хоть как-то читаемом языке не нашёл.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Леш, я бы вот это:  
With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")  
не использовал бы ни в коем случае. По крайней мере, пока кто-то авторитетно не докажет мне, что во всех версиях винды в реестре этот параметр(его название) одинаков.
Я сам - дурнее всякого примера! ...
 
Серёга, ну я-таки и на работе на ХРюше попробовал, и дома на Висте. Везде работает.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Я проверил - работает. XP версия 5.1 сборка 2600, русская.
 
Да, на работе XP английская - тоже работает.  
А поиском точно только сайты с иероглифами находит. Скоро среди них должна планета появиться :)
 
Чуть порыл гугль - нашёл и не по китайски:  
http://akihitoyamashiro.com/en/VBA/LateBindingDataObject.htm  
 
А вот реестр:  
 
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{1C3B4210-F441-11CE-B9EA-00AA006B1A69}]
@="Microsoft Forms 2.1 DataObject"
 
Я ссылку давал, откуда взял этот способ. Могу повторить: http://www.sql.ru/forum/actualthread.aspx?tid=501769&pg=1  
Проверял на Win2k SP4 и WinXP SP3.
 
Игорь, развеселил. akihitoyamashiro не по китайски, по японски:-) Леш,  не вопрос, работает - не ремонтируй. Это у меня старперские заморочки:-) Паранойя.
Я сам - дурнее всякого примера! ...
 
:)  
Но там по-японски ничего, кроме адреса нет.  
Было ещё парочка английских, но там как всегда - ничего полезного... кроме рекламы :)
 
Серёга, ты же знаешь уже, что я сам не люблю использовать то, что не понимаю как работает...    
Но если всё-таки работает, а вся документация только на японском, то временно можно поюзать и так если уж очень будет нужно.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Да я как раз понимаю, как работает. Сомнения были в совместимости версий. Но раз вы(очень авторитетные для меня люди - оба Леши и Игорь) проверив на нескольких версиях Выньды не нашли глюков, багов, просто игнорируйте мой параноидальный пост.  
И раз уж так - спасибо Леше(Казанский) за подсказанную фишку.
Я сам - дурнее всякого примера! ...
Страницы: 1
Читают тему
Наверх