Khai báo họ bên ngoài thủ tục con, như thế này:
Public wbA as Workbook
Public wbB as Workbook
Sub MySubRoutine()
Set wbA = Workbooks.Open("C:\file.xlsx")
Set wbB = Workbooks.Open("C:\file2.xlsx")
OtherSubRoutine
End Sub
Sub OtherSubRoutine()
MsgBox wbA.Name, vbInformation
End Sub
Cách khác, bạn có thể vượt qua các biến giữa chương trình con:
Sub MySubRoutine()
Dim wbA as Workbook
Dim wbB as Workbook
Set wbA = Workbooks.Open("C:\file.xlsx")
Set wbB = Workbooks.Open("C:\file2.xlsx")
OtherSubRoutine wbA, wbB
End Sub
Sub OtherSubRoutine(wb1 as Workbook, wb2 as Workbook)
MsgBox wb1.Name, vbInformation
MsgBox wb2.Name, vbInformation
End Sub
Hoặc sử dụng Functions
-trở lại giá trị:
Sub MySubroutine()
Dim i as Long
i = MyFunction()
MsgBox i
End Sub
Function MyFunction()
'Lots of code that does something
Dim x As Integer, y as Double
For x = 1 to 1000
'Lots of code that does something
Next
MyFunction = y
End Function
Trong th phương pháp thứ hai, trong phạm vi OtherSubRoutine
bạn tham chiếu đến chúng bằng tên thông số wb1
và wb2
. Các biến được truyền không cần sử dụng cùng tên, chỉ các kiểu biến tương tự. Điều này cho phép bạn tự do, ví dụ bạn có một vòng lặp trên nhiều sổ làm việc và bạn có thể gửi mỗi sổ làm việc cho một chương trình con để thực hiện một số hành động trên Sổ làm việc đó mà không cần thực hiện tất cả (hoặc bất kỳ) biến nào trong phạm vi công cộng.
Lưu ý Về tài Forms
Cá nhân tôi muốn giới thiệu giữOption Explicit
trong tất cả các mô-đun và các hình thức của bạn (điều này ngăn cản bạn từ instantiating biến với lỗi chính tả trong tên của họ, giống như lCoutn
khi bạn có nghĩa là lCount
vv ., trong số các lý do khác).
Nếu bạn đang sử dụng Option Explicit
(mà bạn nên), sau đó bạn nên đủ điều kiện biến mô-đun-chỉnh phạm vi cho phong cách và để tránh sự mơ hồ, và bạn phải đủ điều kiện sử dụng hình thức Public
scoped biến, vì đây là những không "công khai" theo cùng nghĩa. Ví dụ, i
là undefined, mặc dù nó là Public
trong phạm vi của UserForm1
:
Bạn có thể tham khảo nó như UserForm1.i
để tránh những lỗi biên dịch, hoặc kể từ khi hình thức là New
-able, bạn có thể tạo ra một biến đối tượng chứa tham chiếu đến hình thức của bạn, và tham khảo nó như vậy:
NB: Trong ảnh chụp màn hình trên x
được khai báo Public x as Long
trong một mô-đun mã tiêu chuẩn khác và sẽ không làm tăng lỗi biên dịch. Có thể thích hợp hơn khi tham chiếu đến điều này là Module2.x
để tránh sự mơ hồ và có thể bị che khuất trong trường hợp bạn sử dụng lại tên biến ...
+1: Có thể muốn đề cập đến điều này hoạt động cho 'Công khai' trong Mô-đun. 'Công khai' trong các Lớp, Biểu mẫu và Bảng tính phức tạp hơn một chút. – RBarryYoung
Tôi đã gặp sự cố với điều này trong khi gỡ lỗi - VBA vẫn nói với tôi rằng tôi đã có biến không khai báo. Tôi đã phải loại bỏ Option Explicit khỏi các biểu mẫu và mô-đun của tôi và chỉ xác định biến Công khai ở một vị trí. Có lẽ rất cơ bản, nhưng tôi chưa bao giờ sử dụng một biến trong 12 userforms và 2 mô-đun cùng một lúc trước đây. – TheFontSnob
@ TheFontSnob có, như bạn đã phát hiện có một số hạn chế (@RBarryYoung gợi ý ở trên). Cá nhân tôi khuyên bạn nên * giữ * 'Option Explicit' trong tất cả các mô-đun và biểu mẫu của bạn (điều này ngăn cản bạn tạo các biến với các lỗi chính tả trong tên của chúng, như' lCoutn' khi bạn có nghĩa là 'lCount', v.v.). Nếu bạn đang sử dụng 'Option Explicit' (mà bạn ** nên **), thì bạn nên hội đủ điều kiện biến mô-đun cho phong cách, và bạn ** phải ** đủ điều kiện biến dạng phạm vi người dùng, vì đây không phải là" công khai "trong cùng một nghĩa. –