Страницы: 1
RSS
Макрорекордер и сложная формула
 
Excel 2003  
Для вставки формул макросом делаю как все: сооружаю формулу, включаю запись макроса, вхожу в редактирование ячейки, ВВОД.  
Но при сложной формуле выдаётся предупреждение «Запись невозможна» и ничего не записывается.  
Приходится разбивать формулу на составные части, записывать их макрорекордером по отдельности и потом в VBA вручную их соединять. После этого сам макрос вставки формулы работает нормально.  
 
Вопрос: это предупреждение не обойти?  
Подобная тема обсуждалась http://www.planetaexcel.ru/forum.php?thread_id=9015 и, скорее всего, это ограничение самого Excel.  
 
Интересно, что в Excel 97 подобного предупреждения не выдаётся, но и макрорекордер записывает чушь и в кастрированном виде.  
В прилагаемом файле: не записываются формулы в столбце O (выделено жёлтым).  
Для примера: макросы 1 и 2 – записаны в Excel 97. А макрос FormulaInsertMacro уже вручную доделанный рабочий.
 
Не знаю, насколько это вам поможет, но в 2007 никаких ошибок нет:  
ActiveCell.FormulaR1C1 = _  
       "=IF(ISNA(MATCH(RC[-3],INDIRECT(ADDRESS(R3C10,COLUMN(RC[-2]))):INDIRECT(ADDRESS(R3C11,COLUMN(RC[-2]))),0)),MATCH(RC[-5],INDIRECT(ADDRESS(R3C10,COLUMN(RC[-4]))):INDIRECT(ADDRESS(R3C11,COLUMN(RC[-4]))),-1)+ROW(R5C10),MATCH(RC[-3],INDIRECT(ADDRESS(R3C10,COLUMN(RC[-2]))):INDIRECT(ADDRESS(R3C11,COLUMN(RC[-2]))),0)+ROW(R4C10))"
 
Ну там где всякие непонятно откуда взявщиеся символы - вопросительный знак, прямоугольничек, b  и т.п. - это в Макросе Макрос1 и Макрос2. А они и записаны глючно через Excel 97.  
Макрос с правильной (подкорректированной вручную в VBA) формулой называется FormulaInsertMacro.  
А сама нормальная формула выглядит так:  
=ЕСЛИ(ЕНД(ПОИСКПОЗ(L5;ДВССЫЛ(АДРЕС($J$3;СТОЛБЕЦ(M5))):ДВССЫЛ(АДРЕС($K$3;СТОЛБЕЦ(M5)));0));ПОИСКПОЗ(J5;ДВССЫЛ(АДРЕС($J$3;СТОЛБЕЦ(K5))):ДВССЫЛ(АДРЕС($K$3;СТОЛБЕЦ(K5)));-1)+СТРОКА($J$5);ПОИСКПОЗ(L5;ДВССЫЛ(АДРЕС($J$3;СТОЛБЕЦ(M5))):ДВССЫЛ(АДРЕС($K$3;СТОЛБЕЦ(M5)));0)+СТРОКА($J$4))  
 
Там с формулой всё верно.  
Я уже смирился с тем, что на самом деле есть такое ограничение Excel: макрорекордер не записывает сложные формулы. Тем более, что эту фичу можно обойти. Обойти хоть и муторно, но понятно как.  
 
Спасибо.
 
{quote}{login=tolikt}{date=26.03.2010 02:11}{thema=}{post}Там с формулой всё верно.{/post}{/quote}  
Давате попытаемся упростить формулу. Расскажите ее смысл (логику), чтобы не тратить время на разбор.
 
Длинные формулы, записанные в ячейку, можно перевести в VBA-вид таким образом:  
1. Стать на ячейку с формулой, т.е. сделать её активной  
2. Нажать Alt-F11 - откроется VBE  
3. Нажать Ctrl-G - попадем в окно Immediate  
4. Ввести: ?ActiveCell.Formula  
5. Нажать Enter - ниже появится VBA-вариант формулы.  
6. Скопировать результат (формулу) из окна Immediate в VBA-код, например в такой:  
 
Sub Test()  
 ActiveCell.Formula = "Формула_из_окна_Immediate"  
End Sub  
 
Не забудьте только удвоить двойные кавычки, если они есть внутри формулы
 
ZVI...  
да, так работает...  
интересно...  
не знал про такое...  
век живи - век учись...  
спасибо...
 
{quote}{login=ZVI}{date=29.03.2010 06:41}{thema=}{post}  
4. Ввести: ?ActiveCell.Formula{/post}{/quote} Интересно, а какие еще спец знаки есть кроме знака вопроса?
Bite my shiny metal ass!      
 
{quote}{login=The_Prist}{date=31.03.2010 09:45}{thema=}{post} можно выполнять отдельные строки кода для просмотра результата, не запуская саму процедуру.{/post}{/quote}Я так понял, что можно некоторые Properties посмотреть, а методы уже не пойдут. Так не?
Bite my shiny metal ass!      
 
Правильно...  
Уже воспользовался для вычисления функций.  
Они тоже результат возвращают :)
Bite my shiny metal ass!      
 
Я еще со времен школьного Quick Basic помню, что вопросительным знаком можно заменять команду Print :)  
часто им пользуюсь, чтобы узнать значение каких-нибудь переменных в ходе выполнения макроса в режиме Break (вместо того, чтобы добавлять переменную в Watch или задерживать курсор мышки на этой переменной в тексте кода.  
 
P.S.: не примите за попытку обидеть намеком на незнание "таких простых вещей"
 
Методы тоже работают в окне Immediate.  
Например, если ввести ?Range("B2:C3").Select и нажать Enter, то на активном листе будут выделены ячейки B2:C3, а в окне Immediate будет выведен результат True.    
То есть все аналогично такой процедуре:  
Sub Test()  
 Debug.Print Range("B2:C3").Select  
End Sub
 
Знак вопроса в окне Immediate всего лишь заменяет Debug.Print в коде.  
Для методов обычно Debug.Print не требуется, поэтому можно обойтись без знака вопроса. Так, например,ввод Range("B2:C3").Select в окне Immediate с последующим нажатием Enter просто выполнит данную строчку кода.  
Можно вернуться к этой строчке кода, исправить, например, B1 на A1 и, не утруждая себя переводом курсора в конец строки, нажать Enter. Код поменяется на Range("A1:C3").Select и будет выполнен.
 
{quote}{login=ZVI}{date=01.04.2010 12:35}{thema=}{post}Методы тоже работают в окне Immediate.{/post}{/quote}Т.е. все работает?  
Проверил .ShowAllData и workbooks.Add - выполняется  
Любая одна строчка?
Bite my shiny metal ass!      
 
{quote}{login=Лузер™}{date=01.04.2010 03:49}{thema=Re: }{post}Т.е. все работает?  
Проверил .ShowAllData и workbooks.Add - выполняется  
Любая одна строчка?{/post}{/quote}Да
 
Круть!  
Раньше ради одной строки приходилось Sub/End Sub лепить
Bite my shiny metal ass!      
Страницы: 1
Наверх