Как объединить два макроса в один в excel

В данной статье я расскажу, как соединить несколько макросов в один, чтобы, например, назначить одной кнопке выполнение нескольких макросов.

Файлы для скачивания:

Файл Описание Размер файла: Скачивания
Скачать этот файл (P_Macros_05.zip)Пример   14 Кб 1846

Итак, суть проблемы заключается в следующем — мы записали какой ни будь макрос который, например, копирует данные из одного диапазона в другой, создали для этого макроса кнопку на рабочем листе и привязали к ней данный макрос. Потом нам понадобилось записать еще один макрос, который должен, например, скопированным данным присваивать некий формат и нам необходимо, чтобы эти макросы выполнялись один за другим при нажатии все той же кнопки.

При попытке назначить второй макрос той же кнопке мы обнаруживаем, что этого сделать нельзя, одна кнопка — один макрос. Что делать? Перед нами вырисовывается вариант, удалить первый и второй макрос и записать один длинный, который и копирует, и присваивает, но мы понимаем, что чем длине макрос, тем выше вероятность совершить ошибку при записи и начать все заново, так можно и до ночи провозиться.

Поэтому я предлагаю следующее решение: записать несколько коротких макросов, свести их в одном и уже этот большой макрос присвоить нашей Конопке.

Сделать это очень просто. Записываем два макроса, как это сделать в статье «Как записать макрос не зная языка VBA?». Суть работы макросов будет заключаться в следующем:

  • Макрос1 — будет копировать данные из диапазона E2:E6 и вставлять их в диапазон G2:G6, как значения с сохранением форматов.
  • Макрос2 — будет выделять данные в диапазоне G2:G6 красным цветом и делать их «жирными».

После того как мы запишем макросы — удалим столбец G полностью, чтобы не сохранилось форматирование ячеек.

Затем нажимаем сочетание клавиш Alt+F11, откроется окно редактора VBA, и мы увидим код двух наших макросов, записанный друг под другом:

Как соединить несколько макросов в один?

Встаем курсором после слов End Sub (второго макроса), и пишем следующий код:

Sub Макрос3()
    Call Макрос1
    Call Макрос2
End Sub

Должно получиться так:

kak-soedinit-neskolko-makrosov-v-odin_2.png

Если у вас записанные макросы оказались в разных модулях — это никак не влияет на их выполнение. Вставьте код «Макрос3» в любой из этих модулей или создайте 3-й модуль и вставьте код в него.

После чего закрываем редактор VBA, возвращаемся в нашу рабочую книгу, создаем кнопку на листе и назначаем ей «Макрос3″, как  это сделать описано в статье «Как сделать кнопку для запуска своего макроса?»

После чего нажимаем кнопку и видим, что макросы выполняются последовательно:

kak-soedinit-neskolko-makrosov-v-odin_3.png

Добавить комментарий

 

NCR

Пользователь

Сообщений: 3
Регистрация: 20.11.2015

#1

20.11.2015 20:21:43

Не подскажите, как объединить два макроса в один. Т.к. выполняются две одинаковые процедуры, вместе они не работают.
Если объединить их, убрав последнюю строку первого и первую строку второго, выполняется только первый.
Заранее спасибо.

Код
Private Sub Worksheet_Change(ByVal Target As Range)
     
    For Each cell In Target   'проходим по всем измененным ячейкам
       If Not Intersect(cell, Range("A2:A100")) Is Nothing Then  'если изменененная ячейка попадает в диапазон A2:A100
            With cell.Offset(0, 1)         'вводим в соседнюю справа ячейку дату
               .Value = Now
               .EntireColumn.AutoFit  'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
            End With
       End If
    Next cell
