VBA ByVal - Làm thế nào để sử dụng ByVal Function Argument? (Ví dụ)

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

ByVal là một câu lệnh trong VBA. ByVal là viết tắt của By Value tức là khi quy trình con được gọi vào từ thủ tục thì giá trị của các biến được đặt lại thành giá trị mới từ thủ tục mới được gọi vào.

Trong VBA, khi chúng ta làm việc với các hàm được gọi trong các hàm khác nhau, có những trường hợp nhất định mà giá trị của đối số ban đầu bị thay đổi khi hàm đang được gọi; câu lệnh byval cấm thủ tục hoặc mã thay đổi giá trị cho đối số.

Tôi biết nó không dễ hiểu bằng cách đọc phần giải thích, nhưng với các ví dụ thực tế về chức năng, chúng ta thực sự có thể hiểu rõ hơn.

Làm thế nào để sử dụng ByVal Argument trong VBA?

Ví dụ 1

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

Mã:

Sub Macro1 () Dim k As Integer k = 50 Macro2 k MsgBox k End Sub
Sub Macro2 (ByVal k As Integer) k = k + 5 End Sub

Trong hai thủ tục vĩ mô trên, chúng ta có một biến chung “k” giữa các thủ tục. Hãy để tôi giải thích chi tiết điều này trước khi chúng ta xem kết quả.

Trong Macro đầu tiên, chúng tôi đã gán giá trị 50 cho biến “k”.

Dim k As Integer k = 50

Tiếp theo, chúng ta đã gọi thủ tục macro thứ hai từ Macro đầu tiên.

Macro2 k

Trong Macro2, chúng tôi đã đặt lại giá trị của biến thành k = k + 5. Trong macro này, chúng tôi đã sử dụng đối số ByVal để gán giá trị cho biến “k”.

Bây giờ để hiểu “ByVal”, hãy chạy từng dòng mã VBA bằng cách nhấn phím F8.

# 1 - Khi nhấn phím F8 trước tiên, nó sẽ tô sáng dòng đầu tiên của Macro1.

Tại thời điểm này, hãy đặt con trỏ vào biến “k” và nó sẽ hiển thị giá trị của biến “k”.

Hiện tại, giá trị của “k” bằng không.

# 2 - Nhấn phím F8 một lần nữa, và nó sẽ chuyển sang dòng thứ ba.

Ngay cả bây giờ, giá trị của “k” vẫn bằng không.

# 3 - Nhấn phím F8 ngay bây giờ và xem giá trị của k.

Vì giá trị “k” được đặt thành 50 và mã được thực thi nên giá trị hiển thị là 50.

# 4 - Bây giờ, dòng được tô sáng là “Macro2 k”, tức là bằng cách nhấn phím F8, nó sẽ chuyển sang quy trình thứ hai, Macro2.

# 5 - Ngay cả bây giờ, giá trị của biến “k” trong quy trình này cũng hiển thị là 50. Nhưng bên trong macro này, chúng tôi đang đặt lại giá trị của biến “k” là k = k + 5 tức là, 55. Bây giờ hãy nhấn Phím F8 thêm hai lần nữa.

Như bạn thấy ở trên, giá trị “k” bây giờ là 55.

# 6 - Nhấn phím F8 và nó sẽ quay lại quy trình Macro1.

Khi macro quay trở lại thủ tục ban đầu Macro1, giá trị biến “k” của chúng ta không còn là 55 nữa mà là giá trị ban đầu trong thủ tục này, tức là, 50.

Khi bạn nhấn phím F8, chúng ta chỉ có thể thấy 50 trong hộp thông báo trong VBA.

Vì vậy, như chúng ta đã nói ở phần đầu của bài viết, đối số "ByVal" không mang giá trị từ thủ tục này sang thủ tục khác, mặc dù nó mang giá trị của biến từ macro đầu tiên sang macro thứ hai tại thời điểm nó gặp dòng " ByVal ”khi nó quay trở lại macro ban đầu, nó chỉ đặt lại giá trị thành giá trị ban đầu trong thủ tục.

Ví dụ số 2

Bây giờ hãy xem hai macro dưới đây.

Mã:

Sub P1 () Dim k As Integer: k = 10 Gọi P2 (k) MsgBox k End Sub
Sub P2 (ByVal k As Integer) k = 15 End Sub
  • Điều này tương tự như ví dụ đầu tiên. Trong macro “P1”, chúng tôi đã gán giá trị 10 cho biến “k” và trong cùng một macro “P1”, chúng tôi đã gọi macro thứ hai là “P2” với biến “k”.
  • Trong macro thứ hai “P2”, chúng tôi đã sử dụng đối số ByVal và lần này, giá trị của biến “k” là 15.

Macro này mang giá trị của biến “k” là mười từ macro “P1” đến macro “P2” và trong macro này, giá trị sẽ được đặt lại thành 15, nhưng thời điểm nó quay lại để kết thúc macro thành macro đầu tiên “P1” giá trị của “k” trở lại 10, không phải 15.

Những điều cần ghi nhớ

Đối số ByVal không ảnh hưởng đến giá trị biến ngay cả sau khi chạy macro, nhưng với đối số By Ref, chúng ta có thể mang giá trị của biến từ macro này sang macro khác.

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