Здравствуйте! Столкнулся со следующей проблемой: вот код после которой, выходит ошибка: run time error '1004': Method 'Run' of object'_application' failed
[vba]
Код
Private Sub CommandButton1_Click() Application.Run "Лист2.CommandButton1_Click" End Sub
[/vba]
С чем это связано и как решить проблему? [moder]Для оформления кода используйте кнопку с #[/moder]
Здравствуйте! Столкнулся со следующей проблемой: вот код после которой, выходит ошибка: run time error '1004': Method 'Run' of object'_application' failed
[vba]
Код
Private Sub CommandButton1_Click() Application.Run "Лист2.CommandButton1_Click" End Sub
[/vba]
С чем это связано и как решить проблему? [moder]Для оформления кода используйте кнопку с #[/moder]udarock
udarock, вообще-то, "хорошая практика" - в интерфейсных модулях (а обработчики событий в модулях листа и книги - это интерфейс) использовать вызовы только локальных (для данного модуля) переменных, процедур и т.п. И обработки, связанные только с данным объектом, к которому и относится модуль. Весь же "общий" функционал должен располагаться в модулях проекта. Вот что вы подразумевали, вызывая "нажание" кнопки с другого листа (которая, в свою очередь у вас очищает диапазон именно на том листе, где расположена)? Что у вас "вызывающая" кнопка очистит диапазон уже на своём листе? Что очистится диапазон на том листе, где расположена "вызываемая" кнопка? И откуда вы взяли, что для вызова процедуры внутри одного проекта необходимо задействовать метод .Run всего приложения? Ну а также - вам ничего не говорит слово "Private" в декларации процедур? "Правильно" было (если вам все же надо очищать диапазон именно на текущем листе) описАть процедуру, очищающую нужный диапазон активного (или переданного в параметрах) листа. Поместить эту процедуру в общий модуль. А в обработчиках событий кнопок - вызывать эту процедуру. Ещё "правильнее" - не множить кнопки с одинаковым функционалом на каждом листе, а вынести кнопку с такой функцией куда-нибудь в общий интерфейс (в меню, на панель), или сделать собственное меню, или вообще создать собственный класс с такой кнопкой и её функционалом - а в интерфейс вставлять уже объекты этого класса... так, это меня уже заносит :) Ещё правильнее - начать с чтения книг по VBA, изучения примеров и т.д. - а не ломиться с собственными "изобретениями" в области построения приложения.
Не, там всё немного сложнее...
udarock, вообще-то, "хорошая практика" - в интерфейсных модулях (а обработчики событий в модулях листа и книги - это интерфейс) использовать вызовы только локальных (для данного модуля) переменных, процедур и т.п. И обработки, связанные только с данным объектом, к которому и относится модуль. Весь же "общий" функционал должен располагаться в модулях проекта. Вот что вы подразумевали, вызывая "нажание" кнопки с другого листа (которая, в свою очередь у вас очищает диапазон именно на том листе, где расположена)? Что у вас "вызывающая" кнопка очистит диапазон уже на своём листе? Что очистится диапазон на том листе, где расположена "вызываемая" кнопка? И откуда вы взяли, что для вызова процедуры внутри одного проекта необходимо задействовать метод .Run всего приложения? Ну а также - вам ничего не говорит слово "Private" в декларации процедур? "Правильно" было (если вам все же надо очищать диапазон именно на текущем листе) описАть процедуру, очищающую нужный диапазон активного (или переданного в параметрах) листа. Поместить эту процедуру в общий модуль. А в обработчиках событий кнопок - вызывать эту процедуру. Ещё "правильнее" - не множить кнопки с одинаковым функционалом на каждом листе, а вынести кнопку с такой функцией куда-нибудь в общий интерфейс (в меню, на панель), или сделать собственное меню, или вообще создать собственный класс с такой кнопкой и её функционалом - а в интерфейс вставлять уже объекты этого класса... так, это меня уже заносит :) Ещё правильнее - начать с чтения книг по VBA, изучения примеров и т.д. - а не ломиться с собственными "изобретениями" в области построения приложения.AndreTM
я в vba не очень силен. Дело в том что мне нужно очистить 10 листов с одного листа, пробывал разные варианты не один не получился. всё время какая- нибудь ошибка выходит. Причем в другом проекте всё работает нормально. Спасибо:) После удаления всё работает.
я в vba не очень силен. Дело в том что мне нужно очистить 10 листов с одного листа, пробывал разные варианты не один не получился. всё время какая- нибудь ошибка выходит. Причем в другом проекте всё работает нормально. Спасибо:) После удаления всё работает.udarock
Sub cleaner() Dim i& On Error Resume Next ' на случай обьединенных ячеек. For i = 1 To ThisWorkbook.Sheets.Count Sheets(i).[A1:D3].ClearContents Next End Sub
[/vba] Очистит диапазон A1:D3 на всех листах.
[vba]
Код
Sub cleaner() Dim i& On Error Resume Next ' на случай обьединенных ячеек. For i = 1 To ThisWorkbook.Sheets.Count Sheets(i).[A1:D3].ClearContents Next End Sub
[/vba] Очистит диапазон A1:D3 на всех листах.SkyPro
skypro1111@gmail.com
Сообщение отредактировал SkyPro - Среда, 08.01.2014, 14:44
а можно я пять копеек... речь про модуль книги. а ещё можно вот то что вот там сверху сделать функцией (как что то говорил AndreTM, ) и сделать для одного листа(убрать циклы) и вызвать где надо. вдруг чистить потребуется не все листы !?
а можно я пять копеек... речь про модуль книги. а ещё можно вот то что вот там сверху сделать функцией (как что то говорил AndreTM, ) и сделать для одного листа(убрать циклы) и вызвать где надо. вдруг чистить потребуется не все листы !?Матраскин
Здравствуйте! Я тоже пока не могу найти решение почему при очистке страниц на одной из них выдает ошибку: run time error '1004': Method 'Run' of object'_application' failed
[vba]
Код
Public Function Очистка_страницы(Лист) 'On Error Resume Next ActiveWorkbook.Sheets(Лист).UsedRange.Offset(1).ClearContents End Function
[/vba]
Здравствуйте! Я тоже пока не могу найти решение почему при очистке страниц на одной из них выдает ошибку: run time error '1004': Method 'Run' of object'_application' failed
[vba]
Код
Public Function Очистка_страницы(Лист) 'On Error Resume Next ActiveWorkbook.Sheets(Лист).UsedRange.Offset(1).ClearContents End Function
У меня в книге Excel есть 3 страницы. На каждой из них по 45542 записей. При запуске макроса первый и третий листы очищает, а на третьем выдает ошикбу.
Поможите разобраться, спасибо. Зачем прикалываться не понимаю.
Попробовал очистить буфер данных - не помогло
У меня в книге Excel есть 3 страницы. На каждой из них по 45542 записей. При запуске макроса первый и третий листы очищает, а на третьем выдает ошикбу.
Поможите разобраться, спасибо. Зачем прикалываться не понимаю.
Попробовал очистить буфер данных - не помоглоA_3485
Сообщение отредактировал A_3485 - Четверг, 08.05.2014, 15:19
Думаю, что там все просто. на втором листе UsedRange на все строки смотрит, а не только на те, где данные. Встаньте в А1 и нажмите Контрл+Енд. Какая ячейка выделится?. Зачем Вам в коде Offset(1)? Убейте его. А приложить файл 3 листа по 45000 записей полюбому не получится.
Думаю, что там все просто. на втором листе UsedRange на все строки смотрит, а не только на те, где данные. Встаньте в А1 и нажмите Контрл+Енд. Какая ячейка выделится?. Зачем Вам в коде Offset(1)? Убейте его. А приложить файл 3 листа по 45000 записей полюбому не получится._Boroda_
Ну, чтобы шапку не сносило можно и ресайзнуть: [vba]
Код
Public Function Очистка_страницы(Лист) 'On Error Resume Next With ActiveWorkbook.Sheets(Лист).UsedRange .Offset(1).Resize(.Rows.Count - 1).ClearContents End With End Function
[/vba]
Ну, чтобы шапку не сносило можно и ресайзнуть: [vba]
Код
Public Function Очистка_страницы(Лист) 'On Error Resume Next With ActiveWorkbook.Sheets(Лист).UsedRange .Offset(1).Resize(.Rows.Count - 1).ClearContents End With End Function
А вообще-то лучше уж число строк в шапке задавать опционально:[vba]
Код
Public Function Очистка_страницы2(Лист$, Optional Строк_в_шапке% = 1) 'On Error Resume Next With ActiveWorkbook.Sheets(Лист) .UsedRange.Offset(1).Resize(.Rows.Count - Строк_в_шапке).ClearContents End With End Function
[/vba] Правда, не понял, зачем Function, а не Sub, но это уж прихоть ТС
А вообще-то лучше уж число строк в шапке задавать опционально:[vba]
Код
Public Function Очистка_страницы2(Лист$, Optional Строк_в_шапке% = 1) 'On Error Resume Next With ActiveWorkbook.Sheets(Лист) .UsedRange.Offset(1).Resize(.Rows.Count - Строк_в_шапке).ClearContents End With End Function
[/vba] Правда, не понял, зачем Function, а не Sub, но это уж прихоть ТСAlex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Четверг, 08.05.2014, 23:01
Не нравится мне использование ActiveWorkbook... Я бы вероятно передавал в параметре ссылку на объект - и тогда [vba]
Код
Public Function Очистка_страницы(Лист) 'On Error Resume Next With Лист.UsedRange .Offset(1).Resize(.Rows.Count - 1).ClearContents End With End Function
[/vba]
Не нравится мне использование ActiveWorkbook... Я бы вероятно передавал в параметре ссылку на объект - и тогда [vba]
Код
Public Function Очистка_страницы(Лист) 'On Error Resume Next With Лист.UsedRange .Offset(1).Resize(.Rows.Count - 1).ClearContents End With End Function
Игорь, а чем тебе так уж ActiveWorkbook не нравится? Я в макросах, хранящихся в в Personal.xls или в надстройках, часто такое обращение использую.
Игорь, а чем тебе так уж ActiveWorkbook не нравится? Я в макросах, хранящихся в в Personal.xls или в надстройках, часто такое обращение использую.Alex_ST
Ну например открыты две книги и персонал с этим макросом. И выполняется код, которым задумано обработать конкретный лист - так зачем в этой функции оганичивать применение только в активной книге, тем самым заставлять себя думать о том, активна ли она в момент вызова функции? А может её сперва нужно специально активировать? Проще прописать обрабатывать конкретный лист - а когда указываем лист, то можно указать из активной книги, а можно указать и любой другой, не думая кто там активен, кто пассивен
Ну например открыты две книги и персонал с этим макросом. И выполняется код, которым задумано обработать конкретный лист - так зачем в этой функции оганичивать применение только в активной книге, тем самым заставлять себя думать о том, активна ли она в момент вызова функции? А может её сперва нужно специально активировать? Проще прописать обрабатывать конкретный лист - а когда указываем лист, то можно указать из активной книги, а можно указать и любой другой, не думая кто там активен, кто пассивен Hugo