VBA ByRef - Truyền đối số bằng hàm ByRef trong Excel VBA

Đối số hàm ByRef trong Excel VBA

ByRef trong VBA là một hàm được gọi dưới dạng tham chiếu trong đó chúng tôi cung cấp tham chiếu đến bất kỳ đối số nào trong mã của chúng tôi, khi chúng tôi tạo các hàm tùy chỉnh và chúng tôi muốn sử dụng giá trị của bất kỳ biến nào được xác định trước đó trước hàm mà chúng tôi sử dụng hàm ByRef, cú pháp để sử dụng rất đơn giản như Chức năng Tên-Tên (Biến ByRef làm Kiểu dữ liệu).

Bằng cách sử dụng Byref, chúng ta có thể trỏ đến giá trị biến ban đầu mà không làm thay đổi giá trị biến. Điều này giống như việc truyền trực tiếp giá trị biến đến quy trình con VBA hoặc hàm VBA.

Làm thế nào để vượt qua đối số bằng VBA ByRef Argument?

Ví dụ 1

Ví dụ, hãy xem mã VBA bên dưới.

Mã 1:

Thủ tục con 1 () Dim k As Integer k = 50 Thủ tục2 k MsgBox k End Sub

Mã 2:

Thủ tục con 2 (ByRef k As Integer) k = k + 10 End Sub

Trong thủ tục đầu tiên, tôi đã khai báo biến “k” là Số nguyên.

Sau đó, tôi đã gán giá trị cho biến này là 50.

Sau đó, tôi đã thêm một dòng mới tức là

Thủ tục2 k

Đây là tên thủ tục thứ hai. Trong thủ tục này, tôi đã khai báo biến trong ngoặc đơn là Chuỗi trong VBA, nhưng tôi đã sử dụng từ “ByRef”.

ByRef k As Integer

Ở đây tôi đã gán giá trị của biến “k” là

k = k + 10

Ok, bây giờ tôi sẽ chạy mã từng bước bằng cách nhấn phím F8.

Nhấn phím F8 hai lần nữa và đặt con trỏ vào biến “k” để xem giá trị của biến “k”.

Vì chúng ta đã gán giá trị là 50 nên nó đang hiển thị giá trị là 50. Bây giờ nó đã đánh dấu dòng Thủ tục2 k, là tên thủ tục thứ hai.

Nếu tôi nhấn phím F8 bây giờ, nó sẽ nhảy ra khỏi quy trình hiện tại và chuyển sang quy trình thứ hai.

Bây giờ vì chúng ta đã sử dụng ByRef word, nó mang giá trị biến “k” từ quy trình trên.

Nhấn phím F8 hai lần. Nó sẽ quay trở lại quy trình con trước đó. Nếu bạn nhận thấy trong quy trình thứ hai, tôi đã áp dụng công thức là k = k + 10. tức là, giá trị “k” là 50 thì thêm 10 nữa vào đó tức là tổng cộng là 60.

Bây giờ mã đang chạy trong thủ tục đầu tiên và trong thủ tục này, giá trị của biến “k” là 50. Nhưng hãy nhấn phím F8 và xem kết quả trong một hộp thông báo.

Chúng tôi nhận được kết quả là 60 thay vì giá trị mặc định là 50 trong quy trình này.

Lý do tại sao chúng tôi nhận được 60 bởi vì, trong quy trình thứ hai, chúng tôi đã áp dụng "ByRef" nên nó mang kết quả phương trình (k = k + 10) cho quy trình hiện tại.

Ở đây, giá trị “k” của biến đầu tiên là 50, và trong biến thủ tục thứ hai, giá trị “k” là k + 10 tức là 60, được chuyển đến thủ tục đầu tiên.

Trong quy trình đầu tiên, giá trị ban đầu của biến “k” là 50, vì vậy By Ref đã thay đổi giá trị ban đầu từ 50 thành 60 bằng cách thực hiện phương trình k = k + 10 tức là k = 50 +10 = 60.

Ví dụ số 2

Bây giờ hãy xem thêm một ví dụ.

Mã 1:

Sub P1 () Dim MyNumber As Long MyNumber = 1 Call Change_ByRef (MyNumber) 'MyNumber được thay đổi bằng thủ tục Change_ByRef MsgBox "My Number is now:" & MyNumber End Sub


Mã 2:

Sub Change_ByRef (ByRef NewNumber As Long) NewNumber = 14 End Sub

Điều này hoạt động chính xác giống như mã trước đó.

Ban đầu, giá trị của biến “MyNumber” là 1. Sau đó, chúng tôi gọi thủ tục dưới đây bằng tên của nó

Gọi Change_ByRef (MyNumber)

Trong thủ tục đó, giá trị của biến là 14.

Vì vậy, khi quay lại quy trình trước đó, nó sẽ gán giá trị mới cho biến là 14.

thú vị bài viết...