ByRef và ByVal truyền tham chiếu và giá trị trong VBA

Cdoe vba về ByRef và ByVal truyền tham chiếu và giá trị trong VBA

  1. ByRef và ByVal là gì
  2. Cách sử dụng dụng ByRef, truyền theo tham chiếu
  3. Cách sử dụng ByVal - Truyền theo giá trị
  4. Cách ví dụ về byVal và byref trong VBA Access

1. ByRef và ByVal là gì

Là cách truyền tham số trong hàm trong VBA nói riêng và các ngôn ngữ lập trình khác.

Trong VBA (Visual Basic for Applications), ByRef và ByVal là hai cách để truyền tham số vào một hàm hoặc thủ tục (subroutine).

Chúng xác định cách tham số được truyền vào: theo tham chiếu hoặc theo giá trị. Sự khác biệt giữa chúng có thể ảnh hưởng đến cách mà giá trị của biến được thay đổi trong hàm hoặc thủ tục đó.

2. Cách sử dụng dụng ByRef, truyền theo tham chiếu

    Khi một tham số được truyền bằng ByRef, nó sẽ truyền tham chiếu tới địa chỉ bộ nhớ của biến gốc. Điều này có nghĩa là nếu giá trị của tham số thay đổi trong hàm hoặc thủ tục, thì giá trị của biến gốc sẽ thay đổi theo.
    Dùng ByRef khi bạn muốn thay đổi giá trị của biến gốc bên ngoài hàm hoặc thủ tục.

Ví dụ:

Sub ExampleByRef()
    Dim x As Integer
    x = 5
    Call ChangeValueByRef(x)
    MsgBox x  ' Kết quả sẽ là 10
End Sub

Sub ChangeValueByRef(ByRef num As Integer)
    num = 10  ' Thay đổi giá trị của tham số, và cũng thay đổi giá trị của x
End Sub


Trong ví dụ trên, khi x được truyền vào hàm ChangeValueByRef, giá trị của x sẽ được thay đổi thành 10 vì tham số num là ByRef.

3. Cách sử dụng ByVal - Truyền theo giá trị

    Khi một tham số được truyền bằng ByVal, chỉ có giá trị của biến được sao chép và truyền vào hàm hoặc thủ tục. Mọi thay đổi trong hàm hoặc thủ tục chỉ ảnh hưởng đến bản sao của tham số, không làm thay đổi giá trị của biến gốc.
    Dùng ByVal khi bạn không muốn giá trị của biến gốc bị thay đổi trong hàm hoặc thủ tục.

Ví dụ:

Sub ExampleByVal()
    Dim x As Integer
    x = 5
    Call ChangeValueByVal(x)
    MsgBox x  ' Kết quả vẫn là 5
End Sub

Sub ChangeValueByVal(ByVal num As Integer)
    num = 10  ' Chỉ thay đổi bản sao của num, không ảnh hưởng đến x
End Sub


Trong ví dụ trên, khi x được truyền vào hàm ChangeValueByVal, giá trị của x không bị thay đổi vì tham số num là ByVal.
Tóm lại:

    ByRef: Truyền tham số theo tham chiếu, thay đổi giá trị của biến gốc bên ngoài hàm.
    ByVal: Truyền tham số theo giá trị, không thay đổi giá trị của biến gốc bên ngoài hàm.

4. Cách ví dụ về byVal và byref trong VBA Access

Ví dụ 1: có sử dụng ByRef VBA

Private Sub Command0_Click()
Dim so As Integer
so = 50
MsgBox so ' gia tri ban dau
CongThem so
MsgBox so ' dòng *
End Sub
Sub CongThem(ByRef k As Integer)
k = k + 10
End Sub

* Thông thường thì  ' dòng * sẽ in là 50, nhưng khi có byRef biến số được + 10 vì ByRef đã tham chiếu biến thay đổi giá trị

Ví dụ 2: có sử dụng ByVal VBA

Private Sub Command0_Click()
Dim so As Integer
so = 50
MsgBox so ' gia tri ban dau
CongThem so
MsgBox so ' dòng *
End Sub
Sub CongThem(ByVal k As Integer)
k = k + 10
End Sub

Kết quả là 50 chứ không giúp ví dụ 1, suy ra là khi gọi hàm hay thủ tục cần thay đổi giá trị biến truyền vào hãy sử dụng byRef

Tìm kiếm:

Bài viết liên quan:

Cdoe vba về ByRef và ByVal truyền tham chiếu và giá trị trong VBA