Два макроса на одной кнопке excel

 

bandanas

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

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

в книге 3 макроса(условно «мак1″,»мак2″,»мак3»)и несколько кнопок.  
нужно чтобы при нажатии на первую кнопку выполнялся    
сначала «мак1»,    
потом «мак2»,    
потом «мак3»,    
а на второй кнопке чтобы выполнялся    
сначала «мак3»,    
потом «мак1»,    
потом «мак2»  
возможно???

 

Dophin

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

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

вставляйте кнопку ActiveX там это проще пареной репы

 

{quote}{login=bandanas}{date=27.02.2010 05:46}{thema=запуск нескольких макросов при нажатии кнопки}{post}в книге 3 макроса(условно «мак1″,»мак2″,»мак3»)и несколько кнопок.  
нужно чтобы при нажатии на первую кнопку выполнялся    
сначала «»,    
потом «мак2»,    
потом «мак3»,    
а на второй кнопке чтобы выполнялся    
сначала «мак3»,    
потом «мак1»,    
потом «мак2»  
возможно???{/post}{/quote}  
Sub первая_кнопка  
й:мак1:мак2:мак3  
End Sub  
Sub вторая_кнопка  
й:мак3:мак2:мак1  
End Sub

 

YJYNGK

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

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

{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»)и несколько кнопок.  
нужно чтобы при нажатии на первую кнопку выполнялся    
сначала «»,    
потом «мак2»,    
потом «мак3»,    
а на второй кнопке чтобы выполнялся    
сначала «мак3»,    
потом «мак1»,    
потом «мак2»  
возможно???{/post}{/quote}  
Sub первая_кнопка  
й:мак1:мак2:мак3  
End Sub  
Sub вторая_кнопка  
й:мак3:мак2:мак1  
End Sub{/post}{/quote}  

  Ребятки, а какж ебыть тогда, когда необходимо запустить два макроса ОДНОЙ кнопкой, причем макросы находятся на разных листах (Лист1 и Лист2) ???  

  И второе, а что означает «й» в начале строки в приведенном примере (й:мак1:мак2:мак3) ???

 

Юрий М

Модератор

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

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

Так будет более понятно:  
Sub MacroMain()  
Call Макрос1  
Call Макрос2  
Call Макрос3  
end sub  
будут поочерёдно выполнены три макроса в указанном порядке.

 

Юрий М

Модератор

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

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

Если на листах — укажите имя листа: Sheets(«Лист1»).Макрос1 и т.д.

 

YJYNGK

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

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

{quote}{login=Юрий М}{date=27.11.2010 08:41}{thema=}{post}Если на листах — укажите имя листа: Sheets(«Лист1»).Макрос1 и т.д.{/post}{/quote}  
Спасибо, но вот это НЕ проходит:  

  Private Sub CommandButton1_Click()  
Call Sheets(«Лист1»).Макрос1  
Call Sheets(«Лист2»).Макрос1  
End Sub  

  … выдает ошибку уже на первом макросе…

 

Юрий М

Модератор

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

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

Не могут два макроса «обзываться» одинаково.

 

YJYNGK

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

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

{quote}{login=Юрий М}{date=27.11.2010 08:52}{thema=}{post}Не могут два макроса «обзываться» одинаково.{/post}{/quote}  
Дело в том, что я их создавал через:  
— закладка листа;  
— клик правой кнопкой;  
— исходный текст;  
— имена я не задавал, они самостоятельно присваивались, сначала одному макросу, затем второму и, оба назвали себя Макрос1 … Вот

 

YJYNGK

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

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

Private Sub CommandButton1_Click()  
Call Макрос1  
End Sub  

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

 

Юрий М

Модератор

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

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

Ну так переименуйте макрос на втором листе в Макрос2

 

Юрий М

Модератор

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

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

Дим, я про родителей автору писал :-)

 

YJYNGK

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

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

Спасибо The_Prist, спасибо Юрий, НО дошло до смешного. Я перепробовал сейчас все ваши советы, срабатывает почему-то только первый, на втором он останавливается …  
Решил вернуть эти макросы на свои места, т. е. каждый на свой модуль листа … получается запускать их только по раздельности …    
пробовал и так:  

  Private Sub CommandButton1_Click()  
Call Макрос1  
Call Sheets(«Продажа ТО с ZP»).Макрос2  
End Sub  

  и так:  

  Private Sub CommandButton1_Click()  
Call Макрос1  
Call Лист2.Макрос2  
End Sub  

  и эдак:    

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

  Результат один — НЕТ …

 

Юрий М

Модератор

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

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

И вот так не работает?  
Private Sub CommandButton1_Click()  
Call Sheets(«Лист1»).Макрос1  
Call Sheets(«Лист2»).Макрос2  
End Sub  

  На втором листе макрос должен иметь именно такое имя!!!  
Или давайте Ваш файл.

 

YJYNGK

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

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

{quote}{login=The_Prist}{date=27.11.2010 09:37}{thema=}{post}И что же у Вас в самих макросах написано не подскажете? Я так подозреваю что-то, что не дает выполнить до конца макрос, а завершает все процедуры. Что-то вроде команды End{/post}{/quote}  
… это модуль первого листа:  
Option Explicit  

  Sub Макрос1() ‘ для копирования обновленного перечня учреждений из основной книги  
Dim TempWb As Workbook  
Dim BazaSht As Worksheet  
Dim iPath As String  
   With Application  
       .ScreenUpdating = False  
       .Calculation = xlCalculationManual  
       Set BazaSht = Sheets(«Продажа ZP»)  
       iPath = ActiveWorkbook.Path & «»  
       Set TempWb = Workbooks.Open(Filename:=iPath & «Продажи-Статистика_2011.xlsm», UpdateLinks:=False, ReadOnly:=True)  
       TempWb.Sheets(«Продажа ZP»).Range(«A3:F555»).Copy Destination:=BazaSht.Range(«A3»)  
       TempWb.Close saveChanges:=False  
       .Calculation = xlAutomatic  
       .ScreenUpdating = True  
   End With  
   Columns(«B:D»).Select  
   Selection.Copy  
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
       :=False, Transpose:=False  
   Application.CutCopyMode = False  
   Range(«B442»).Select  
   MsgBox «Данные обновлены из файла Продажи-Статистика!», 64, «Копирование»  
End Sub  

  Private Sub CommandButton1_Click()  
Call Макрос1  
Call Sheets(«Продажа ТО с ZP»).Макрос2  
End Sub  

      … это модуль второго листа:    

  Option Explicit  

  Sub Макрос2() ‘ для копирования обновленного перечня учреждений из основной книги  
Dim TempWb As Workbook  
Dim BazaSht As Worksheet  
Dim iPath As String  
   With Application  
       .ScreenUpdating = False  
       .Calculation = xlCalculationManual  
       Set BazaSht = Sheets(«Продажа ТО с ZP»)  
       iPath = ActiveWorkbook.Path & «»  
       Set TempWb = Workbooks.Open(Filename:=iPath & «Продажи-Статистика_2011.xlsm», UpdateLinks:=False, ReadOnly:=True)  
       TempWb.Sheets(«Продажа ТО с ZP»).Range(«A3:f555»).Copy Destination:=BazaSht.Range(«A3»)  
       TempWb.Close saveChanges:=False  
       .Calculation = xlAutomatic  
       .ScreenUpdating = True  
   End With  
   Columns(«B:D»).Select  
   Selection.Copy  
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
       :=False, Transpose:=False  
   Application.CutCopyMode = False  
   Range(«B105»).Select  
   MsgBox «Перечень учреждений обновлен из файла Продажи-Статистика!», 64, «Копирование»  
End Sub  

  … я не большой знаток, только пока пытаюсь разобраться …

 

YJYNGK

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

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

{quote}{login=Юрий М}{date=27.11.2010 09:38}{thema=}{post}И вот так не работает?  
Private Sub CommandButton1_Click()  
Call Sheets(«Лист1»).Макрос1  
Call Sheets(«Лист2»).Макрос2  
End Sub  

  На втором листе макрос должен иметь именно такое имя!!!  
Или давайте Ваш файл.{/post}{/quote}  
Юрий, когда я вставляю вот такой код в стандартный модуль:  
Private Sub CommandButton1_Click()  
Call Sheets(«Лист1»).Макрос1  
Call Sheets(«Лист2»).Макрос2  
End Sub  

  … то кнопка у меня вообще не реагирует.  
Когда я вставляю этот же код в модуль первого листа, то срабатывает только макрос1, на втором выдает ошибку.  
Сейчас попробую кнопку вывести на второй лист и запуститься оттуда …

 

Юрий М

Модератор

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

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

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

 

Юрий М

Модератор

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

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

А лучше прислушайтесь к совет Prist — оба макроса в стандартный модуль. Тогда не придётся указывать явно лист. См. пример.

 

YJYNGK

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

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

{quote}{login=Юрий М}{date=27.11.2010 09:53}{thema=}{post}Раз уж Вы хотите макросы в модулях листов (зачем?), то посмотрите рабочий вариант.{/post}{/quote}  
Большое Вам спасибо Юрий, я вроде бы разобрался, дело не в кнопке, а вот в этом:  
iPath = ActiveWorkbook.Path & «»  
Set TempWb = Workbooks.Open(Filename:=iPath & «Продажи-Статистика_2011.xlsm», UpdateLinks:=False, ReadOnly:=True)  
TempWb.Sheets(«Продажа ZP»).Range(«A3:F555»).Copy Destination:=BazaSht.Range(«A3»)  

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

 

Юрий М

Модератор

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

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

Вопрос был о том, как запустить два макроса последовательно. Чтобы не оглядываться на кнопку на активном листе, назначьте макрос любой автофигуре, рисунку… (правый клик на ней — назначить макрос). Этот макрос может выглядеть так:  
Sub Main()  
Call Макрос1  
Call Макрос2  
End sub  
При этом все макросы в стандартном модуле. См. пример.

 

Спасибо Юрий и другим ребятам тоже выражаю благодарность за участие в разборе.  
Вы верно направляли меня на путь истинный, однако проблема у меня была по другой причине.    
The_Prist правильно определил, скорее всего ошибка в самом коде макросов, запускаемых одной кнопкой. Дело в том, что они работают только с активным листом и, в моем случае активным был только первый (в этом я разобрался только сегодня).  

  С каждым часом у меня назревают все новые препятствия, благодаря Вам мне удается их преодолевать. СПАСИБО !!! (до встречи в следующей теме)

 

YJYNGK

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

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

#22

28.11.2010 11:43:17

{quote}{login=}{date=28.11.2010 11:41}{thema=Благодарность}{post}Спасибо Юрий и другим ребятам тоже выражаю благодарность за участие в разборе.  
Вы верно направляли меня на путь истинный, однако проблема у меня была по другой причине.    
The_Prist правильно определил, скорее всего ошибка в самом коде макросов, запускаемых одной кнопкой. Дело в том, что они работают только с активным листом и, в моем случае активным был только первый (в этом я разобрался только сегодня).  

  С каждым часом у меня назревают все новые препятствия, благодаря Вам мне удается их преодолевать. СПАСИБО !!! (до встречи в следующей теме){/post}{/quote}  

  Извините, разлогинился. Эти благодарности от меня!

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

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

Файл Описание Размер файла: Скачивания
Скачать этот файл (P_Macros_05.zip)Пример   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

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

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

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

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

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

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

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

0 / 0 / 0

Регистрация: 28.10.2012

Сообщений: 152

1

29.10.2012, 12:04. Показов 10324. Ответов 14


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

Может кто знает, как сделать так, чтобы для кнопки на листе в экселе были события click и dblclick?



0



Catstail

Модератор

Эксперт функциональных языков программированияЭксперт Python

34707 / 19228 / 4039

Регистрация: 12.02.2012

Сообщений: 32,185

Записей в блоге: 13

29.10.2012, 12:25

2

Назначается-то без проблем:

Visual Basic
1
2
3
4
5
6
7
Private Sub CommandButton1_Click()
    MsgBox "Клик!"
End Sub
 
Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    MsgBox "Двойной Клик!"
End Sub

вот только сделать даблклик физически не предоставляется возможным, если перехватывается простой клик… А зачем это нужно?



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

Вариант для трех кнопок мыши разные действия —

Visual Basic
1
2
3
4
5
6
7
Private Sub CommandButton1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Select Case Button
Case 1: MsgBox "macro1" 'fmButtonLeft
Case 2: MsgBox "macro2" 'fmButtonRight
Case 4: MsgBox "macro3" 'fmButtonMiddle
End Select
End Sub



2



Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

29.10.2012, 14:15

6

Лучший ответ Сообщение было отмечено как решение

Решение

В стандартный модуль:

Visual Basic
1
2
3
4
5
6
7
8
9
Public flag As Boolean
 
Sub macro()
    If flag Then
        MsgBox "Клик!"
    Else
        MsgBox "Двойной Клик!"
    End If
End Sub

В модуль листа:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub CommandButton1_Click()
    flag = True
    PauseTime = 0.15
    Start = Timer
    Do While Timer < Start + PauseTime
        DoEvents
    Loop
    macro
End Sub
 
Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    flag = False
End Sub

Кнопка Forms.CommandButton.1



3



Модератор

Эксперт функциональных языков программированияЭксперт Python

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

Да, мне этот цикл тоже не нравится. Хотя он не бесконечный
Можно иначе сделать на API, на
Private Declare Function GetTickCount Lib «kernel32» () As Long
но сейчас уже убегаю…

Добавлено через 1 час 16 минут
Ну вот, в модуле листа разместить это:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Option Explicit
 
Private Declare Function GetTickCount Lib "kernel32.dll" () As Long
 
Private Sub CommandButton1_Click()
Dim tm!, ss!
    flag = True
 
    tm = 150    'время задержки (в миллисекундах)
    ss = GetTickCount: DoEvents
    Do While GetTickCount - ss < tm: DoEvents: Loop
 
    macro
End Sub
 
Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    flag = False
End Sub



0



каролинка

0 / 0 / 0

Регистрация: 28.10.2012

Сообщений: 152

30.10.2012, 11:11

 [ТС]

10

В общем, вот что в итоге у меня получилось:

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
Option Explicit
 
Private Declare Function GetTickCount Lib "kernel32.dll" () As Long
 Public flag As Boolean
 
Sub macro()
      Dim l&
    If flag = True Then
  
  l = ThisWorkbook.Worksheets("UREN TABEL").Cells(Columns.Rows.Count, 1).End(xlUp).Row
    With Workbooks.Open("C:UserskantanovichDesktopNew folder_1 - CopyMaster exa v1.xlsx").Worksheets("Database WEEKUREN")
        ThisWorkbook.Worksheets("UREN TABEL").Range("A" & l - 6 & ":o" & l).Copy .Cells(.Rows.Count, _
        1).End(xlUp).Offset(1): .Parent.Close True
    End With
    Else
         l = ThisWorkbook.Worksheets("UREN TABEL").Cells(Columns.Rows.Count, 1).End(xlUp).Row
    With Workbooks.Open("C:UserskantanovichDesktopNew folder_1 - CopyMaster exa v1.xlsx").Worksheets("Database WEEKUREN")
        ThisWorkbook.Worksheets("UREN TABEL").Range("A" & l - 6 & ":o" & l).Copy .Cells(.Rows.Count, _
        1).End(xlUp).Offset(-5): .Parent.Close True
    End With
    End If
End Sub
Private Sub CommandButton1_Click()
Dim tm!, ss!
 
    flag = True
     tm = 150    'âðåìÿ çàäåðæêè (â ìèëëèñåêóíäàõ)
    ss = GetTickCount: DoEvents
    Do While GetTickCount - ss < tm: DoEvents: Loop
 
End Sub
 
Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
   flag = False
End Sub

Но я скорее всего где-то что-то упускаю, потому что через раз запускается и для True выполняет прописанное в Else…(
И на CommandButton1 клики ничего не срабатывает, хотя этот код ей назначен.



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-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Комментарии (5)


Оценок пока нет. Оцените первым!

Is it possible to assign two macros to one button?

Jean-François Corbett's user avatar

asked Aug 21, 2011 at 10:48

user101's user avatar

0

You mean, like this?

Private Sub CommandButton1_Click()
    Macro1
    Macro2
End Sub

answered Aug 21, 2011 at 14:13

Jean-François Corbett's user avatar

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

Gaijinhunter's user avatar

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

jonsca's user avatar

jonscajonsca

10.2k26 gold badges56 silver badges62 bronze badges

Это продолжение статей «Урок 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
  • Два листа на один в word
  • Два листа в excel макросом
  • Два критерия впр в excel
  • Два или три условия в excel