Excel два макроса в одном

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

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

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

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

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

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

Сделать это очень просто. Записываем два макроса, как это сделать в статье «Как записать макрос не зная языка 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

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

 

Saeglopur

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

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

Здравствуйте!  

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

  Private Sub Worksheet_Change(ByVal Target As Range)  
   If Target.Cells.Count > 1 Then Exit Sub  
   If Intersect(Target, Range(«B2:B2000»)) Is Nothing Then Exit Sub  
   On Error GoTo Exit_  
   With Sheets(«Table_MSSQL»)  
       If .Cells(Target.Row, «E») <> «» Then  
           Application.EnableEvents = False  
           .Cells(Target.Row, «C»).Value = Now  
           .Cells(Target.Row, «C»).EntireColumn.AutoFit  
       Else  
           .Cells(Target.Row, «C»).Value = Empty  
       End If  
   End With  
Exit_:  
   Application.EnableEvents = True  
 End If  
End Sub  
Private Sub Worksheet_Change(ByVal Target As Range)  
If Target.Address = [Ãîðîä].Address Then
   [Ðàéîí] = «»
  End If  
End Sub  

  Что не так?

 

2 макроса с одним именем недопустимы.  

  Надо совместить 2 макроса:  

  Private Sub Worksheet_Change(ByVal Target As Range)  
   If Target.Address = [Район].Address Then [Район] = «»: Exit Sub

     If Target.Cells.Count > 1 Then Exit Sub  
   If Intersect(Target, Range(«B2:B2000»)) Is Nothing Then Exit Sub  
   On Error GoTo Exit_  
   With Sheets(«Table_MSSQL»)  
       If .Cells(Target.Row, «E») <> «» Then  
           Application.EnableEvents = False  
           .Cells(Target.Row, «C»).Value = Now  
           .Cells(Target.Row, «C»).EntireColumn.AutoFit  
       Else  
           .Cells(Target.Row, «C»).Value = Empty  
       End If  
   End With  
Exit_:  
   Application.EnableEvents = True  
End Sub

 

Saeglopur

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

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

Огромное спасибо, добрый человек)

 

Saeglopur

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

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

{quote}{login=EducatedFool}{date=11.01.2012 11:29}{thema=}{post}  
Надо совместить 2 макроса:  
{/post}{/quote}  

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

  Private Sub Worksheet_Change(ByVal Target As Range)  
   If Target.Address = [Ãîðîä].Address Then [Ðàéîí] = «»: Exit Sub

         If Target.Cells.Count > 1 Then Exit Sub  
   If Not Intersect(Target, Range(«B2»)) Is Nothing Then  
       If Target = «» Then  
           With Target.Offset(0, 1).Validation  
               .Delete  
           End With  
           Target.Offset(0, 1).ClearContents  
       Else  
           With Target.Offset(0, 1).Validation  
               .Delete  
               .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _  
               xlBetween, Formula1:=»=$AS$2:$AS$11″  
               .IgnoreBlank = True  
               .InCellDropdown = True  
               .InputTitle = «»  
               .ErrorTitle = «»  
               .InputMessage = «»  
               .ErrorMessage = «»  
               .ShowInput = True  
               .ShowError = True  
           End With  
       End If  
   End If  
Exit Sub  

         If Target.Cells.Count > 1 Then Exit Sub  
      If Intersect(Target, Range(«B2:B2000»)) Is Nothing Then Exit Sub  
         On Error GoTo Exit_  
            With Sheets(«Table_MSSQL»)  
               If .Cells(Target.Row, «E») <> «» Then  
               Application.EnableEvents = False  
               .Cells(Target.Row, «C»).Value = Now  
               .Cells(Target.Row, «C»).EntireColumn.AutoFit  
      Else  
      .Cells(Target.Row, «C»).Value = Empty  
      End If  
  End With  
Exit_:  
Application.EnableEvents = True  
End Sub

 

k61

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

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

Макрос один (как три тополя на Плющихе).  
По существу:  
1. В конце второго блока exit sub убрать;  
2. Убрать в начале последнего блока If Target.Cells.Count > 1 Then Exit Sub т.к. эта проверка уже была в начале второго блока.

 

Saeglopur

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

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

 

Saeglopur

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

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