End Sub
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim NewCellValue$, OldComment$
Dim cell As Range
     
    'если ячейка не в отслеживаемом диапазоне, то выходим
    If Intersect(Target, Range("B3:B5")) Is Nothing Then Exit Sub
     
    'перебираем все ячейки в измененной области
    For Each cell In Intersect(Target, Range("B3:B5"))
        If IsEmpty(cell) Then
            NewCellValue = "Ячейка очищена" 'фиксируем очистку ячейки
        Else
            NewCellValue = cell.Formula     'или ее содержимое
        End If
        On Error Resume Next
         
        With cell
            OldComment = .Comment.Text & Chr(10)
            .Comment.Delete     'удаляем старое примечание (если было)
            .AddComment         'добавляем новое и вводим в него текст
            .Comment.Text Text:=OldComment & Application.UserName & " " & _
                            Format(Now, "MM.DD.YY h:MM:ss") & " : " & NewCellValue
            .Comment.Shape.TextFrame.AutoSize = True    'делаем автоподбор размера
            .Comment.Shape.TextFrame.Characters.Font.Size = 8
        End With
    Next cell
End Sub

Изменено: NCR21.11.2015 09:06:54

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#2

21.11.2015 09:41:07

Цитата
Юрий М написал: 2. Выполняйте проверки последовательно в пределах одной процедуры Worksheet_Change.

Попробуйте (самому проверить не на чем, нет Ваших данных)

Скрытый текст

Согласие есть продукт при полном непротивлении сторон.

 

HotShot

Пользователь

Сообщений: 25
Регистрация: 31.07.2014

ну как первая  «пристрелка» — две разных процедуры (Sub…End Sub) имеют общие входные параметры (как я понял «таргет»)
стал быть это «переменная» глобального типа (используется во всех модулях проекта… монстры если ошибаюсь поправьте)
соответсвенно … для того что бы объединить усё в один «классный код» (ничего личного и никакого стеба) нужно:
1. выявить все гобальные переменные;
2. проверить есть ли в создаваемом модуле подключение ко всем нужным библиотекам;
3. создать в своем модуле подключение ко всем нужным библиотекам, определить глобальные переменные уровня проекта  с соответствующими именами;
4. объединить код необходимых макросов ( с учетом повторов и циклов)
5. и т. д. и т.п.
Пы СЫ  … понимаю что звучит издевательски, но друг пойми … прошче написать своё чем переписывать чьё-то… если не получается пока то начни с простого … сам так начинал … токо вот балбесом и остался   ;)

 

Михаил С.

Пользователь

Сообщений: 10514
Регистрация: 21.12.2012

#4

21.11.2015 11:33:17

чуть подправил код Sanja, : (тоже на коленке)

Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(cell, Range("A2:A100")) Is Nothing Then  'если изменененная ячейка попадает в диапазон A2:A100
        For Each cell In Range("A2:A100").Cells   'проходим по всем измененным ячейкам
            With cell.Offset(0, 1)         'вводим в соседнюю справа ячейку дату
               .Value = Now
               .EntireColumn.AutoFit  'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
            End With
        Next cell
    'End If
     
   ElseIf Not Intersect(Target, Range("B3:B5")) Is Nothing Then
        For Each cell In Range("B3:B5").Cells
            If IsEmpty(cell) Then
                NewCellValue = "Ячейка очищена" 'фиксируем очистку ячейки
            Else
                NewCellValue = cell.Formula     'или ее содержимое
            End If
        On Error Resume Next
           
            With cell
                OldComment = .Comment.Text & Chr(10)
                .Comment.Delete     'удаляем старое примечание (если было)
                .AddComment         'добавляем новое и вводим в него текст
                .Comment.Text Text:=OldComment & Application.UserName & " " & _
                            Format(Now, "MM.DD.YY h:MM:ss") & " : " & NewCellValue
                .Comment.Shape.TextFrame.AutoSize = True    'делаем автоподбор размера
                .Comment.Shape.TextFrame.Characters.Font.Size = 8
            End With
        Next cell
    End If
End Sub

Изменено: Михаил С.21.11.2015 11:36:05

 

NCR

Пользователь

Сообщений: 3
Регистрация: 20.11.2015

#5

21.11.2015 11:38:48

[/QUOTE]
ругается на:

Код
ElseIf Not Intersect(Target, Range("B3:B5")) Is Nothing Then
 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#6

21.11.2015 11:48:23

