Excel 2003 Для вставки формул макросом делаю как все: сооружаю формулу, включаю запись макроса, вхожу в редактирование ячейки, ВВОД. Но при сложной формуле выдаётся предупреждение «Запись невозможна» и ничего не записывается. Приходится разбивать формулу на составные части, записывать их макрорекордером по отдельности и потом в VBA вручную их соединять. После этого сам макрос вставки формулы работает нормально.
Интересно, что в 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
Не забудьте только удвоить двойные кавычки, если они есть внутри формулы
{quote}{login=ZVI}{date=29.03.2010 06:41}{thema=}{post} 4. Ввести: ?ActiveCell.Formula{/post}{/quote} Интересно, а какие еще спец знаки есть кроме знака вопроса?
{quote}{login=The_Prist}{date=31.03.2010 09:45}{thema=}{post} можно выполнять отдельные строки кода для просмотра результата, не запуская саму процедуру.{/post}{/quote}Я так понял, что можно некоторые Properties посмотреть, а методы уже не пойдут. Так не?
Я еще со времен школьного 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 - выполняется Любая одна строчка?
{quote}{login=Лузер™}{date=01.04.2010 03:49}{thema=Re: }{post}Т.е. все работает? Проверил .ShowAllData и workbooks.Add - выполняется Любая одна строчка?{/post}{/quote}Да