А почему в таком виде не работает все, что ниже If Target.Address = [Тип сделки].Address Then [Количество.комнат] = «»: Exit Sub?

  Private Sub Worksheet_Change(ByVal Target As Range)  
   If Target.Address = [Город].Address Then [Район] = «»: Exit Sub
   If Target.Address = [Тип сделки].Address Then [Количество.комнат] = «»: Exit Sub
   If Target.Address = [Тип.сделки].Address Then [Регион] = «»: Exit Sub

         If Target.Cells.Count > 1 Then Exit Sub  
       If Not Intersect(Target, Range(«B2:B1001»)) Is Nothing Then  
       If Target = «» Then  
           With Target.Offset(0, 1).Validation  
               .Delete  
           End With  
           Target.Offset(0, 1).ClearContents  
       Else  
           With Target.Offset(0, 1).Validation  
               .Delete  
               .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _  
               xlBetween, Formula1:=»=$AT$2:$AT$11″  
               .IgnoreBlank = True  
               .InCellDropdown = True  
               .InputTitle = «»  
               .ErrorTitle = «»  
               .InputMessage = «»  
               .ErrorMessage = «»  
               .ShowInput = True  
               .ShowError = True  
           End With  
       End If  
   End If  

         If Intersect(Target, Range(«B2:B1001»)) Is Nothing Then Exit Sub  
         On Error GoTo Exit_  
            With Sheets(«Table_MSSQL»)  
               If .Cells(Target.Row, «E») <> «» Then  
               Application.EnableEvents = False  
               .Cells(Target.Row, «C»).Value = Now  
               .Cells(Target.Row, «C»).EntireColumn.AutoFit  
               Else  
               .Cells(Target.Row, «C»).Value = Empty  
      End If  
  End With  
Exit_:  
Application.EnableEvents = True  

    End Sub

 

k61

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

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

Вероятно потому, что это условие (If Target.Address = [Тип сделки].Address)соблюдено и происходит выход (Exit Sub) из процедуры.

 

k61

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

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

Попробуйте заменить:  
If Target.Address = [Тип сделки].Address Then [Количество.комнат] = «»: Exit Sub
If Target.Address = [Тип.сделки].Address Then [Регион] = «»: Exit Sub

  на:  
If Target.Address = [Тип сделки].Address Then
[Количество.комнат] = «»
[Регион] = «»
Exit Sub ‘если выход не нужен, эту строку убрать  
End if

 

Saeglopur

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

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

#10

16.01.2012 21:42:27

Спасибо, но не проходит…

объединить два макроса на одном листе в исходном тексте

Лехаа

Дата: Среда, 08.08.2012, 10:17 |
Сообщение № 1

Группа: Пользователи

Ранг: Участник

Сообщений: 68


Репутация:

4

±

Замечаний:
0% ±


вопрос наверное совсем дилетанский но я на нем встал smile
как объединить эти два макроса пытаюсь засунуть в исходный текст одного листа
surprised помогите пожалуйста…

вот 1й:
[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Target.Column = 7 Or Target.Column = 8 Then
Application.EnableEvents = 0
Target = WorksheetFunction.Proper(Target)
End If
Application.EnableEvents = 1
End Sub

[/vba]

вот 2й:

[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 3 Then Exit Sub
If Target.Columns.Count > 1 Then Exit Sub
Application.EnableEvents = False
Dim c As Range
For Each c In Target
If c Like «изолента*» Then
c.Offset(, 32) = «-»
c.Offset(, 33) = Now
Else
c.Offset(, 32).Resize(, 2).ClearContents
End If
Next c
Application.EnableEvents = True
End Sub

[/vba]

 

Ответить

Формуляр

Дата: Среда, 08.08.2012, 10:46 |
Сообщение № 2

Группа: Друзья

Ранг: Ветеран

Сообщений: 832


Репутация:

255

±

Замечаний:
0% ±


Excel 2003, 2013

Примерно так:
[vba]

Code

Private Sub Worksheet_Change(ByVal Target As Range)
     If Target.Count > 1 Then Exit Sub
     Application.EnableEvents = False
     If Target.Column = 7 Or Target.Column = 8 Then
         Target = WorksheetFunction.Proper(Target)
     ElseIf Target.Column <> 3 Then Exit Sub
         Dim c As Range
         For Each c In Target
             If c Like «изолента*» Then
                 c.Offset(, 32) = «-»
                 c.Offset(, 33) = Now
             Else
                 c.Offset(, 32).Resize(, 2).ClearContents
             End If
         Next c
     End If
     Application.EnableEvents = True
End Sub

[/vba]


Excel 2003 EN, 2013 EN

Сообщение отредактировал ФормулярСреда, 08.08.2012, 10:47

 

Ответить

Лехаа

Дата: Среда, 08.08.2012, 11:00 |
Сообщение № 3

Группа: Пользователи

Ранг: Участник

Сообщений: 68


Репутация:

4

±

Замечаний:
0% ±


1 й работает на ура а вот второй не срабатывает… в чем может быть загвоздка?

 

Ответить

Формуляр

Дата: Среда, 08.08.2012, 11:22 |
Сообщение № 4

Группа: Друзья

Ранг: Ветеран

Сообщений: 832


Репутация:

255

±

Замечаний:
0% ±


Excel 2003, 2013

Да в чём угодно!
Никто же, кроме вас, не знает как он должен работать.
Отлаживайте.
Ставьте СТОПы, смотрите значения переменных …
Это основная часть работы с макросами.


Excel 2003 EN, 2013 EN

 

Ответить

RAN

Дата: Среда, 08.08.2012, 12:31 |
Сообщение № 5

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

[vba]

Code

Private Sub Worksheet_Change(ByVal Target As Range)
      If Target.Cells.Count > 1 Then Exit Sub
      If Target.Column = 3 Then
          Application.EnableEvents = False
          Target.Offset(, 32).Resize(, 2).ClearContents
          If Target Like «изолента*» Then: Target.Offset(, 32) = «-«: Target.Offset(, 33) = Now
      ElseIf Target.Column = 7 Or Target.Column = 8 Then
          Application.EnableEvents = False
          Target = StrConv(Target, 3)
      End If
      Application.EnableEvents = True
End Sub

[/vba]


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RANСреда, 08.08.2012, 12:43

 

Ответить

Лехаа

Дата: Среда, 08.08.2012, 12:52 |
Сообщение № 6

Группа: Пользователи

Ранг: Участник

Сообщений: 68


Репутация:

4

±

Замечаний:
0% ±


Огромное Спасибо!

 

Ответить

Формуляр

Дата: Среда, 08.08.2012, 13:10 |
Сообщение № 7

Группа: Друзья

Ранг: Ветеран

Сообщений: 832


Репутация:

255

±

Замечаний:
0% ±


Excel 2003, 2013

Лехаа,
виноват!
Сам невнимательно код перенёс.

Quote (Формуляр)

    ElseIf Target.Column <> 3 Then Exit Sub


Excel 2003 EN, 2013 EN

 

Ответить

Это продолжение статей «Урок 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. Объединить работу этих макросов в один макрос

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

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

Как включить макросы в 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, а затем выполнить его.

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

Объединить несколько макросов в один макрос

06.02.2013, 11:28. Показов 12656. Ответов 20


Студворк — интернет-сервис помощи студентам

Подскажите пожалуйста как объединить в один макрос несколько:

1 макрос.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
Sub Consolidated_Range_of_Books_and_Sheets()
    Dim iBeginRange As Object, lCalc As Long, lCol As Long
    Dim oAwb As String, sCopyAddress As String, sSheetName As String
    Dim lLastrow As Long, lLastRowMyBook As Long, li As Long, iLastColumn As Integer
    Dim wsSh As Object, wsDataSheet As Object, bPolyBooks As Boolean, avFiles
    On Error Resume Next
    '1. Выбираем диапазон выборки с книг
    Set iBeginRange = Application.InputBox("Выберите диапазон сбора данных." & vbCrLf & _
                                           "1. При выборе только одной ячейки данные будут собраны со всех листов начиная с этой ячейки. " & _
                                           vbCrLf & "2. При выделении нескольких ячеек данные будут собраны только с указанного диапазона всех листов.", Type:=8)
    '2. Если диапазон не выбран - завершаем процедуру
    If iBeginRange Is Nothing Then Exit Sub
    '3. Указываем имя листа
    '4. Допустимо указывать в имени листа символы подставки ? и *.
    'Если указать только * то данные будут собираться со всех листов
    sSheetName = InputBox("Введите имя листа, с которого собирать данные(если не указан, то данные собираются со всех листов)", "Параметр")
    '5. Если имя листа не указано - данные будут собраны со вех листов
    If sSheetName = "" Then sSheetName = "*"
    On Error GoTo 0
    '6. Запрос сбора данных с книг(если Нет - то сбор идет с активной книги)
    If MsgBox("Собрать данные с нескольких книг?", vbInformation + vbYesNo, "Excel-VBA") = vbYes Then
        avFiles = Application.GetOpenFilename("Excel files(*.xls*),*.xls*", , "Выбор файлов", , True)
        If VarType(avFiles) = vbBoolean Then Exit Sub
        bPolyBooks = True
        lCol = 1
    Else
        avFiles = Array(ThisWorkbook.FullName)
    End If
    '7. отключаем обновление экрана, автопересчет формул и отслеживание событий
    'для скорости выполнения кода и для избежания ошибок, если в книгах есть иные коды
    With Application
        lCalc = .Calculation
        .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual
    End With
    Application.DisplayAlerts = False
    '8. создаем новый лист в книге для сбора после текущего листа After:=ActiveSheet либо в конец After:=Sheets(Sheets.Count)
    ThisWorkbook.Sheets.Add after:=ActiveSheet
    Set wsDataSheet = ThisWorkbook.ActiveSheet
    '9. цикл по книгам
    For li = LBound(avFiles) To UBound(avFiles)
        If bPolyBooks Then Workbooks.Open Filename:=avFiles(li)
        oAwb = Dir(avFiles(li), vbDirectory)
        '10. цикл по листам
        For Each wsSh In Workbooks(oAwb).Sheets
            If wsSh.Name Like sSheetName Then
                '11. Если имя листа совпадает с именем листа, в который собираем данные
                'и сбор идет только с активной книги - то переходим к следующему листу
                If wsSh.Name = wsDataSheet.Name And bPolyBooks = False Then GoTo NEXT_
                With wsSh
                    Select Case iBeginRange.Count
                    Case 1 '12. собираем данные начиная с указанной ячейки и до конца данных
                        lLastrow = .Cells(1, 1).SpecialCells(xlLastCell).Row
                        iLastColumn = .Cells.SpecialCells(xlLastCell).Column
                        sCopyAddress = .Range(.Cells(iBeginRange.Row, iBeginRange.Column), .Cells(lLastrow, iLastColumn)).Address
                    Case Else '13. собираем данные с фиксированного диапазона
                        sCopyAddress = iBeginRange.Address
                    End Select
                    lLastRowMyBook = wsDataSheet.Cells.SpecialCells(xlLastCell).Row + 1
                    '14. вставляем имя книги, с которой собраны данные
                    If lCol Then wsDataSheet.Cells(lLastRowMyBook, 1).Resize(Range(sCopyAddress).Rows.Count).Value = oAwb
                    .Range(sCopyAddress).Copy wsDataSheet.Cells(lLastRowMyBook, 1).Offset(, lCol)
                End With
            End If
NEXT_:
        Next wsSh
        If bPolyBooks Then Workbooks(oAwb).Close False
    Next li
    '15. переименовываем лист с данными
    ThisWorkbook.Worksheets(2).Name = "main"
    '16. включаем обратно то что отключали
    With Application
        lCalc = .Calculation
        .ScreenUpdating = True: .EnableEvents = True: .Calculation = xlCalculationAutomatic
    End With
    
    '1. На время работы кода для ускорения работы кода отключаем:
    'Обновление монитора.
    Application.ScreenUpdating = False
    'События.
    Application.EnableEvents = False
    '2. Переносим текущий лист его после листа 000 если он случайно находиться где-то в другом месте
    Sheets("main").Select
    Sheets("main").Move Before:=Sheets(2)
    '3. добавляем ещё 1 строку
    Rows("1:1").Select
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    '4. удаляем границы
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    Selection.Borders(xlEdgeLeft).LineStyle = xlNone
    Selection.Borders(xlEdgeTop).LineStyle = xlNone
    Selection.Borders(xlEdgeBottom).LineStyle = xlNone
    Selection.Borders(xlEdgeRight).LineStyle = xlNone
    Selection.Borders(xlInsideVertical).LineStyle = xlNone
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
    '5. очищаем содержимое
    Selection.ClearComments
    With Selection.Font
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
    End With
    With Selection.Interior
        .Pattern = xlNone
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    Selection.Font.Bold = False
    With Selection.Font
        .Name = "Franklin Gothic Book"
        .Size = 10
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .ThemeFont = xlThemeFontNone
    End With
    '6. удаляем кавычки и пустые пробелы и переименовываем Рур и Укрнафту
    Cells.Replace What:="""", Replacement:="", LookAt:=xlPart, SearchOrder _
    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    Cells.Replace What:="   ", Replacement:="", LookAt:=xlPart, SearchOrder _
    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    Rows("5:5").Select
    Selection.AutoFilter
    '8. вставляем название бренда в 1 колонке
    'Range("A6:A" & Cells(Rows.Count, 1).End(xlUp).Row).Select
    Range("A6").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Formula = "=RC[21]"
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    '11. удаляем ненужные колонки
    Range("A6").Activate
    Selection.RowHeight = 13.2
    Columns("C:C").Select
    Selection.Delete Shift:=xlToLeft
    'Columns("Q:R").Select
    'Selection.Delete Shift:=xlToLeft
    Columns("V:V").Select
    Selection.Delete Shift:=xlToLeft
    Columns("Q:Q").ColumnWidth = 6
    Columns("R:R").ColumnWidth = 6
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.DisplayAlerts = True
    Application.StatusBar = False
    Application.Caption = Empty

2. макрос

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub Udalenie_Pustyh_Strok()
'    Удаляем пустые строки с листа 
    FirstRow = ActiveSheet.UsedRange.Row
    LastRow = ActiveSheet.UsedRange.Rows.Count - 1 + ActiveSheet.UsedRange.Row
        For r = LastRow To FirstRow Step -1
            If Application.CountA(Rows(r)) = 0 Then
                Rows(r).Delete
            End If
        Next r
 
End Sub

3. макрос

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
Sub Procedure_1()
   '28. формирование листов по брендам
    'В константе указываем порядковый номер последнего листа,
    'который должен просматриваться макросом.
    'Это связано с тем, что в ходе работа коды в книгу
    'будут добавляться листы.
    Const mySheetCount As Long = 2
 
    Dim shSheet_1 As Excel.Worksheet
    Dim shLast As Excel.Worksheet
    Dim rngSearch As Excel.Range
    Dim rngFind As Excel.Range, myAddress As String
    Dim myLastRow_1 As Long, myLastRow_2 As Long
    Dim iSheet_1 As Long, jSheet As Long
 
    '1. На время работы кода для ускорения работы кода отключаем:
    'Обновление монитора.
    Application.ScreenUpdating = False
    'Пересчёт формул.
    Application.Calculation = xlCalculationManual
    'События.
    Application.EnableEvents = False
 
    '2. Даём листу "000" имя "shSheet_1".
    'Через это имя будем обращаться к этому листу.
    Set shSheet_1 = Worksheets("000")
 
    'Двигаемся по листу "000" по первому столбцу до первой пустой ячейки.
    'Начиаем двигаться с первой строки.
    iSheet_1 = 1
    Do While IsEmpty(shSheet_1.Cells(iSheet_1, "A")) = False
 
    '3. Чтобы код был проще, сразу создаём лист для текущей ячейки,
    'независимо от того, встретится текст из текущей ячейки на
    'просматриваемых листах или нет.
    'After:=Worksheets(Worksheets.Count) - это последний лист.
    'Одновременно, при создании листа, даём имя "shLast" листу.
    'Через это имя будем обращаться к листу.
        Set shLast = Worksheets.Add(after:=Worksheets(Worksheets.Count))
 
    '4. Даём имя листу в соответствии с данными из ячейки.
    'Только в данном случае нужно учитывать:
    '1) нет ли уже листа с таким именем;
    '2) содержит ли имя допустимые символы;
    '3) длина имени.
    'Я этого ничего не буду учитывать.
        shLast.Name = shSheet_1.Cells(iSheet_1, "A").Value
 
    '5. Подготавливаем номер строки, куда будут вставляться данные на новом листе.
        myLastRow_2 = 1
 
    'В цикле с "jSheet" проходимся по листам, которые надо обработать.
        For jSheet = 2 To mySheetCount Step 1
 
    'Буду использовать команду "Find" для поиска.
    '6. Задаю диапазон поиска, чтобы код работал быстрее и лишнее не просматривал.
    '6.1. Определяю последнюю строку с данными на текущем листе в столбце "A".
            myLastRow_1 = Worksheets(jSheet).Columns("A").Find(What:="?", _
                LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, _
                SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False).Row
    '6.2. Даю фрагменту листа, где нужно искать, имя "rngSearch".
    'Здесь вместо "A1" можно указать строку, с которой нужно искать.
            Set rngSearch = Worksheets(jSheet).Range("A1:A" & myLastRow_1)
 
    '7. Осуществляем поиск.
    'After:=rngSearch.Cells(rngSearch.Rows.Count, 1) - здесь указываем,
    'что поиск начинаем с последней ячейки. Это связано с тем, что поиск
    'начинается после указанной ячейки, чтобы данные брались в том порядке,
    'в котором они находятся на листе.
    'LookAt:=xlPart - поиск по частичному совпадению, например "Укрнафт".
            Set rngFind = rngSearch.Find(What:=CStr(shSheet_1.Cells(iSheet_1, "A").Value), _
                after:=rngSearch.Cells(rngSearch.Rows.Count, 1), LookIn:=xlValues, _
                LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
                MatchCase:=False, SearchFormat:=False)
 
    'Если слово не будет найдено, то в переменной "rngFind"
    'будет содержаться слово "Nothing".
            If rngFind Is Nothing Then
 
    'Переходим к следующему листу.
                GoTo metka
 
            End If
 
    'Если был результат поиска, то найденной ячейке даётся имя "rngFind".
    'Через это имя можно обращаться к найденной ячейке.
    '8. Запоминаем адрес ячейки, чтобы потом остановить поиск, дойдя до этой же ячейки.
            myAddress = rngFind.Address
 
    'Ведём поиск, пока не вернёмся к первой найденной ячейке.
            Do
 
    '9. Копируем строку на последний лист
                rngFind.EntireRow.Copy Destination:=shLast.Range("A" & myLastRow_2)
 
    '10. Подготавливаем номер строки на последнем листе для следующих данных.
                myLastRow_2 = myLastRow_2 + 1
 
    '11. Ищем дальше в том же диапазоне.
                Set rngFind = rngSearch.FindNext(rngFind)
 
            Loop While rngFind.Address <> myAddress
 
metka:
 
        Next jSheet
 
    '12. Переход к следующей строке.
        iSheet_1 = iSheet_1 + 1
 
    Loop
End Sub

4. макрос

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
Sub Procedure_2()
    
   
    'В константе указываете порядковый номер последнего
        'листа, который должен просматриваться макросом.
    'Это связано с тем, что в ходе работа коды в книгу
        'будут добавляться листы.
    Const mySheetCount As Long = 2
 
    Dim shSheet_1 As Excel.Worksheet
    Dim shLast As Excel.Worksheet
    Dim rngSearch As Excel.Range
    Dim rngFind As Excel.Range, myAddress As String
    Dim myLastRow_1 As Long, myLastRow_2 As Long
    Dim iSheet_1 As Long, jSheet As Long
    
    '1. На время работы кода для ускорения работы кода отключаем:
    'Обновление монитора.
    Application.ScreenUpdating = False
    'Пересчёт формул.
    Application.Calculation = xlCalculationManual
    'События.
    Application.EnableEvents = False
    
    '2. Даём листу "000" имя "shSheet_1".
    'Через это имя будем обращаться к этому листу.
    Set shSheet_1 = Worksheets("000")
    
    'Двигаемся по листу "000" по первому столбцу
    'до первой пустой ячейки.
    'Начиаем двигаться с первой строки.
    iSheet_1 = 1
    Do While IsEmpty(shSheet_1.Cells(iSheet_1, "C")) = False
    
    '3. Чтобы код был проще, сразу создаём лист для текущей ячейки,
    'независимо от того, встретится текст из текущей ячейки на
    'просматриваемых листах или нет.
    'After:=Worksheets(Worksheets.Count) - это последний лист.
    'Одновременно, при создании листа, даём имя "shLast" листу.
    'Через это имя будем обращаться к листу.
        Set shLast = Worksheets.Add(After:=Worksheets(Worksheets.Count))
        
    '4. Даём имя листу в соответствии с данными из ячейки.
    'Только в данном случае нужно учитывать:
    '1) нет ли уже листа с таким именем;
    '2) содержит ли имя допустимые символы;
    '3) длина имени.
    'Я этого ничего не буду учитывать.
        shLast.Name = shSheet_1.Cells(iSheet_1, "C").Value
    
    '5. Подготавливаем номер строки, куда будут вставляться данные на новом листе.
        myLastRow_2 = 1
    
    'В цикле с "jSheet" проходимся по листам, которые надо обработать.
        For jSheet = 2 To mySheetCount Step 1
        
    'Буду использовать команду "Find" для поиска.
    '6. Задаю диапазон поиска, чтобы код работал быстрее и лишнее
    'не просматривал.
    '6.1. Определяю последнюю строку с данными на текущем листе
    'в столбце "T".
            myLastRow_1 = Worksheets(jSheet).Columns("W").Find(What:="?", _
                LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, _
                SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False).Row
    '6.2. Даю фрагменту листа, где нужно искать, имя "rngSearch".
    'Здесь вместо "T1" можно указать строку, с которой нужно искать.
            Set rngSearch = Worksheets(jSheet).Range("W1:W" & myLastRow_1)
            
    '7. Осуществляем поиск.
    'After:=rngSearch.Cells(rngSearch.Rows.Count, 1) - здесь указываем,
    'что поиск начинаем с последней ячейки. Это связано с тем, что поиск
    'начинается после указанной ячейки, чтобы данные брались в том порядке,
    'в котором они находятся на листе.
    'LookAt:=xlPart - поиск по частичному совпадению, например "Укрнафт".
            Set rngFind = rngSearch.Find(What:=CStr(shSheet_1.Cells(iSheet_1, "C").Value), _
                After:=rngSearch.Cells(rngSearch.rows.Count, 1), LookIn:=xlValues, _
                LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
                MatchCase:=False, SearchFormat:=False)
                
    'Если слово не будет найдено, то в переменной "rngFind"
    'будет содержаться слово "Nothing".
            If rngFind Is Nothing Then
            
    'Переходим к следующему листу.
                GoTo metka
            
            End If
            
    'Если был результат поиска, то найденной ячейке даётся имя "rngFind".
    'Через это имя можно обращаться к найденной ячейке.
    '8. Запоминаем адрес ячейки, чтобы потом остановить поиск,
    'дойдя до этой же ячейки.
            myAddress = rngFind.Address
            
    'Ведём поиск, пока не вернёмся к первой найденной ячейке.
            Do
            
    '9. Копируем строку на последний лист
                rngFind.EntireRow.Copy Destination:=shLast.Range("A" & myLastRow_2)
                
    '10. Подготавливаем номер строки на последнем листе для следующих данных.
                myLastRow_2 = myLastRow_2 + 1
                
    '11. Ищем дальше в том же диапазоне.
                Set rngFind = rngSearch.FindNext(rngFind)
                
            Loop While rngFind.Address <> myAddress
            
metka:
        
        Next jSheet
    
    '12. Переход к следующей строке.
        iSheet_1 = iSheet_1 + 1
        
    Loop
 
    '13. Включаем то, что отключали в начале работы кода.
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
 
End Sub



0



I will show you how to run a macro from another macro in Excel.  This means that you can run any macro when you need to from a completely separate macro.

This is actually very simple!

Use Call in VBA.

Here is the macro we want to call or run using another macro:

Sub Macro_2()

MsgBox "Hi!"

End Sub

And here is the macro that will call or run this macro:

Sub Macro_1()

'call the second macro

Call Macro_2

End Sub

It is as simple as that.  Put Call in front of the name of the macro that you want to run.

Here is a screenshot of these two macros in Excel:

Download the spreadsheet for this tutorial, from below or the side-bar of this page, and you can test out these macros.


Excel VBA Course

Excel VBA Course — From Beginner to Expert

200+ Video Lessons
50+ Hours of Instruction
200+ Excel Guides

Become a master of VBA and Macros in Excel and learn how to automate all of your tasks in Excel with this online course. (No VBA experience required.)

View Course

Similar Content on TeachExcel

Use Macros with UserForms

Tutorial: This tutorial explains how macros interact with UserForms.
This includes an explanation of…

Run a Macro when a User Does Something in the Worksheet in Excel

Tutorial: How to run a macro when a user does something in the worksheet, everything from selecting …

Stop a Macro from Running in Excel

Tutorial:

How to stop a macro from running after it has started.

This method uses the keyboard an…

Run a Macro When a Specific Cell Changes in Excel

Tutorial:
Run a macro in Excel when a specific cell is changed; this also covers when a cell within…

Login to a Website using a Macro

: Connect and login to a website using a macro in Excel.
This allows you to open a website a…

Subscribe for Weekly Tutorials

BONUS: subscribe now to download our Top Tutorials Ebook!

Excel VBA Course

Excel VBA Course — From Beginner to Expert

200+ Video Lessons

50+ Hours of Video

200+ Excel Guides

Become a master of VBA and Macros in Excel and learn how to automate all of your tasks in Excel with this online course. (No VBA experience required.)

View Course

Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel 2021 Excel 2021 для Mac Excel 2019 Excel 2019 для Mac Excel 2016 Excel 2016 для Mac Excel 2013 Excel 2010 Excel 2007 Еще…Меньше

Когда вы впервые создаете макрос в книге, он работает только в ней. А если вам нужно использовать макрос в других книгах? Чтобы макросы были доступны при каждом запуске Excel, создайте их в книге с именем Personal.xlsb. Это скрытая книга, которая хранится на компьютере и открывается в фоновом режиме при каждом Excel.

Макросы и средства VBA находятся на вкладке Разработчик, которая по умолчанию скрыта, поэтому сначала нужно включить ее. Дополнительные сведения см. в статье Отображение вкладки «Разработчик».

Вкладка "Разработчик" на ленте

Теперь создайте макрос. Мы зафиксим макрос, который ничего не делает, но создаст личную книгу макроса.

Дополнительные сведения о создании макросов см. в разделе Краткое руководство. Создание макроса.

  1. Перейдите на вкладку Разработчик и нажмите кнопку Запись макроса.

    Группа "Код" на вкладке "Разработчик"

  2. В диалоговом окне Запись макроса не помешает ввести имя макроса в поле Имя макроса. Вы можете принять имя, которое Excel, например Макрос1, так как это просто временный макрос.

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

  3. В поле Сохранить в выберитеЛичная книга макроса и > ОК. Это самый важный шаг, так как если у вас еще нет личной книги макроса, Excel создаст ее.

  4. Щелкните Разработчик > Остановитьзапись , Excel создайте личную книгу макроса.

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

Чтобы увидеть созданный макрос:

  1. Перейдите в >Visual Basic, чтобы запустить редактор Visual Basic (VBE),в котором хранятся макросы.

  2. Книгу «Личные макросы» можно найти в области Project проводника слева. Если вы не видите его, перейдите в > Project проводник.

  3. Дважды щелкните папку VBA Project (PERSONAL.xlsb) > Modules > Module1, и вы увидите пустой записанный макрос1. Вы можете удалить его или оставить, чтобы добавить код к более поздней.

    Примечание: При записи макроса в новом экземпляре Excel VBA автоматически создает новую папку Module и ее номер прибавления. Поэтому если у вас уже есть Module1 и Module2, VBA создаст Модуль3. Модули можно переименовать в окне Свойства под обозревателем Project ,чтобы они лучше отражали то, что делают макрос внутри них.

Перемещение макросов на другой компьютер

Файл Personal.xlsB хранится в папке XLSTART. Если вы хотите поделиться макросами с другими, вы можете скопировать их в папку XLSTART на других компьютерах или скопировать некоторые или все макрос в файл Personal.xlsb на других компьютерах. Вы можете найти XLSTART в Windows проводнике.

Если вы хотите поделиться одним или несколькими макросами с другими людьми, вы можете отправить им книгу, содержаную их. Можно также предоставить доступ к книге на общем сетевом диске или в библиотеке служб SharePoint Services.

Дополнительные сведения о копировании макросов из одной книги в другую см. в статье Копирование модуля макроса в другую книгу.

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

  1. Перейдите в Excel > параметры…> ленты & панель инструментов.

  2. В категории Настроить ленту в списке Основные вкладки установите флажок Разработчик, а затем нажмите кнопку Сохранить.

Теперь создайте макрос. Мы зафиксим макрос, который ничего не делает, но создаст личную книгу макроса.

Дополнительные сведения о создании макросов см. в разделе Краткое руководство. Создание макроса.

  1. Перейдите на вкладку Разработчик и нажмите кнопку Запись макроса.

  2. В диалоговом окне Запись макроса не помешает ввести имя макроса в поле Имя макроса. Вы можете принять имя, которое Excel, например Макрос1, так как это просто временный макрос.

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

  3. В поле Сохранить в выберитеЛичная книга макроса и > ОК. Это самый важный шаг, так как если у вас еще нет личной книги макроса, Excel создаст ее.

  4. Щелкните Разработчик > Остановитьзапись , Excel создайте личную книгу макроса.

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

Чтобы увидеть созданный макрос:

  1. Нажмите кнопку > Visual Basic, чтобы запустить редактор Visual Basic (VBE),в котором хранятся макросы.

  2. Книгу «Личные макросы» можно найти в области Project проводника слева. Если вы не видите его, перейдите в > Project проводник.

  3. Дважды щелкните папку VBA Project (PERSONAL.xlsb) > Modules > Module1, и вы увидите пустой записанный макрос1. Вы можете удалить его или оставить, чтобы добавить код к более поздней.

Примечание: При записи макроса в новом экземпляре Excel VBA автоматически создает новую папку Module и ее номер прибавления. Поэтому если у вас уже есть Module1 и Module2, VBA создаст Модуль3. Модули можно переименовать в окне Свойства под обозревателем Project ,чтобы они лучше отражали то, что делают макрос внутри них.

Перемещение макросов на другой компьютер

Файл Personal.xlsB хранится в папке запуска системы. Если вы хотите поделиться макросами с другими, можно скопировать Personal.xlsb в папку запуска на других компьютерах или скопировать некоторые или все макрос макроса в файл Personal.xlsb на других компьютерах. В Finder выберите Перейти, а затем, удерживая клавишу OPTION, выберите Библиотека. В области Библиотека перейдите к группе Containers > xyz.Office (где xyz — это текстовая строка, например «UBF8T346G9») > User Content > Startup > Excel. В Personal.xlsb в Excel папку.

Если вы хотите поделиться одним или несколькими макросами с другими людьми, вы можете отправить им книгу, содержаную их. Можно также предоставить доступ к книге на общем сетевом диске или в библиотеке служб SharePoint Services.

Дополнительные сведения о копировании макросов из одной книги в другую см. в статье Копирование модуля макроса в другую книгу.

Дополнительные сведения

Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.

Нужна дополнительная помощь?

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

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

  • Excel два листа в одном окне
  • Excel два значения на одной оси
  • Excel два знака после запятой в формуле
  • Excel два диапазона в формуле
  • Excel два графика на одном по разным осям

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

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