Không hẳn đúng. Nói là bớt thì đúng hơn.
Trong các Sub/Function cần sử dụng Uname thì phải xoá cái dòng Dim Uname đi.
Cứ thử sẽ biết ngay: thường thì người ta viết Uname()
Hầu hết các phiên bản BASIC đều cho phép gọi tên hàm/sub mà không cần dấu ngoặc.
Người ta sẽ veiets Uname và không viết Uname() nếu người ta muốn tự giữ trường hợp về sau này đổi ý, dùng Uname theo biến nội trong Sub.
Thường thì lúc đó, người ta sẽ viết thêm một hàm Private để gọi hàm Uname() kia. Trường hợp này tôi đã đề cập trước đây; tức là tuỳ theo mức độ "hằng" của thông số uname. (nếu hàm Uname luôn luôn trả về 1 trị thì nó coi như hằng, nếu nó có thay đổi, ví dụ nó đọc trị từ đâu đó, thì đương nhiên phải coi nó là biến)
Tôi nghĩ là bạn đang bị luẩn quẩn giữa biến với hàm.
...
Không hẳn thớt bị lẩn quẩn biến với hàm. Theo tôi thì thớt bị lẫn lộn do một tính chất đặc biệt của ngôn ngữ BASIC: cho phép gọi hàm bằng tên, hiểu ngầm hai dấu ngoặc. Người đề nghị dùng Uname như hàm đã lợi dụng tính chất này để đơn giản hoá ách áp dụng vào code có sẵn của thớt. Chỉ là:
Yêu cầu của thớt
"giảm thiểu những dòng code lặp lại trong các sub's" đòi hỏi phải có hiểu biết căn bản về
tầm vực của các tên gọi (scope of identifiers).
Để có thể dùng Uname mà không phải lặp lại code khai báo và gán trị trong các sub's thì bắt buộc Uname phải có tầm vực toàn cục (global). Và có ba cách để thực hiện:
1. khai báo nó là hằng (const) toàn cục. Cách này chỉ thực hiện được khi nó là hằng.
2. cách khai báo nó như một biến toàn cục. Và dùng một mô đun chung nào đó để gán trị. Cách này hơi rắc rối ở chỗ gán trị.
3. cách dụng nó thành một hàm để tự lấy trị.
Tôi đã từng giải thích việc lợi hại của từng cách rồi. Nhắc lại ở đây chỉ thừa.
...Cách thông thường tôi hay làm đối với việc tham chiếu Username và Password là:
- Mở một module (vd: modUserPass), khai báo biến toàn cục cho User, Pass, Level. Sau đó viết hàm để lấy User/Pass/Level như bạn Hesanbi đã hướng dẫn.
...
1. mở riêng một mô đun cho biến toàn cục là mọt cách quản lý tầm vực biến/hằng rất hay. Nhưng nó chỉ hay khi người dùng luôn luôn tiền tố các biến/hằng với tên mô đun. Ví dụ: ModuleX.Uname. Rất tiếc là trong VBA, biến toàn cục luôn luôn là toàn cục. Bạn không có cách nào buộc ngừoi viết code phải tiền tố như vậy. Cách người ta khuyên dùng là tự tiền tố các biến ấy. Ví dụ:
Trong Module GLOBAL_1:
Public G1_Uname As String
Đại khái, khi ở mô đun khác, nhìn vào tên thì có thể đoán nó được khai báo trong Mô đun có tên G*1*...
2. Nếu các biến có cùng nhóm, có phận sự gần nhau thì nên nhóm chúng lại. Và trường hợp nhóm thì cách quản lý tốt nhất là dùng class module.
Trong trường hợp bạn có một nhóm hàm ở bài trên thì cũng nên bỏ chút thì giờ suy nghĩ "có nên dùng class module hay không?"