bandanas Пользователь Сообщений: 94 |
в книге 3 макроса(условно «мак1″,»мак2″,»мак3»)и несколько кнопок. |
Dophin Пользователь Сообщений: 2684 |
вставляйте кнопку ActiveX там это проще пареной репы |
{quote}{login=bandanas}{date=27.02.2010 05:46}{thema=запуск нескольких макросов при нажатии кнопки}{post}в книге 3 макроса(условно «мак1″,»мак2″,»мак3»)и несколько кнопок. |
|
YJYNGK Пользователь Сообщений: 247 |
{quote}{login=тол}{date=27.02.2010 06:25}{thema=Re: запуск нескольких макросов при нажатии кнопки}{post}{quote}{login=bandanas}{date=27.02.2010 05:46}{thema=запуск нескольких макросов при нажатии кнопки}{post}в книге 3 макроса(условно «мак1″,»мак2″,»мак3»)и несколько кнопок. Ребятки, а какж ебыть тогда, когда необходимо запустить два макроса ОДНОЙ кнопкой, причем макросы находятся на разных листах (Лист1 и Лист2) ??? И второе, а что означает «й» в начале строки в приведенном примере (й:мак1:мак2:мак3) ??? |
Юрий М Модератор Сообщений: 60577 Контакты см. в профиле |
Так будет более понятно: |
Юрий М Модератор Сообщений: 60577 Контакты см. в профиле |
Если на листах — укажите имя листа: Sheets(«Лист1»).Макрос1 и т.д. |
YJYNGK Пользователь Сообщений: 247 |
{quote}{login=Юрий М}{date=27.11.2010 08:41}{thema=}{post}Если на листах — укажите имя листа: Sheets(«Лист1»).Макрос1 и т.д.{/post}{/quote} Private Sub CommandButton1_Click() … выдает ошибку уже на первом макросе… |
Юрий М Модератор Сообщений: 60577 Контакты см. в профиле |
Не могут два макроса «обзываться» одинаково. |
YJYNGK Пользователь Сообщений: 247 |
{quote}{login=Юрий М}{date=27.11.2010 08:52}{thema=}{post}Не могут два макроса «обзываться» одинаково.{/post}{/quote} |
YJYNGK Пользователь Сообщений: 247 |
Private Sub CommandButton1_Click() Вот так работает только первый и задание выполняется, а как запустить второй не знаю .. |
Юрий М Модератор Сообщений: 60577 Контакты см. в профиле |
Ну так переименуйте макрос на втором листе в Макрос2 |
Юрий М Модератор Сообщений: 60577 Контакты см. в профиле |
Дим, я про родителей автору писал |
YJYNGK Пользователь Сообщений: 247 |
Спасибо The_Prist, спасибо Юрий, НО дошло до смешного. Я перепробовал сейчас все ваши советы, срабатывает почему-то только первый, на втором он останавливается … Private Sub CommandButton1_Click() и так: Private Sub CommandButton1_Click() и эдак: Private Sub CommandButton1_Click() Результат один — НЕТ … |
Юрий М Модератор Сообщений: 60577 Контакты см. в профиле |
И вот так не работает? На втором листе макрос должен иметь именно такое имя!!! |
YJYNGK Пользователь Сообщений: 247 |
{quote}{login=The_Prist}{date=27.11.2010 09:37}{thema=}{post}И что же у Вас в самих макросах написано не подскажете? Я так подозреваю что-то, что не дает выполнить до конца макрос, а завершает все процедуры. Что-то вроде команды End{/post}{/quote} Sub Макрос1() ‘ для копирования обновленного перечня учреждений из основной книги Private Sub CommandButton1_Click() … это модуль второго листа: Option Explicit Sub Макрос2() ‘ для копирования обновленного перечня учреждений из основной книги … я не большой знаток, только пока пытаюсь разобраться … |
YJYNGK Пользователь Сообщений: 247 |
{quote}{login=Юрий М}{date=27.11.2010 09:38}{thema=}{post}И вот так не работает? На втором листе макрос должен иметь именно такое имя!!! … то кнопка у меня вообще не реагирует. |
Юрий М Модератор Сообщений: 60577 Контакты см. в профиле |
Раз уж Вы хотите макросы в модулях листов (зачем?), то посмотрите рабочий вариант. |
Юрий М Модератор Сообщений: 60577 Контакты см. в профиле |
А лучше прислушайтесь к совет Prist — оба макроса в стандартный модуль. Тогда не придётся указывать явно лист. См. пример. |
YJYNGK Пользователь Сообщений: 247 |
{quote}{login=Юрий М}{date=27.11.2010 09:53}{thema=}{post}Раз уж Вы хотите макросы в модулях листов (зачем?), то посмотрите рабочий вариант.{/post}{/quote} … здесь речь идет об активном листе, а у меня активным является только первый, так как кнопка находится на первом листе … предполагаю, что появилось новое препятствие … (( |
Юрий М Модератор Сообщений: 60577 Контакты см. в профиле |
Вопрос был о том, как запустить два макроса последовательно. Чтобы не оглядываться на кнопку на активном листе, назначьте макрос любой автофигуре, рисунку… (правый клик на ней — назначить макрос). Этот макрос может выглядеть так: |
Спасибо Юрий и другим ребятам тоже выражаю благодарность за участие в разборе. С каждым часом у меня назревают все новые препятствия, благодаря Вам мне удается их преодолевать. СПАСИБО !!! (до встречи в следующей теме) |
|
YJYNGK Пользователь Сообщений: 247 |
#22 28.11.2010 11:43:17 {quote}{login=}{date=28.11.2010 11:41}{thema=Благодарность}{post}Спасибо Юрий и другим ребятам тоже выражаю благодарность за участие в разборе. С каждым часом у меня назревают все новые препятствия, благодаря Вам мне удается их преодолевать. СПАСИБО !!! (до встречи в следующей теме){/post}{/quote} Извините, разлогинился. Эти благодарности от меня! |
В данной статье я расскажу, как соединить несколько макросов в один, чтобы, например, назначить одной кнопке выполнение нескольких макросов.
Файл | Описание | Размер файла: | Скачивания |
---|---|---|---|
Пример | 14 Кб | 1845 |
Итак, суть проблемы заключается в следующем — мы записали какой ни будь макрос который, например, копирует данные из одного диапазона в другой, создали для этого макроса кнопку на рабочем листе и привязали к ней данный макрос. Потом нам понадобилось записать еще один макрос, который должен, например, скопированным данным присваивать некий формат и нам необходимо, чтобы эти макросы выполнялись один за другим при нажатии все той же кнопки.
При попытке назначить второй макрос той же кнопке мы обнаруживаем, что этого сделать нельзя, одна кнопка — один макрос. Что делать? Перед нами вырисовывается вариант, удалить первый и второй макрос и записать один длинный, который и копирует, и присваивает, но мы понимаем, что чем длине макрос, тем выше вероятность совершить ошибку при записи и начать все заново, так можно и до ночи провозиться.
Поэтому я предлагаю следующее решение: записать несколько коротких макросов, свести их в одном и уже этот большой макрос присвоить нашей Конопке.
Сделать это очень просто. Записываем два макроса, как это сделать в статье «Как записать макрос не зная языка VBA?». Суть работы макросов будет заключаться в следующем:
- Макрос1 — будет копировать данные из диапазона E2:E6 и вставлять их в диапазон G2:G6, как значения с сохранением форматов.
- Макрос2 — будет выделять данные в диапазоне G2:G6 красным цветом и делать их «жирными».
После того как мы запишем макросы — удалим столбец G полностью, чтобы не сохранилось форматирование ячеек.
Затем нажимаем сочетание клавиш Alt+F11, откроется окно редактора VBA, и мы увидим код двух наших макросов, записанный друг под другом:
Встаем курсором после слов End Sub (второго макроса), и пишем следующий код:
Sub Макрос3() Call Макрос1 Call Макрос2 End Sub
Должно получиться так:
Если у вас записанные макросы оказались в разных модулях — это никак не влияет на их выполнение. Вставьте код «Макрос3» в любой из этих модулей или создайте 3-й модуль и вставьте код в него.
После чего закрываем редактор VBA, возвращаемся в нашу рабочую книгу, создаем кнопку на листе и назначаем ей «Макрос3″, как это сделать описано в статье «Как сделать кнопку для запуска своего макроса?»
После чего нажимаем кнопку и видим, что макросы выполняются последовательно:
Добавить комментарий
0 / 0 / 0 Регистрация: 28.10.2012 Сообщений: 152 |
|
1 |
|
29.10.2012, 12:04. Показов 10324. Ответов 14
Может кто знает, как сделать так, чтобы для кнопки на листе в экселе были события click и dblclick?
0 |
Catstail Модератор 34707 / 19228 / 4039 Регистрация: 12.02.2012 Сообщений: 32,185 Записей в блоге: 13 |
||||
29.10.2012, 12:25 |
2 |
|||
Назначается-то без проблем:
вот только сделать даблклик физически не предоставляется возможным, если перехватывается простой клик… А зачем это нужно?
1 |
5561 / 1367 / 150 Регистрация: 08.02.2009 Сообщений: 4,107 Записей в блоге: 30 |
|
29.10.2012, 12:38 |
3 |
Можно, например, использовать _GotFocus и _DblClick или _MouseMove и просто _Click.
1 |
0 / 0 / 0 Регистрация: 28.10.2012 Сообщений: 152 |
|
29.10.2012, 13:40 [ТС] |
4 |
ну, к примеру у нас есть кнопка Добавлено через 50 секунд
0 |
Заблокирован |
||||
29.10.2012, 13:58 |
5 |
|||
Вариант для трех кнопок мыши разные действия —
2 |
Hugo121 6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
||||||||
29.10.2012, 14:15 |
6 |
|||||||
Сообщение было отмечено как решение РешениеВ стандартный модуль:
В модуль листа:
Кнопка Forms.CommandButton.1
3 |
Модератор 34707 / 19228 / 4039 Регистрация: 12.02.2012 Сообщений: 32,185 Записей в блоге: 13 |
|
29.10.2012, 18:12 |
7 |
Hugo121 — здорово, остроумно!
0 |
Заблокирован |
|
29.10.2012, 18:34 |
8 |
Правда, есть шанс попасть в бесконечный цикл, если щелкнуть кнопку за мгновение до полуночи
0 |
Hugo121 6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
||||
29.10.2012, 20:29 |
9 |
|||
Да, мне этот цикл тоже не нравится. Хотя он не бесконечный Добавлено через 1 час 16 минут
0 |
каролинка 0 / 0 / 0 Регистрация: 28.10.2012 Сообщений: 152 |
||||
30.10.2012, 11:11 [ТС] |
10 |
|||
В общем, вот что в итоге у меня получилось:
Но я скорее всего где-то что-то упускаю, потому что через раз запускается и для True выполняет прописанное в Else…(
0 |
0 / 0 / 0 Регистрация: 28.10.2012 Сообщений: 152 |
|
30.10.2012, 11:20 [ТС] |
11 |
Подставила в код, все работает как надо) единственное что пользователю придется задуматься, чтоб не прогадать кнопку) Добавлено через 1 минуту
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
30.10.2012, 12:10 |
12 |
каролинка, в CommandButton1_Click() в конце забыли вызвать macro.
1 |
0 / 0 / 0 Регистрация: 28.10.2012 Сообщений: 152 |
|
30.10.2012, 13:09 [ТС] |
13 |
точно, потеряла macro) Добавлено через 33 минуты
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
30.10.2012, 13:48 |
14 |
Уф, отлегло
1 |
0 / 0 / 0 Регистрация: 28.10.2012 Сообщений: 152 |
|||||
30.10.2012, 15:02 [ТС] |
15 |
||||
Я изменила время задержки и все ок стало
0 |
Может быть, в вашей книге есть несколько макросов, когда вы запускаете макросы, вам нужно щелкнуть и запустить их один за другим. Вы когда-нибудь думали запустить сразу несколько макросов с помощью кнопки в Excel?
Запуск / запуск нескольких макросов с помощью кнопки с кодом VBA
Запуск / запуск нескольких макросов с помощью кнопки с кодом VBA
Чтобы запустить несколько макросов с помощью кнопки, выполните следующие действия:
1. Сначала вставьте кнопку, нажав Застройщик > Вставить > Кнопка (элемент управления формой), см. снимок экрана:
2. Затем перетащите мышь, чтобы нарисовать кнопку на активном листе, а в появившемся Назначить макрос диалоговое окно, нажмите OK, и будет вставлена кнопка, как показано на следующем снимке экрана:
3. Затем удерживайте ALT + F11 , чтобы открыть Microsoft Visual Basic для приложений окно.
4. Нажмите Вставить > Модулии вставьте следующий код в Окно модуля.
Код VBA: запуск нескольких макросов с помощью кнопки:
Sub Button1_Click()
Call FillEmptyBlankCellWithValue 'Macro1
Call ReplaceHyperlinks 'Macro2
Call test 'Macro3
End Sub
5. Затем сохраните и закройте это окно кода, щелкните кнопку правой кнопкой мыши и выберите Назначить макрос из контекстного меню см. снимок экрана:
6. В выскочившем Назначить макрос диалоговое окно, выберите Button_Click, имя макроса, которое вы только что вставили, а затем щелкните OK для выхода из диалога. Смотрите скриншот:
7. С этого момента, когда вы нажимаете кнопку, макросы, которые вы указали, будут запускаться один за другим по мере необходимости.
Лучшие инструменты для работы в офисе
Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%
- Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
- Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон…
- Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны…
- Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
- Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
- Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии…
- Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
- Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF…
- Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.
Вкладка Office: интерфейс с вкладками в Office и упрощение работы
- Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
- Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
- Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!
Комментарии (5)
Оценок пока нет. Оцените первым!
Is it possible to assign two macros to one button?
asked Aug 21, 2011 at 10:48
0
You mean, like this?
Private Sub CommandButton1_Click()
Macro1
Macro2
End Sub
answered Aug 21, 2011 at 14:13
0
If you want both to run, write a wrapper function that calls them both and just call that.
I wouldn’t hard code the call to the second macro at the end of the first since it violates single responsibility plus you might need to use just the first macro in some situations.
answered Aug 21, 2011 at 12:03
GaijinhunterGaijinhunter
14.5k4 gold badges50 silver badges57 bronze badges
If you want both macros to run at the same time, that’s probably not possible. If you want to run one right after the other, simply call the second macro at the end of the first, or as Issun has pointed out, write a wrapper that calls both, and have the button call the wrapper.
answered Aug 21, 2011 at 11:34
jonscajonsca
10.2k26 gold badges56 silver badges62 bronze badges
Это продолжение статей «Урок 60. Макрос для таблицы», «Урок 61. Макрос преобразования страницы» и «Урок 90. Удаление всех закладок».
Написать хороший рабочий макрос – очень непростое дело. Чтобы он заработал в полную силу, надо тщательно продумать все свои действия. Но я нередко упускаю из вида какое-либо действие, которое необходимо. Что делать в этом случае? Заново начать писать макрос? А потом поочередно запускать сначала один, потом другой? Давайте смоделируем эту ситуацию.
По окончании этого урока вы сможете:
- Записать «Макрос1»
- Записать «Макрос2»
- Объединить работу этих макросов в один
Скачайте учебный фай тут и откройте его. В документе две таблицы (мне о таких документах приходится только мечтать).
1. Запись «Макрос1»
Давайте решим, что нам нужно от таблицы:
- Заголовок, повторяющийся на каждой странице и с выравниванием по середине.
- Шрифт в таблице – Calibri
Много делать не будем. Важен принцип.
Шаг 1. Выделяем первую строку первой таблицы
Шаг 2. Записываем макрос (лента Разработчик → группа команд Код → команда запись макроса):
Шаг 3. Назначаем выполнение макроса сочетанию клавиш Ctrl+1:
Шаг 4. Форматируем таблицу:
- Команда «Повторить строки как заголовки»
- Команда «Выровнять по центру»
- Команда «Выделить» → команда «Выделить таблицу» из выпадающего меню
Заметили, что курсор принял соответствующий вид?
Шаг 5. Лента Главная → группа команд Шрифт → шрифт Calibri из выпадающего меню:
Шаг 6. Останавливаем запись макроса
И тут мы вспоминаем что забыли установить поля ячеек!
2. Запись «Макрос2»
Давайте усложним задачу: второй макрос запишем для второй таблицы.
Шаг 1. Выделяем вторую таблицу
Шаг 2. Записываем макрос (сочетание клавиш Ctrl+2)
Шаг 3. Устанавливаем новые поля ячеек таблицы (лента Макет → группа команд Выравнивание → команда Поля ячеек → диалоговое окно Параметры таблицы → значения по 0,05 для левого и правого полей ячеек):
Шаг 4. Останавливаем запись макроса
3. Объединяем два макроса в один
Шаг 1. Открываем рабочее окно «Макрос» (лента Разработчик → группа команд Код → команда Макрос)
Шаг 2. В рабочем окне есть список из трех макросов. Назначаем команду «Изменить»:
Шаг 3. Изучаем окно «Microsoft Visual Basic for Applications»:
- delAllbookmarks «Удаление всех закладок»
- Макрос1
- Макрос2
Очень удобно: все макросы под одной крышей!
Шаг 4. Удаляем выражение:
End Sub
Sub Макрос2()
‘
‘ Макрос2 Макрос
‘
‘
То есть по сути дела мы удаляем конец Макрос1 и начало Макроса2 (вспомните, что в статье «Урок 90. Удаление всех закладок» я просила вас обратить внимание на имя и завершение макроса).
Шаг 5. Закрываем окно «Microsoft Visual Basic for Applications»
Шаг 6. Проверяем работу макроса на первой таблице (выделяем строчку заголовка → лента Разработчик → группа команд Код → команда Макрос → Макрос1 в поле Имя → команда Выполнить):
Это очень важно! | Если мы выделим всю таблицу и запустим макрос, то все строчки таблицы станут заголовками! По ходу выполнения макроса таблица будет выделяться на определенном этапе |
Обратите внимание, что «Макрос2» исчез из списка. Но работать «Макрос1» теперь от сочетания клавиш не будет, поэтому его выполнение приходится задавать из рабочего окна «Макрос».
Шаг 7. Проверяем работу макроса на второй таблице (выделяя строчку заголовка – в этой таблицы две строчки, так как имеются объединённые ячейки):
Шаг 8. Убеждаемся, что верхние строчки таблицы являются заголовками (просто «прошлёпываем» Enter):
По дороге замечаем, что размер шрифтов в таблице разный. Но теперь вы можете написать макросы, а затем объединить их в один. Если у вас много таблиц, то целесообразно вынести кнопку макроса на Панель быстрого доступа (статья «Урок 60. Макрос для таблицы»).
Теперь вы сможете:
- Записать «Макрос1»
- Записать «Макрос2»
- Объединить работу этих макросов в один макрос