Ничего не правил, тупо сунул 1 макрос во второй, все работает.  :D

Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim NewCellValue$, OldComment$
Dim cell As Range
    
    For Each cell In Target   'проходим по всем измененным ячейкам
       If Not Intersect(cell, Range("A2:A100")) Is Nothing Then  'если изменененная ячейка попадает в диапазон A2:A100
            With cell.Offset(0, 1)         'вводим в соседнюю справа ячейку дату
               .Value = Now
               .EntireColumn.AutoFit  'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
            End With
       End If
    Next cell
    'если ячейка не в отслеживаемом диапазоне, то выходим
    If Intersect(Target, Range("B3:B5")) Is Nothing Then Exit Sub
    
    'перебираем все ячейки в измененной области
    For Each cell In Intersect(Target, Range("B3:B5"))
        If IsEmpty(cell) Then
            NewCellValue = "Ячейка очищена" 'фиксируем очистку ячейки
        Else
            NewCellValue = cell.Formula     'или ее содержимое
        End If
        On Error Resume Next
        
        With cell
            OldComment = .Comment.Text & Chr(10)
            .Comment.Delete     'удаляем старое примечание (если было)
            .AddComment         'добавляем новое и вводим в него текст
            .Comment.Text Text:=OldComment & Application.UserName & " " & _
                            Format(Now, "MM.DD.YY h:MM:ss") & " : " & NewCellValue
            .Comment.Shape.TextFrame.AutoSize = True    'делаем автоподбор размера
            .Comment.Shape.TextFrame.Characters.Font.Size = 8
        End With
    Next cell
End Sub
 

а В3:В5 случайно не по-русски написано? (как в этом посте)

 

NCR

Пользователь

Сообщений: 3
Регистрация: 20.11.2015

#8

21.11.2015 12:10:22

Цитата
RAN написал: Ничего не правил, тупо сунул 1 макрос во второй, все работает.

Спасибо, теперь понял)  

 

Участник

Пользователь

Сообщений: 4
Регистрация: 14.07.2016

RAN, Здравствуйте. Мне ваш алгоритм придал силы. Объединил макросы свои, но вот после последней команды Next следующие строки кода не работают.  :)  Буду выяснять почему.
А вот надо это было для того, Чтобы не засорять названиями макросов Excel. В итоге сейчас получился один большой макрос, и один лист. А команд получилось несколько там. Удобно.

 

Юрий М

Модератор

Сообщений: 60585
Регистрация: 14.09.2012

Контакты см. в профиле

#10

21.07.2016 12:48:53

Цитата
HotShot написал:
стал быть это «переменная» глобального типа (используется во всех модулях проекта… монстры если ошибаюсь поправьте)

Не монстр, но скажу, что я не вижу глобальной переменной, которая бы действительно была видна во всём проекте. В данном случае Target только в пределах одной процедуры.
Про библиотеки вообще не понял )

 

Елена Мед.

Пользователь

Сообщений: 4
Регистрация: 17.12.2020

#11

17.12.2020 12:44:55

В конце можно прописать

Код
Sub Макрос3()
    Call Макрос1
    Call Макрос2
End Sub

Пример.

 

БМВ

Модератор

Сообщений: 21383
Регистрация: 28.12.2016

Excel 2013, 2016

#12

17.12.2020 12:54:00

Off

Цитата
Елена Мед. написал:
В конце можно прописать

Просто хочется поинтересоваться, а Мед. это от Медик или Мёд ? :D

По вопросам из тем форума, личку не читаю.

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

Медведи пролетают. Это медитация )

 

БМВ

Модератор

Сообщений: 21383
Регистрация: 28.12.2016

Excel 2013, 2016

#14

17.12.2020 13:40:22

Off

Цитата
vikttur написал:
Медведи пролетают.

ЧИОРТПОБЕРИ!

По вопросам из тем форума, личку не читаю.

Это продолжение статей «Урок 60. Макрос для таблицы», «Урок 61. Макрос преобразования страницы» и «Урок 90. Удаление всех закладок».

Написать хороший рабочий макрос – очень непростое дело. Чтобы он заработал в полную силу, надо тщательно продумать все свои действия. Но я нередко упускаю из вида какое-либо действие, которое необходимо. Что делать в этом случае? Заново начать писать макрос? А потом поочередно запускать сначала один, потом другой? Давайте смоделируем эту ситуацию.

По окончании этого урока вы сможете:

  1. Записать «Макрос1»
  2. Записать «Макрос2»
  3. Объединить работу этих макросов в один

Скачайте учебный фай тут и откройте его. В документе две таблицы (мне о таких документах приходится только мечтать).

1. Запись «Макрос1»

Давайте решим, что нам нужно от таблицы:

  1. Заголовок, повторяющийся на каждой странице и с выравниванием по середине.
  2. Шрифт в таблице – Calibri

Много делать не будем. Важен принцип.

Шаг 1. Выделяем первую строку первой таблицы

Шаг 2. Записываем макрос (лента Разработчик → группа команд Код → команда запись макроса):

макрос в Word

Шаг 3. Назначаем выполнение макроса сочетанию клавиш Ctrl+1:

макрос в Word

Шаг 4. Форматируем таблицу:

макрос в Word

  1. Команда «Повторить строки как заголовки»
  2. Команда «Выровнять по центру»
  3. Команда «Выделить» → команда «Выделить таблицу» из выпадающего меню

Заметили, что курсор принял соответствующий вид?

Шаг 5. Лента Главная → группа команд Шрифт → шрифт Calibri из выпадающего меню:

макрос в Word

Шаг 6. Останавливаем запись макроса

макрос в Word

И тут мы вспоминаем что забыли установить поля ячеек!

2. Запись «Макрос2»

Давайте усложним задачу: второй макрос запишем для второй таблицы.

Шаг 1. Выделяем вторую таблицу

Шаг 2. Записываем макрос (сочетание клавиш Ctrl+2)

Шаг 3. Устанавливаем новые поля ячеек таблицы (лента Макет → группа команд Выравнивание → команда Поля ячеек → диалоговое окно Параметры таблицы → значения по 0,05 для левого и правого полей ячеек):

макрос в Word

Шаг 4. Останавливаем запись макроса

3. Объединяем два макроса в один

Шаг 1. Открываем рабочее окно «Макрос» (лента Разработчик → группа команд Код → команда Макрос)

Шаг 2. В рабочем окне есть список из трех макросов. Назначаем команду «Изменить»:

макрос в Word

Шаг 3. Изучаем окно «Microsoft Visual Basic for Applications»:

visual basic

  1. delAllbookmarks «Удаление всех закладок»
  2. Макрос1
  3. Макрос2

Очень удобно: все макросы под одной крышей!

Шаг 4. Удаляем выражение:

End Sub
Sub Макрос2()

‘ Макрос2 Макрос

макрос в Word

То есть по сути дела мы удаляем конец Макрос1 и начало Макроса2 (вспомните, что в статье «Урок 90. Удаление всех закладок» я просила вас обратить внимание на имя и завершение макроса).

Шаг 5. Закрываем окно «Microsoft Visual Basic for Applications»

Шаг 6. Проверяем работу макроса на первой таблице (выделяем строчку заголовка → лента Разработчик → группа команд Код → команда Макрос → Макрос1 в поле Имя → команда Выполнить):

макрос в Word

Это очень важно! Если мы выделим всю таблицу и запустим макрос, то все строчки таблицы станут заголовками!
По ходу выполнения макроса таблица будет выделяться на определенном этапе

Обратите внимание, что «Макрос2» исчез из списка. Но работать «Макрос1» теперь от сочетания клавиш не будет, поэтому его выполнение приходится задавать из рабочего окна «Макрос».

Шаг 7. Проверяем работу макроса на второй таблице (выделяя строчку заголовка – в этой таблицы две строчки, так как имеются объединённые ячейки):

талица в Word

Шаг 8. Убеждаемся, что верхние строчки таблицы являются заголовками (просто «прошлёпываем» Enter):

талица в Word

По дороге замечаем, что размер шрифтов в таблице разный. Но теперь вы можете написать макросы, а затем объединить их в один. Если у вас много таблиц, то целесообразно вынести кнопку макроса на Панель быстрого доступа (статья «Урок 60. Макрос для таблицы»).

Теперь вы сможете:

  1. Записать «Макрос1»
  2. Записать «Макрос2»
  3. Объединить работу этих макросов в один макрос

Содержание

  1. Как в офисе.
  2. Как включить макросы в Excel
  3. Как вставить макрос в Excel
  4. Как запустить макросы в Excel
  5. Как объединить макросы excel
  6. Как объединить макросы excel
  7. Урок 91. Макрос объединенный
  8. 1. Запись «Макрос1»
  9. 2. Запись «Макрос2»
  10. 3. Объединяем два макроса в один

Как в офисе.

Макрос — это специальная программа, написанная на встроенном в Excel языке программирования Visual Basic for Application (VBA). Если вам часто приходится выполнять одни и те же операции в Эксель, то гораздо проще записать макрос или найти готовый код макроса, для выполнения определенных действий в Интернете.

Во втором случае, Вы найдете макрос в виде VBA-кода. В этом обычно и состоит вопрос: как добавить макрос в рабочий лист Excel, и как им пользоваться.

Как включить макросы в Excel

Чтобы Вы могли использовать макросы в работе, для начала их нужно включить. Кликаем по кнопочке «Файл» , в левом верхнем углу, и выбираем из списка «Параметры» .

В окне «Параметры Excel» перейдите на вкладку «Настройка ленты» , теперь в правой части окна поставьте галочку напротив пункта «Разработчик» и нажмите «ОК» .

Вверху на ленте появится новая вкладка «Разработчик» . На ней и будут находиться все необходимые команды для работы с макросами.

Теперь разрешим использование всех макросов. Снова открываем «Файл» — «Параметры» . Переходим на вкладку «Центр управления безопасностью» , и в правой части окна кликаем по кнопочке «Параметры центра управления безопасностью» .

Кликаем по вкладке «Параметры макросов» , выделяем маркером пункт «Включить все макросы» и жмем «ОК» . Теперь перезапустите Excel: закройте программу и запустите ее снова.

Как вставить макрос в Excel

Важно понимать, что макрос можно вставить в модуль, рабочий лист, рабочую книгу, или они могут являться частью пользовательской формы.

Вставим код макроса в модуль

Например, нужно объединить несколько ячеек в одну без потери данных. Как известно, Excel может объединять ячейки, сохраняя данные только из левой верхней ячейки. Чтобы сохранить все данные из объединяемых ячеек, будем использовать VBA-код.

Открываем редактор VBА: переходим на вкладку «Разработчик» и кликаем по кнопочке «Visual Basic» , также можно воспользоваться комбинацией «Alt+F11» .

С левой стороны редактора, в окне «Project» , выделяем мышкой рабочую книгу. Рабочая книга — это Ваш открытый документ Excel, в который нужно вставить макрос. У меня он называется «Книга1» .

Кликаем по выбранному пункту правой кнопкой мыши и выбираем из меню «Insert» — «Module» .

В окне «Project» появилась новая папка «Modules» , а в ней наш первый модуль с названием «Module1» .

Справа появится поле для ввода VBA-кода. С помощью комбинации «Ctrl+V» , вставляю в него код, который будет объединять несколько ячеек, без потери данных. Название макроса «MergeCell» .

Следите за тем, куда Вы вставляете код, это будет написано или в заголовке редактора, или в заголовке окна для вставки кода. Мы вставляем код в модуль, соответственно надпись — «Modul1(Code)» .

Сохраняем изменения, нажав комбинацию «Ctrl+S» . Если Вы используете Excel 2007 и выше, появится окно сохранения документа. В нем, в поле «Тип файла» , выберите из выпадающего списка «Книга Excel с поддержкой макросов» и нажмите «Сохранить» .

Вставим код макроса в рабочий лист

Например, у нас есть выпадающий список. Нужно сделать так, чтобы при выборе нескольких значений из него, они появлялись в ячейках справа.

Открываем редактор VBA и в окошке «Project» выделяем нужный лист, если их в рабочей книге несколько, на котором должен работать макрос: «Лист1 (Лист1)» . Кликаем по нему два раза мышкой.

Справа появиться окошко для ввода кода. Обратите внимание, мы вставляем код в рабочий лист, соответственно в заголовке написано «Лист1(Code)» . Сохраните изменения в документе, как было описано выше.

Чтобы вставить код макроса в рабочую книгу , кликните два раза мышкой по пункту «ЭтаКнига» и вставьте код в появившуюся область.

Создадим пользовательскую функцию

Например, создадим функцию, которая будет рассчитывать НДС. В окне «Project» кликаем по рабочему листу правой кнопкой мыши и выбираем «Insert» — «Module» .

В папке «Modules» , появляется второй модуль с названием «Module2» . Прописываем VBA-код в соответствующее окно, и сохраняем его, нажав «Ctrl+S» . Называться функция будет «NDS» .

Как запустить макросы в Excel

Теперь рассмотрим, как выполняются все созданные ранее макросы в документе Excel.

Если макрос был вставлен в модуль , то он запускается пользователем. У меня такой макрос объединяет несколько ячеек в одну без потери данных.

Выделяем ячейки, которые нужно объединить, затем переходим на вкладку «Разработчик» и кликаем по кнопочке «Макросы» .

Откроется диалоговое окно «Макрос» . В списке, выбираем нужное имя макроса: «MergeCell» , и жмем «Выполнить» .

Макрос выполнился: нужные ячейки объединены, и текст в них сохранен.

Если макрос был вставлен в рабочий лист , то запускаться он будет автоматически, в зависимости от действий пользователя. У меня макрос добавляет значения из выпадающего списка в ячейки справа. В код вставлен то диапазон ячеек, в котором находятся выпадающие списки.

Теперь, когда я выбираю из выпадающего списка значение, оно вписывается в ячейки, расположенные справа от той ячейки, в которой находится сам список. Это свидетельствует о выполнении макроса.

Если макрос вставлен в рабочую книгу , он также выполняется автоматически, когда пользователь производит определенные действия над книгой: закрывает ее, или сохраняет.

Если Вы создали пользовательскую функцию , то вставлять в документ ее также надо как функцию. У меня такая функция должна рассчитывать НДС.

Например, применим ее к ячейке А1 , со значением «100» . Выделяем ячейку, в которую будет вписан результат. Затем переходим на вкладку «Формулы» и нажимаем кнопочку «Вставить функцию» .

Откроется окно «Мастер функций» . В поле «Категория» выбираем из выпадающего списка «Определенные пользователем» , в поле «Выберите функцию» выбираем название из списка: «NDS» . Нажимаем «ОК» .

Затем выделяю ячейку, для которой нужно посчитать НДС, и нажимаю «ОК» .

Включить макросы в документе Excel 2010 совершенно не сложно. Надеюсь, Вы также разобрались, как вставить макрос в Excel, а затем выполнить его.

Поделитесь статьёй с друзьями:

Источник

Как объединить макросы excel

В данной статье я расскажу, как соединить несколько макросов в один, чтобы, например, назначить одной кнопке выполнение нескольких макросов.

Файлы для скачивания:

Файл Описание Размер файла: Скачивания
Пример 14 Кб 1825

Итак, суть проблемы заключается в следующем — мы записали какой ни будь макрос который, например, копирует данные из одного диапазона в другой, создали для этого макроса кнопку на рабочем листе и привязали к ней данный макрос. Потом нам понадобилось записать еще один макрос, который должен, например, скопированным данным присваивать некий формат и нам необходимо, чтобы эти макросы выполнялись один за другим при нажатии все той же кнопки.

При попытке назначить второй макрос той же кнопке мы обнаруживаем, что этого сделать нельзя, одна кнопка — один макрос. Что делать? Перед нами вырисовывается вариант, удалить первый и второй макрос и записать один длинный, который и копирует, и присваивает, но мы понимаем, что чем длине макрос, тем выше вероятность совершить ошибку при записи и начать все заново, так можно и до ночи провозиться.

Поэтому я предлагаю следующее решение: записать несколько коротких макросов, свести их в одном и уже этот большой макрос присвоить нашей Конопке.

Сделать это очень просто. Записываем два макроса, как это сделать в статье «Как записать макрос не зная языка VBA?». Суть работы макросов будет заключаться в следующем:

  • Макрос1 — будет копировать данные из диапазона E2:E6 и вставлять их в диапазон G2:G6, как значения с сохранением форматов.
  • Макрос2 — будет выделять данные в диапазоне G2:G6 красным цветом и делать их «жирными».

После того как мы запишем макросы — удалим столбец G полностью, чтобы не сохранилось форматирование ячеек.

Затем нажимаем сочетание клавиш Alt+F11 , откроется окно редактора VBA, и мы увидим код двух наших макросов, записанный друг под другом:

Встаем курсором после слов End Sub (второго макроса), и пишем следующий код:

Должно получиться так:

Если у вас записанные макросы оказались в разных модулях — это никак не влияет на их выполнение. Вставьте код «Макрос3» в любой из этих модулей или создайте 3-й модуль и вставьте код в него.

После чего закрываем редактор VBA, возвращаемся в нашу рабочую книгу, создаем кнопку на листе и назначаем ей «Макрос3″, как это сделать описано в статье «Как сделать кнопку для запуска своего макроса?»

После чего нажимаем кнопку и видим, что макросы выполняются последовательно:

Источник

Как объединить макросы excel

Добрый день, помогите объединить, два макроса

Добрый день, помогите объединить, два макроса

Сообщение Добрый день, помогите объединить, два макроса

Pelena Дата: Вторник, 23.12.2014, 07:45 | Сообщение № 2
«Черт возьми, Холмс! Но как. »
Ю-money 41001765434816

Ответить

elita86 Дата: Вторник, 23.12.2014, 08:13 | Сообщение № 3
elita86 Дата: Вторник, 23.12.2014, 08:40 | Сообщение № 4

Кажется решил проблему, в конце макросов, просто нужно было добавить ещё один, который как раз и выполняет последовательно все остальные

Кажется решил проблему, в конце макросов, просто нужно было добавить ещё один, который как раз и выполняет последовательно все остальные

Сообщение Кажется решил проблему, в конце макросов, просто нужно было добавить ещё один, который как раз и выполняет последовательно все остальные

Источник

Урок 91. Макрос объединенный

Написать хороший рабочий макрос – очень непростое дело. Чтобы он заработал в полную силу, надо тщательно продумать все свои действия. Но я нередко упускаю из вида какое-либо действие, которое необходимо. Что делать в этом случае? Заново начать писать макрос? А потом поочередно запускать сначала один, потом другой? Давайте смоделируем эту ситуацию.

По окончании этого урока вы сможете:

  1. Записать «Макрос1»
  2. Записать «Макрос2»
  3. Объединить работу этих макросов в один

Скачайте учебный фай тут и откройте его. В документе две таблицы (мне о таких документах приходится только мечтать).

1. Запись «Макрос1»

Давайте решим, что нам нужно от таблицы:

  1. Заголовок, повторяющийся на каждой странице и с выравниванием по середине.
  2. Шрифт в таблице – Calibri

Много делать не будем. Важен принцип.

Шаг 1. Выделяем первую строку первой таблицы

Шаг 2. Записываем макрос (лента Разработчик → группа команд Код → команда запись макроса):

Шаг 3. Назначаем выполнение макроса сочетанию клавиш Ctrl+1:

Шаг 4. Форматируем таблицу:

  1. Команда «Повторить строки как заголовки»
  2. Команда «Выровнять по центру»
  3. Команда «Выделить» → команда «Выделить таблицу» из выпадающего меню

Заметили, что курсор принял соответствующий вид?

Шаг 5. Лента Главная → группа команд Шрифт → шрифт Calibri из выпадающего меню:

