VBA - Вкладання макросів

VBA - Вкладання макросів

com

Вступ

Існує декілька підходів, які можуть використовуватися для виклику макросу з іншого (залежно від того, чи викликає Ви або функція). Крім того, потрібно звернути особливу увагу при обробці процедур подій або виклику процедури з іншої робочої книги.

Виклик Sub з Sub

    • Без параметрів
    • З параметрами
  • Виклик функції з підпункту
  • Виклик функції з функції
    • Використання проміжної змінної
    • Без використання проміжної змінної:
  • Виклик процедури події
    • За допомогою оператора виклику
    • Функція CallByName
  • Викликати процедуру в іншій робочій книзі
    • Виклик Sub
    • Виклик функції

Без параметрів

Обидва субтитри знаходяться в одному модулі і не мають параметрів. Macro2 викликає Macro1:

 Sub Macro1 () MsgBox "Привіт, світ!" Кінець Sub Sub Macro2 () Зателефонуйте за підсумком Macro1 End 

Якщо ви не хочете використовувати оператор виклику:

 Sub Macro1 () MsgBox "Привіт, світ!" Кінець Sub Sub Macro2 () Macro1 End Sub 

Це не рекомендується, тому що оператор Call робить код більш читабельним.

Коли Subs в різних модулях і не мають параметрів, немає потреби вказувати модуль. Але все-таки потрібно подумати про підтримку вашого коду. Вказуючи, який модуль використовується, ви заощадите час, коли налагодите код. Отже, якщо Macro1 знаходиться в Module1 і Macro2 в Module2:

 Sub Macro1 () MsgBox "Привіт, світ!" End Sub Sub Macro2 () Зателефонуйте за модулем1.Macro1 End Sub 

З параметрами

Метод ідентичний. Просто додайте параметри в дужки:

За допомогою оператора виклику

 Sub Macro1 (Nb1 як довгий, Nb2 як довгий) Діапазон ("A1") = Nb1 Діапазон ("A2") = Nb2 Кінець Sub Sub Macro2 () Виклик Macro1 (18254, 654897) Кінець Sub 

Без оператора Call

 Sub Macro1 (Nb1 як довгий, Nb2 як довгий) Діапазон ("A1") = Nb1 Діапазон ("A2") = Nb2 End Sub Sub Macro2 () Macro1 18254321, 654897 End Sub 

Якщо макроси знаходяться в різних модулях:

 Sub Macro2 () Виклик Module1.Macro1 (918254321, 654897) Кінець Sub 

Виклик функції з підпункту

Що таке функція? Що відрізняє функцію від Sub? Функція - це команда, яка повертає значення на основі конкретних параметрів. Sub також є інструкцією, яка залежить від параметрів (якщо такі є), але не повертає жодного значення.

Приклад функції:

 Додавання функцій (Nb1 як подвійне, Nb2 як подвійне) як подвійне додавання = функція завершення Nb1 + Nb2 

У цьому прикладі функція оголошується "як подвійний" (ця декларація типу є необов'язковою). Враховуючи, що функція повертає значення, вам потрібно буде забезпечити зберігання цього значення в викликає Sub. Це може бути або клітинка Excel, і змінна, і т.д.

 Sub Macro2 () Dim Somme як подвійний Somme = Додавання (1234.56, 654.32) Додавання MsgBox Somme до підфункції (Nb1 як подвійне, Nb2 як подвійне) як подвійне додавання = функція завершення Nb1 + Nb2 

Nb: Параметри, укладені в дужки і розділені комами.

Виклик функції з функції

Ми будемо використовувати той самий принцип!

Використання проміжної змінної

У цьому прикладі ми збережемо результат у проміжній змінній:

 Sub Macro2 () Dim Somme як подвійний Somme = Додавання (1234.56, 654.32) Додавання MsgBox Somme до підфункції (Nb1 як подвійний, Nb2 як подвійний) як подвійний Dim VarNb як подвійний VarNb = MultiplieParDeux (Nb2) Додавання = Nb1 + функція кінця VarNb Функція MultiplieParDeux (Nb як подвійна) як подвійний MultiplieParDeux = функція кінця Nb * 2 

Без використання проміжної змінної:

 Sub Macro2 () Dim Somme як подвійний Somme = Додавання (1234.56, 654.32) Додавання MsgBox Somme Під-функції (Nb1 як подвійне, Nb2 як подвійне) як подвійне додавання = Nb1 + MultiplieParDeux (Nb2) Функція функції MultiplieParDeux (Nb як подвійна) Як подвійний MultiplieParDeux = Nb * 2 Завершити функцію 

Виклик процедури події

Що таке процедура події? Процедура події - це оператор, який автоматично активується, коли користувач взаємодіє з певним об'єктом. Об'єктом може бути або аркуш, і робоча книга, і контрольна ... Приклади подій: відкриття або закриття робочої книги, зміна листа, вибір зі списку, введення тексту в контрольну тощо ...

Приклад:

Користувач змінює значення осередку A1: "pas mal" відображається в B1, якщо A1 більше 10.

=== Реалізація: ====

  • Виберіть аркуш
  • Клацніть правою кнопкою миші на вкладці аркуша / Переглянути код.
  • У вікні коду вставте наступне:

 Приватний Sub Worksheet_Change (ByVal Цільовий як діапазон) 'Si la cellule потрібен змінний n'a пар за адресою A1 => на quitte Якщо Target.Address "$ A $ 1" Тоді Exit Sub' Si la cellule (donc A1) est> 10 місце на місці "Pas mal!" uk B1 Якщо Target.Value> 10 Тоді Target.Offset (0, 1) = "Pas mal!" Else Target.Offset (0, 1) = "Пас страшний!" End Sub 

За допомогою оператора виклику

Якщо викликана процедура знаходиться в тому ж самому модулі, що й процедура події:

 Приватний Sub Worksheet_Change (ByVal Цільовий як діапазон) 'Si la cellule потрібен змінний n'a пар за адресою A1 => на quitte Якщо Target.Address "$ A $ 1" Тоді Exit Sub' Si la cellule (donc A1) est> 10 місце на місці "Pas mal!" uk B1 Якщо Target.Value> 10 Тоді Target.Offset (0, 1) = "Pas mal!" Else Target.Offset (0, 1) = "Пас страшний!" Кінець Sub Sub MaMacro () Dim monRange As Range Set monRange = Листи ("Feuil1"). Діапазон ("A1") Виклик Worksheet_Change (monRange) End Sub 

До мінусів, якщо процедура виклику не знаходиться в одному модулі, ви отримаєте таку помилку:

  • Помилка компіляції: Sub або Function не визначено

VBA не може отримати доступ до процедури події. Щоб виправити це:

Функція CallByName

Синтаксис: CallByName (Objet, NomProcédure, TypeAppel, Args ())
  • Об'єкт: Обов'язково. Тип об'єкта. Позначає об'єкт, що бере участь у процедурі.
  • NomProcédure: Обов'язково. Рядок. Назва викликається процедури.
  • TypeAppel: Обов'язково. Тип виклику: Метод, Встановити, Відпустити або Отримати.
  • Args (): Додатково. Параметри, що передаються викликається функції.

У нашому прикладі ми розмістимо maMacro в Module1 і спробуємо викликати Worksheet_Change Sub. Але спочатку потрібно оголосити нашу процедуру події (коли вона оголошена приватною, вона не може бути використана в модулі).

 Sub Worksheet_Change (ByVal Target As Range) 'Поточна клавіатура може змінюватись за адресою A1 => на quitte Якщо Target.Address "$ A $ 1" Тоді Exit Sub' Si la cellule (donc A1) est> 10 alors на місці "Pas mal!" uk B1 Якщо Target.Value> 10 Тоді Target.Offset (0, 1) = "Pas mal!" Else Target.Offset (0, 1) = "Пас страшний!" End Sub 

Тепер розмістіть підменю MyMacro у модулі 2.

 Sub MaMacro () Dim monRange As Range Set monRange = Листи ("Feuil1"). Діапазон ("A1") Робочі таблиці CallByName ("Feuil1"), "Worksheet_Change", VbMethod, monRange End Sub 

Інший приклад:

Після натискання кнопки в UserForm (UserForm2) запустіть подію Combobox1_Change в UserForm1 ...

 Приватна Sub CommandButton1_Click () CallByName UserForm1, "ComboBox1_Change", VbMethod End Sub 

Викликати процедуру в іншій робочій книзі

Ми будемо використовувати метод Run. Вона буде вказана, включаючи робочу книгу, що містить назву процедури та назву процедури.

Виклик Sub

Випадок 1: Файл вже відкритий. У цьому випадку не потрібно вказувати шлях:

 Sub TestRun () Application.Run "'Classeur1.xlsm'! Module2.Macro2" 

Випадок 2: Файл закритий. У цьому випадку слід вказати повний шлях:

 Користувачі franck Настільні Classeur1.xlsm '! Module2.Macro2 "Закінчити Sub 

Виклик функції

Під час виклику функції з тієї ж самої книги вам знадобиться змінна для збереження поверненого значення. Змінна. Потрібно також передавати всі параметри, які будуть передані функції від викликає Sub.

Ми будемо використовувати функцію додавання, розташовану в Classeur1.xlsm:

 Додавання функцій (Nb1 як подвійне, Nb2 як подвійне) як подвійне додавання = функція завершення Nb1 + Nb2 

Щоб викликати нашу основну процедуру [Principale ()] у робочій книжці [Classeur2.xlsm], нам потрібен наступний код:

Книга вже відкрита

 Sub Principale () Dim Somme як подвійний Somme = Run ("'Classeur1.xlsm'! Module2.Addition", 1234.56, 654.32) 

Книга закрита

 Sub Principale () Dim Somme як подвійний Somme = Run ("" C: Користувачі franck Desktop) Classeur1.xlsm '! Module2.Addition ", 1234.56, 654.32) MsgBox Somme End Sub 

Примітка: Якщо ваша робоча книга була закрита раніше, вона буде відкрита після виконання макросу. Так що не забудьте закрити його знову ... використовуючи код!

 Sub TestRun () Dim Somme як подвійний Somme = Виконати ("'Classeur1.xlsm'! Module2.Addition", 1234.56, 654.32) Книги ("Classeur1.xlsm"). 
Попередня Стаття Наступна Стаття

Кращі Поради