Khi nao marco trong module hay trong sheet

Trong lập trình có cái gọi là phạm vi giới hạn (scope) của một nhân tố (entity). Mọi nhân tố đều có phạm vi của chúng.

Theo lý thuyết Lập Trình Hướng Đối Tượng áp dụng vào VBA thì một Project được coi là vùng cấp 1 (tôi tạm gọi là vùng để dễ diễn tả phạm vi, chính thức ra, tiếng nghề gọi vùng hoạt động là namespace).
Vùng cấp 1 chứa nhiều vùng cấp 2 (tức là Microsoft Excel Objects, và Modules)

Các nhân tố (định nghĩa, biến, hàm, thủ tục) mà bạn gọi là Modules nằm trong một vùng thuộc cấp 2.
Các nhân tố (định nghĩa, biến, hàm, thủ tục) mà bạn gọi là Workbook cũng nằm trong một vùng khác thuộc cấp 2.

Mỗi vùng lại có thể chia ra nhiều modules nhỏ, mỗi module nhỏ này lại có vùng riêng của chúng. Ví dụ trong Modules, chúng được mặc định là Module1, Module2, ... Nhưng nếu cần thiết, bạn vẫn có thể đặt lại tên khác cho chúng.

Luật pham vi:
Các module có tính chất riêng biệt với nhau. Mõi module là một vùng. Code của vùng được mặc định là chỉ làm việc với nhau.
Nếu code được chỉ định là private thì code ngoài vùng không thể "thấy" chúng. Ví dụ trong code Modules.Module1, bạn gọi Sub Worksheet_SelectionChange của Sheet1 thì sẽ thấy lỗi "Method or data member not found".

Nếu code (code gọi) của một vùng này muốn chỉ tới code (code được gọi) của một vùng khác thì phải thoả mãn 2 điều kiện:
1 - Điều kiện "public": code được gọi phải được khai báo là public. Từ khoá private "che" code, không cho bên ngoài vùng nhìn thấy.
2 - Điều kiện tên vùng ("namespace"): nếu có sự trùng tên thì code gọi phải cho biết mình gọi code của vùng nào, bằng cách lắp tên vùng đi trước code: tenVung.Code

Ví dụ: Code của vùng/module A muốn gọi hàm Ham1 của vùng/module B thì ghi B.Ham1, muốn nhắc tới biến Bien1 của B thì ghi B.Bien1. Và cả 2 Ham1 và Bien1 đều phải public

Như vậy, trong Module1 của Modules muốn gọi Worksheet_SelectionChange của Sheet1 thì dùng như sau:
Call Sheet1.Worksheet_SelectionChange (range gì đó)
Và phải vào Sheet1, sửa lại hàm Worksheet_SelectionChange thành public

Lưu ý: Các sự kiện của workbook, sheets, forms, ... được Excel mặc định cho gọi thẳng các hàm liên hệ. Sự kiện xảy ra trong vùng nào được coi như thuộc về vùng đó và xử lý trong vùng đó. Ví dụ selection change xảy ra ở Sheet2 thì được xử lý bằng Sheet2.Worksheet_SelectionChange. Nếu muốn nó xử lý Sheet1.Worksheet_SelectionChange thì đặt lệnh
Call Sheet1.Worksheet_SelectionChange (target)
bên trong Sheet2.Worksheet_SelectionChange