Sử dụng Byval để làm gì?

  • Thread starter Thread starter ST-Lu!
  • Ngày gửi Ngày gửi
Liên hệ QC

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Em có test 1 như sau

PHP:
Sub number()
n1 = 10
n2 = 20
MsgBox "Number n1 is " & n1 & Chr(13) & "Number n2 is " & n2
MsgBox " Average of n1, n2 is " & Avg(n1, n2)
End Sub
Function Avg(Byval n1, ByVal n2)
n1 = n1 + 10
Avg = (n1 + n2) / 2

End Function
----------
Em có Test 2 như sau
PHP:
Sub number()
n1 = 10
n2 = 20
MsgBox "Number n1 is " & n1 & Chr(13) & "Number n2 is " & n2
MsgBox " Average of n1, n2 is " & Avg(n1, n2)
End Sub
Function Avg(n1,  n2)
n1 = n1 + 10
Avg = (n1 + n2) / 2

End Function

Em đọc thấy Byval là từ khoá sẽ nhớ lại giá của biến (không làm biến bị thay đổi)
nhưng sao em test 1 có byval --> chạy test 1 --> mgsbox cho kết quả
+ n1 = 10
+ n2 = 20
Nhưng đến test 2 thì
+ n1 = 10
+ n2 = 20

Tại sao vậy?
 
ByVal là xác đinh kiểu giá trị của biến. Ví dụ
PHP:
Function MsgBoxUni(ByVal PromptUni As Variant, Optional ByVal Buttons As VbMsgBoxStyle = vbOKOnly, Optional ByVal TitleUni As Variant = vbNullString) As VbMsgBoxResult
........
End Function
 
Upvote 0
to ST-Lu!:
Bạn tham khảo bài Hướng dẫn truyền tham số bằng giá trị (ByVal) Bạn xem 2 ví dụ sau:

Ví dụ 1: truyền tham số ByVAl
Mã:
Sub number1()
n1 = 10
n2 = 20
MsgBox "n1=" & n1 & Chr(13) & "n2=" & n2 & Chr(13) & "Avg=" & Avg1(n1, n2)
End Sub
Mã:
Function Avg1(ByVal n1, ByVal n2)
n1 = n1 + 30
Avg1 = (n1 + n2) / 2
End Function
Khi Avg1 tính, n1=n1+30=40, giá trị n1=40 không được trả về cho sub number1 và MsgBox " Average of " & n1 & ", " & n2 & " is " & Avg1(n1, n2) cho kết quả:
n1=10
n2=20
Avg=30


Ví dụ 2: truyền tham số ngầm định (ByRef)
Mã:
Sub number2()
n1 = 10
n2 = 20
MsgBox "n1=" & n1 & Chr(13) & "n2=" & n2 & Chr(13) & "Avg=" & Avg2(n1, n2)
End Sub
Mã:
Function Avg2(n1, n2)
n1 = n1 + 30
Avg2 = (n1 + n2) / 2
End Function
Khi Avg2 tính, n1=40 được trả về cho sub number2 và MsgBox cho kết quả:
n1=40
n2=20
Avg=30


Có nghĩa là khi truyền tham số ByVal cho các hàm, thủ tục khác xử lý tiếp, tham số có thể bị thay đổi. Nhưng khi trả tham số về nơi truyền nó, giá trị vẩn không thay đổi.
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
to ST-Lu!:

Ví dụ 2: truyền tham số ngầm định (ByRef)
Mã:
Sub number2()
n1 = 10
n2 = 20
MsgBox "n1=" & n1 & Chr(13) & "n2=" & n2 & Chr(13) & "Avg=" & Avg2(n1, n2)
End Sub
Mã:
Function Avg2(n1, n2)
[B]n1 = n1 + 30
Avg2 = (n1 + n2) / 2[/B]
End Function
Khi Avg2 tính, n1=40 được trả về cho sub number2 và MsgBox cho kết quả:
n1=40
n2=20
Avg=30


Có nghĩa là khi truyền tham số ByVal cho các hàm, thủ tục khác xử lý tiếp, tham số có thể bị thay đổi. Nhưng khi trả tham số về nơi truyền nó, giá trị vẩn không thay đổi.

Em đã làm và test thử rồi
ở ví dụ 2 Msgbox vẫn là n1 vẫn là 10 --> đây là ý em muốn hỏi tại sao lại như vậy?
 
Upvote 0
Em đã làm và test thử rồi
ở ví dụ 2 Msgbox vẫn là n1 vẫn là 10 --> đây là ý em muốn hỏi tại sao lại như vậy?
Sao vậy? Tôi chạy number1 và number2 ra 2 kết quả:


ByVal.jpg
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom