Đây là một trong những câu hỏi được hỏi nhiều nhất trong các cuộc phỏng vấn VBA. Trong bài viết này, chúng ta sẽ tìm hiểu sự khác biệt giữa đối số ByVal và ByRef trong excel VBA.

Định nghĩa:

Đối số ByRef: Nó là dạng rút gọn theo nghĩa đen của tham chiếu. Khi một đối số được chuyển dưới dạng đối số ByRef đến một hàm con hoặc hàm khác, tham chiếu của biến thực tế sẽ được gửi. Bất kỳ thay đổi nào được thực hiện đối với bản sao của biến, sẽ phản ánh trong đối số gốc.

Chúng ta có thể nói rằng, thay vì giá trị, vị trí của giá trị được gửi đến hàm bằng ByRef tới một hàm.

Đây là đối số mặc định trong VBA. Chúng ta không cần viết ByRef trước đối số.

Cú pháp:

Sub x (a as Variant)

‘Hoặc Sub x (ByRef a as Variant)

Đối số ByVal: Nó là một dạng rút gọn theo nghĩa đen của giá trị. Khi một đối số được truyền dưới dạng đối số ByVal đến một hàm con hoặc hàm khác, chỉ giá trị của đối số được gửi. Đối số ban đầu được giữ nguyên. Bất kỳ thay đổi nào được thực hiện trong chức năng hoặc phụ nước ngoài sẽ không phản ánh trong đối số ban đầu.

Để khai báo một đối số là ByVal, bạn cần sử dụng từ khóa ByVal trước đối số.

Cú pháp:

Sub x (ByVal a as Variant)

Bây giờ chúng ta biết các định nghĩa. Hãy xem một ví dụ và vượt qua nó.

Ví dụ về ByRef Đây là một chương trình đơn giản.

Sub X(ByRef a As Variant)

a = 20

Debug.Print "in sub X value of a = " & a

End Sub

Sub Y()

a = 10

Call X(a)

Debug.Print "in sub Y value of a = " & a

End Sub

Vì vậy, ở đây chúng ta có hai chương trình con. Con đầu tiên là X nhận đối số biến thể là ByRef. (Bạn có thể bỏ qua từ khóa ByRef. Đây là từ khóa mặc định.)

Tiếp theo, nó đang đặt giá trị của a = 20 end sau đó in ra giá trị của a.

Sub Y là chương trình con chính gọi chương trình con X. Nó đặt giá trị a = 10 sau đó gọi chương trình con X và passa là anargument.

Sau đó, nó in giá trị của a trong Y.

Bây giờ khi bạn chạy Sub Y, đây là đầu ra bạn nhận được.

giá trị phụ X là a = 20 trong giá trị phụ Y là a = 20

0046

Kết luận: Giá trị của a ban đầu được thay đổi bởi con X và được đặt thành 20 cho cả hai con. bạn có thể thấy rằng khi Sub Y chạy, giá trị ban đầu của a là 10. Y gọi X (a). X đặt giá trị a = 20. Nó in ra “giá trị phụ X của a = 20”.

Điều khiển quay trở lại y và in ra giá trị phụ Y là a = 20.

Đây là tác dụng của đối số ByRef.

ByVal Ví dụ:

Đây là một ví dụ ByVal

Sub X(ByVal a As Variant)

a = 20

Debug.Print "in sub X value of a = " & a

End Sub

Sub Y()

a = 10

Call X(a)

Debug.Print "in sub Y value of a = " & a

End Sub

Cả hai ví dụ đều giống nhau với sự khác biệt duy nhất là truyền đối số.

Ở đây trong X, các đối số được khai báo là ByVal. Khi bạn chạy chương trình con Y lần này, kết quả đầu ra là:

giá trị phụ X là a = 20 trong giá trị phụ Y là a = 10

0047

Kết luận: Giá trị của a gốc KHÔNG bị thay đổi bởi con X. Nó là 20 cho X và 10 cho Y. Khi Y gọi X với a, nó chỉ gửi giá trị của a chứ không phải địa chỉ của a.

Do đó, bất kỳ thay đổi nào được thực hiện trong a không được phản ánh trong biến ban đầu.

Để kiểm tra, nếu giá trị in của a trong X trước khi đặt thành 20, nó sẽ in ra 10. Vì giá trị 10 được chuyển đến a trong X bằng byVal. Sử dụng ByRef, bạn đã gửi một trong số Y đến một trong số X.

0048

Đó là một câu hỏi dễ, nhưng nhiều người trong chúng ta nhầm lẫn điều này, trong câu hỏi phỏng vấn vba. Lý do là chúng tôi không sử dụng nó nhiều. Hầu hết thời gian chúng tôi sao chép giá trị trong biến khác nhau. * Vì vậy, các bạn, đây là sự khác biệt giữa các đối số ByRef và ByVal trong excel VBA. Hãy cho tôi biết, nếu bạn có bất kỳ nghi ngờ nào về chủ đề này hoặc bất kỳ chủ đề VBA hoặc Excel nào khác. Phần bình luận là của bạn.

Bài viết liên quan:

Bài viết phổ biến: