VBA - Macro lồng

VBA - Macro lồng

com

Giới thiệu

Có một số cách tiếp cận có thể được sử dụng để gọi macro từ một cách khác (tùy thuộc vào việc bạn đang gọi Sub hay hàm). Ngoài ra, bạn cần đặc biệt chú ý khi xử lý các thủ tục sự kiện hoặc gọi một thủ tục từ một sổ làm việc khác.

Gọi một Sub từ một Sub

    • Không có tham số
    • Với thông số
  • Gọi một chức năng từ một phụ
  • Gọi một chức năng từ một chức năng
    • Sử dụng một biến trung gian
    • Không sử dụng biến trung gian:
  • Gọi một thủ tục sự kiện
    • Với câu lệnh
    • Hàm CallByName
  • Gọi một thủ tục trong một sổ làm việc khác
    • Gọi một Sub
    • Gọi một chức năng

Không có tham số

Cả hai đều nằm trong cùng một mô-đun và không có tham số. Macro2 đang gọi Macro1:

 Sub Macro1 () MsgBox "Xin chào thế giới!" End Sub Sub Macro2 () Gọi Macro1 End Sub 

Nếu bạn không muốn sử dụng câu lệnh Gọi:

 Sub Macro1 () MsgBox "Xin chào thế giới!" Kết thúc phụ Sub Macro2 () Macro1 Kết thúc phụ 

Mặc dù vậy, điều này không được khuyến khích, vì câu lệnh Call làm cho mã dễ đọc hơn nhiều.

Khi Dự bị ở các mô-đun khác nhau và không có tham số, không có yêu cầu chỉ định mô-đun. Nhưng bạn vẫn phải suy nghĩ về việc duy trì mã của bạn. Bằng cách chỉ ra mô-đun nào đang được sử dụng, bạn sẽ tiết kiệm được một số thời gian quý giá khi gỡ lỗi mã của mình. Vì vậy, nếu Macro1 nằm trong Module1 và Macro2 trong Module2:

 Sub Macro1 () MsgBox "Xin chào thế giới!" Kết thúc Sub Sub Macro2 () Gọi Module1.Macro1 End Sub 

Với thông số

Phương pháp này giống hệt nhau. Chỉ cần thêm các tham số trong ngoặc đơn:

Với câu lệnh

 Sub Macro1 (Nb1 As Long, Nb2 As Long) Range ("A1") = Nb1 Range ("A2") = Nb2 End Sub Sub Macro2 () Gọi Macro1 (18254, 654897) End Sub 

Không có câu lệnh

 Sub Macro1 (Nb1 As Long, Nb2 As Long) Phạm vi ("A1") = Nb1 Range ("A2") = Nb2 End Sub Sub Macro2 () Macro1 18254321, 654897 End Sub 

Nếu các macro nằm trong các mô-đun khác nhau:

 Sub Macro2 () Gọi Module1.Macro1 (918254321, 654897) Kết thúc Sub 

Gọi một chức năng từ một phụ

Một chức năng là gì? Điều gì phân biệt một chức năng từ một Sub? Hàm là một lệnh trả về giá trị dựa trên các tham số cụ thể. Một Sub cũng là một lệnh phụ thuộc vào các tham số (nếu có), nhưng nó không trả về bất kỳ giá trị nào.

Ví dụ về chức năng:

 Bổ sung chức năng (Nb1 là gấp đôi, Nb2 là gấp đôi) Là bổ sung kép = Nb1 + Nb2 Chức năng kết thúc 

Trong ví dụ này, hàm được khai báo là "As Double" (khai báo kiểu này là tùy chọn.) Giá trị mà nó trả về sẽ thuộc loại Double. Cho rằng hàm trả về một giá trị, bạn sẽ cần cung cấp lưu trữ giá trị này trong Sub gọi. Đây có thể là một ô Excel, một biến, một điều khiển, v.v ...

 Sub Macro2 () Dim Somme As Double Somme = Bổ sung (1234.56, 654.32) MsgBox Somme Kết thúc chức năng phụ (Nb1 As Double, Nb2 As Double) Như chức năng kết thúc kép = Nb1 + Nb2 

Nb: Các tham số được đặt trong dấu ngoặc đơn và phân tách bằng dấu phẩy.

Gọi một chức năng từ một chức năng

Chúng tôi sẽ sử dụng cùng một nguyên tắc!

Sử dụng một biến trung gian

Trong ví dụ này, chúng tôi sẽ lưu trữ kết quả trong một biến trung gian:

 Sub Macro2 () Dim Somme As Double Somme = Addition (1234.56, 654.32) MsgBox Somme End Bổ sung chức năng phụ (Nb1 As Double, Nb2 As Double) As Double Dim VarNb As Double VarNb = MultiplieParDeux (Nb2 Chức năng MultiplieParDeux (Nb As Double) Là Double MultiplieParDeux = Nb * 2 Chức năng kết thúc 

Không sử dụng biến trung gian:

 Sub Macro2 () Dim Somme As Double Somme = Bổ sung (1234.56, 654.32) MsgBox Somme End Bổ sung chức năng phụ (Nb1 As Double, Nb2 As Double) As Double Add = Nb1 + MultiplieParDeux (Nb2) Chức năng kết thúc nhân đôi Như Double MultiplieParDeux = Nb * 2 Chức năng kết thúc 

Gọi một thủ tục sự kiện

Thủ tục sự kiện là gì? Một thủ tục sự kiện là một câu lệnh được tự động kích hoạt khi người dùng tương tác với một đối tượng cụ thể. Đối tượng có thể là trang tính, sổ làm việc, điều khiển ... Ví dụ về các sự kiện: mở hoặc đóng sổ làm việc, thay đổi trang tính, chọn từ danh sách, nhập vào điều khiển, v.v.

Thí dụ:

Người dùng thay đổi giá trị của ô A1: "pas mal" sẽ được hiển thị trong B1 nếu A1 lớn hơn 10.

=== Thực hiện: ====

  • Chọn tờ
  • Nhấp chuột phải vào tab tờ / Xem mã.
  • Trong cửa sổ mã, chèn như sau:

 Private Sub Worksheet_Change (ByVal Target As Range) 'Si la cellule careée par le changement n'a pas pour adresse A1 => on quitte If Target.Address "$ A $ 1" Sau đó Thoát Sub' Si la cellule (donc A1) est> 10 alors tại chỗ "Pas mal!" vi B1 Nếu Target.Value> 10 Then Target. Offerset (0, 1) = "Pas mal!" Else Target. Offerset (0, 1) = "Pas khủng!" Kết thúc phụ 

Với câu lệnh

Nếu thủ tục được gọi nằm trong cùng mô-đun với quy trình sự kiện của bạn:

 Private Sub Worksheet_Change (ByVal Target As Range) 'Si la cellule careée par le changement n'a pas pour adresse A1 => on quitte If Target.Address "$ A $ 1" Sau đó Thoát Sub' Si la cellule (donc A1) est> 10 alors tại chỗ "Pas mal!" vi B1 Nếu Target.Value> 10 Then Target. Offerset (0, 1) = "Pas mal!" Else Target. Offerset (0, 1) = "Pas khủng!" End Sub Sub MaMacro () Dim monRange As Range Set monRange = Sheets ("Feuil1"). Range ("A1") Gọi Worksheet_Change (monRange) End Sub 

Theo khuyết điểm, nếu quy trình gọi không nằm trong cùng một mô-đun, bạn sẽ gặp lỗi sau:

  • Lỗi biên dịch: Sub hoặc Hàm không được xác định

VBA không thể truy cập vào thủ tục sự kiện. Để khắc phục điều này:

Hàm CallByName

Cú pháp: CallByName (Objet, NomProcédure, TypeAppel, Args ())
  • Objet: Bắt buộc. Thuộc loại Đối tượng. Chỉ định đối tượng tham gia vào thủ tục.
  • NomProcédure: Bắt buộc. Chuỗi. Tên của thủ tục được gọi.
  • TypeAppel: Bắt buộc. CallType: Phương thức, Đặt, Cho hoặc Nhận.
  • Luận điểm (): Tùy chọn. Các tham số được truyền cho hàm được gọi.

Trong ví dụ của chúng tôi, chúng tôi sẽ đặt maMacro trong Module1 và thử gọi Worksheet_Change Sub. Nhưng trước tiên, cần phải khai báo thủ tục sự kiện của chúng tôi (khi được khai báo là riêng tư, nó không thể được sử dụng trong mô-đun).

 Sub Worksheet_Change (ByVal Target As Range) 'Si la cellule careée par le changement n'a pas pour adresse A1 => on quitte If Target.Address "$ A $ 1" Sau đó Thoát Sub' Si la cellule (donc A1) est> 10 alors tại chỗ "Pas mal!" vi B1 Nếu Target.Value> 10 Then Target. Offerset (0, 1) = "Pas mal!" Else Target. Offerset (0, 1) = "Pas khủng!" Kết thúc phụ 

Bây giờ đặt MyMacro Sub trong Module 2.

 Sub MaMacro () Dim monRange As Range Set monRange = Sheets ("Feuil1"). Range ("A1") CallByName Worksheet ("Feuil1"), "Worksheet_Change", VbMethod, monRange End Sub 

Một vi dụ khac:

Khi nhấp vào nút trong UserForm (UserForm2), kích hoạt sự kiện Combobox1_Change trong UserForm1 ...

 Lệnh phụ riêng tưButton1_Click () CallByName UserForm1, "ComboBox1_Change", VbMethod End Sub 

Gọi một thủ tục trong một sổ làm việc khác

Chúng tôi sẽ sử dụng phương thức Run. Nó sẽ được chỉ định, bao gồm sổ làm việc có chứa thủ tục được gọi và tên của thủ tục.

Gọi một Sub

Trường hợp 1: Tập tin đã được mở. Trong trường hợp này, không cần chỉ định đường dẫn:

 Ứng dụng Sub TestRun () .Run "'Classeur1.xlsm'! Module2.Macro2" End Sub 

Trường hợp 2: Tập tin bị đóng. Trong trường hợp này, đường dẫn đầy đủ phải được chỉ định:

 Ứng dụng Sub TestRun () .Run "'C: \ Users \ franck \ Desktop \ Classeur1.xlsm'! Module2.Macro2" End Sub 

Gọi một chức năng

Khi gọi một hàm từ cùng một sổ làm việc, bạn sẽ cần một biến để lưu giá trị trả về. Một biến số. Chúng ta cũng sẽ phải truyền đạt tất cả các tham số được truyền đến hàm từ Sub gọi.

Chúng tôi sẽ sử dụng Hàm bổ sung có trong Classeur1.xlsm:

 Bổ sung chức năng (Nb1 là gấp đôi, Nb2 là gấp đôi) Là bổ sung kép = Nb1 + Nb2 Chức năng kết thúc 

Để gọi thủ tục chính của chúng tôi [Nguyên tắc ()] trong sổ làm việc [Classeur2.xlsm], chúng tôi cần mã sau đây:

Sổ làm việc đã được mở

 Nguyên tắc phụ () Dim Somme As Double Somme = Run ("'Classeur1.xlsm'! Module2.Addition", 1234.56, 654.32) MsgBox Somme End Sub 

Sổ làm việc đã đóng

 Nguyên tắc phụ () Dim Somme As Double Somme = Run ("'C: \ Users \ franck \ Desktop \ Classeur1.xlsm'! Module2.Addition", 1234.56, 654.32) MsgBox Somme End Sub 

Lưu ý: Nếu sổ làm việc của bạn đã bị đóng trước đó, nó sẽ mở sau khi thực hiện macro. Vì vậy, hãy nhớ đóng lại ... sử dụng mã!

 Sub TestRun () Dim Somme As Double Somme = Run ("'Classeur1.xlsm'! Module2.Addition", 1234.56, 654.32) Workbook ("Classeur1.xlsm"). Đóng Sai MsgBox Somme End Sub 
Bài TrướC TiếP Theo Bài ViếT

Lên Trên LờI Khuyên