Шаг 6. Останавливаем запись макроса

И тут мы вспоминаем что забыли установить поля ячеек!

2. Запись «Макрос2»

Давайте усложним задачу: второй макрос запишем для второй таблицы.

Шаг 1. Выделяем вторую таблицу

Шаг 2. Записываем макрос (сочетание клавиш Ctrl+2)

Шаг 3. Устанавливаем новые поля ячеек таблицы (лента Макет → группа команд Выравнивание → команда Поля ячеек → диалоговое окно Параметры таблицы → значения по 0,05 для левого и правого полей ячеек):

Шаг 4. Останавливаем запись макроса

3. Объединяем два макроса в один

Шаг 1. Открываем рабочее окно «Макрос» (лента Разработчик → группа команд Код → команда Макрос)

Шаг 2. В рабочем окне есть список из трех макросов. Назначаем команду «Изменить»:

Шаг 3. Изучаем окно «Microsoft Visual Basic for Applications»:

  1. delAllbookmarks «Удаление всех закладок»
  2. Макрос1
  3. Макрос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. Записать «Макрос1»
  2. Записать «Макрос2»
  3. Объединить работу этих макросов в один макрос

Источник

Adblock
detector

Здравствуйте!
Есть основная таблица, и на том же листе по ней сделана сводная таблица, которая делает выборку по определенной дате (в прикрепленном файле лист «Осн. таблица»). Вопрос: можно ли сделать так, чтобы в фильтре этой сводной таблицы при каждом открытии файла обновлялась дата, и отображалось не «All» и не то, что было выбрано в прошлый раз при работе с таблицей, а сегодняшняя дата?
Пробовала в фильтр вместо «All» вставить формулу «=СЕГОДНЯ()». Эксель не дает этого сделать, выбивает ошибку («Нельзя задавать формулу для имени поля или элемента в отчете сводной таблицы»).
Пробовала вставить макрос для того, чтобы привязать фильтр к обычной ячейке вне таблицы, где стоит формула СЕГОДНЯ. Но на этом листе уже есть макрос — на автоматическую вставку текущей даты в таблице при ручном заполнении соседней ячейки «Номер заказа». И при вставке второго макроса он перестает работать.
Хотела вставить макрос № 2:

[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim xPTable As PivotTable
    Dim xPFile As PivotField
    Dim xStr As String
    On Error Resume Next
    If Intersect(Target, Range(«N1»)) Is Nothing Then Exit Sub
    Application.ScreenUpdating = False
    Set xPTable = Worksheets(«Осн. таблица»).PivotTables(«Сводная таблица3»)
    Set xPFile = xPTable.PivotFields(«Дата»)
    xStr = Target.Text
    xPFile.ClearAllFilters
    xPFile.CurrentPage = xStr
    Application.ScreenUpdating = True
End Sub

[/vba]

На листе уже есть макрос № 1, который по отдельности работает, но вместе с макросом № 2 перестает работать:

[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)
Dim WorkRng As Range
Dim Rng As Range
Dim xOffsetColumn As Integer
Set WorkRng = Intersect(Application.ActiveSheet.Range(«C:C»), Target)
xOffsetColumn = -1
If Not WorkRng Is Nothing Then
    Application.EnableEvents = False
    For Each Rng In WorkRng
        If Not VBA.IsEmpty(Rng.Value) Then
            Rng.Offset(0, xOffsetColumn).Value = VBA.Date
            Rng.Offset(0, xOffsetColumn).NumberFormat = «DD.MM.YYYY»
        Else
            Rng.Offset(0, xOffsetColumn).ClearContents
        End If
    Next
    Application.EnableEvents = True
End If
End Sub

[/vba]

Как их объединить?
Или есть другой способ/макрос/инструмент Экселя, чтобы реализовать автоматическую вставку текущей даты в фильтр сводной таблицы?

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Как объединить два листа в excel в одну книгу
  • Как объединить два листа excel в один лист
  • Как объединить два значения в excel
  • Как объединить два документа word в один с сохранением форматирования
  • Как объединить два документа word в один онлайн

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии