Bài Viết: Hướng Dẫn Truyền Tham Số Trong VBA (ByVal & ByRef)

Giải Pháp Excel
  • Trang chủ Có gì mới Hoạt động gần nhất Tác giả
  • Diễn đàn Tìm bài viết mới Tìm theo chuyên mục
  • Video New Video về Excel Video về tin học khác Tin tức về tin học chung
  • Thông tin mới Featured content Tìm bài mới Tài Nguyên Mới Hoạt động gần nhất
  • Tài nguyên Đánh giá mới nhất Tìm tài nguyên
  • Facebook
  • Đóng góp
Đăng nhập Đăng Ký Có gì mới? Tìm kiếm

Tìm kiếm

Mọi nơi Đề tài Diễn đàn này Đề tài này Chỉ tìm trong tiêu đề Note Bởi: Tìm kiếm Tìm nâng cao…
  • Hoạt động gần nhất
  • Đăng ký
Menu Đăng nhập Đăng Ký Install the app Install How to install the app on iOS

Follow along with the video below to see how to install our site as a web app on your home screen.

Note: This feature may not be available in some browsers.

  • Khách ơi! GPE thông tin đến bạn ấn phẩm "lập trình VBA trong Excel": - Phần cơ bản - Phần Nâng Cao - VBA trong Excel - Cải thiện và tăng tốc
  • Trang chủ
  • Bài viết nổi bật và thông báo
You are using an out of date browser. It may not display this or other websites correctly.You should upgrade or use an alternative browser. Bài viết: Hướng dẫn truyền tham số trong VBA (ByVal & ByRef) (1 người xem)
  • Thread starter Thread starter PhanTuHuong
  • Ngày gửi Ngày gửi 21/5/14
Liên hệ QC

Người dùng đang xem chủ đề này

Đang trực tuyến: 2 (Thành viên: 0, Khách: 2) PhanTuHuong

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự Tham gia 13/6/06 Bài viết 7,238 Được thích 24,781 Bài này sẽ giải thích tại sao các bạn thỉnh thoảng có thấy khai báo ByVal trước biến chứ không phải là Dim thông thường.
  • Các biến số của hàm hay thủ tục có thể bị thay đổi bởi các quy trình tính toán, điều đó cho thấy sự quan trọng của việc bảo vệ giá trị gốc của biến.
  • Mặc định VB truyền thông tin tới hàm (hoặc thủ tục) dạng tham chiếu (ByRef), để tham chiếu tới dữ liệu gốc trong biến số của hàm vào lúc hàm được gọi ra. Hơn nữa, nếu hàm làm thay đổi giá trị của biến số, giá trị gốc sẽ bị thay đổi.
ByVal_vs_ByRef.JPG
  • Bạn sẽ có được kết quả trên nếu bạn bỏ qua từ khoá ByVal đứng trước biến số num1 trong hàm MyAverage trong phần khai báo biến số.
  • Nếu bạn muốn thủ tục hàm thay đổi giá trị gốc, bạn không cần thiết phải thêm từ khoá ByRef vào, vì VB đã mặc định truyền tham số là ByRef.
  • Khi bạn sử dụng từ khoá ByVal trước tên biến số, VBA sẽ truyền tham số bằng giá trị cho biến này. Điều đó có nghĩa là VBA sẽ tạo ra một bản sao của dữ liệu gốc. Bản sao đó sẽ được truyền tới hàm. Nếu hàm thay đổi giá trị của biến số được truyền tới, giá trị gốc sẽ không thay đổi - chỉ là copy sự thay đổi đó. Điều đó giải thích tại sao khi hàm MyAverage đã thay đổi giá trị của biến num1, nhưng giá trị gốc của biến đó vẫn như cũ.
Trong một số thủ tục khi khai báo bằng Dim thông thường, Visual Basic có thể thay đổi giá trị của các biến số. Ví dụ: Mã: Sao chép. Sub Thay_doi() Dim i, Giatri As Integer Giatri = 20 'Lúc đầu thì biến Giatri là 20 For i = 1 To 4 Giatri = Giatri + 1 Next MsgBox "Gia tri bay gio la " & Giatri 'Sau 4 lần vòng lặp, Giatri có giá trị mới là 24 End Sub Để không làm thay đổi giá trị của biến số, bạn phải khai trước tên của biến số đó với từ khoá ByVal. Xem ví dụ sau để hiểu hơn: Mã: Sao chép. Sub ThreeNumbers() Dim num1 As Integer, num2 As Integer, num3 As Integer num1 = 10: num2 = 20: num3 = 30 MsgBox "Gia tri trung binh la " & MyAverage(num1, num2, num3) MsgBox "num1= " & num1 & Chr(13) & "num2= " & num2 & Chr(13) & "num3= " & num3 & Chr(13) End Sub Mã: Sao chép. Function MyAverage(ByVal num1, ByVal num2, ByVal num3) num1 = num1 + 1 MyAverage = (num1 + num2 + num3) / 3 End Function Thủ tục ThreeNumbers sẽ ấn định giá trị của ba biến số và sau đó gọi hàm MyAverage tính toán, trả về giá trị trung bình của các số đã được lưu giữ trong các biến số đó. Các đối số của hàm là những biến số num1, num2 và num3, toàn bộ tên đối số đều có từ khoá ByVal đứng trước. Thủ tục ThreeNumbers đã truyền tham số cho num1, num2, num3 của hàm MyAverage. Khi tính giá trị trung bình, hàm MyAverage đã thay đổi giá trị của biến số num1. Biến số num1 có giá trị bằng 11 (10+1) ở trong hàm. Do vậy, khi hàm tính giá trị trung bình của thủ tục ThreeNumbers, hộp thông báo MsgBox sẽ hiển thị kết quả 20.333 và chứ không phải là 20. Sau đó MsgBox sẽ hiển thị toàn bộ từng giá trị biến số. Các giá trị đó được lưu giữ là giá trị gốc ấn định cho chúng (10, 20 và 30). Việc gì sẽ xảy ra khi bạn bỏ từ khoá ByVal trước biến số num1 trong khai báo hàm MyAverage. Kết quả tính toán của hàm vẫn là giá trị trên, nhưng biến số num1 sẽ hiển thị bây giờ là 11. Hàm MyAverage trả về kết quả 20.333 và thay đổi giá trị gốc của số liệu lưu trong biến số num1. Mã: Sao chép. Function MyAverage(num1, ByVal num2, ByVal num3) num1 = num1 + 1 MyAverage = (num1 + num2 + num3) / 3 End Function Như vậy, để ngăn cản sự thay đổi giá trị cung cấp cho hàm số, bạn sử dụng từ khoá ByVal. Xem thêm: + Byval: là từ viết tắt của By Value, nghĩa là truyền bằng trị. Phương pháp này không làm thay đổi giá trị của nội dung của biến khai báo bởi từ khóa Byval + Byref: là từ viết tắt của By Reference, nghĩa là truyền bằng tham chiếu. Phương pháp này cho phép thay đổi nội dung của biến được khai báo bởi từ khóa Byref. Mục đích là nếu ta muốn trả về nhiều giá trị chứ không phải 01 thì ta dùng cách này. Nếu chỉ trả về 01 giá trị thì ta trả về giá trị của hàm thôi. Các bạn cứ xem ví dụ dưới đây sẽ hiểu rõ: Mã: Sao chép. Public Function GetDateFromString(ByVal sDate As String, _ ByRef iDay As Integer, ByRef iMonth As Integer, ByRef iYear As Integer) As Long On Error GoTo Loi Dim aDate As Date aDate = Format(sDate, "dd/mm/yyyy") iDay = Day(aDate) ' Tra ve ngay cho bien iDay iMonth = Month(aDate) ' Tra ve thang cho bien iMonth iYear = Year(aDate) ' Tra ve nam cho bien iYear GetDateFromString = 1 Exit Function Loi: GetDateFromString = 0 End Function Sub Test() Dim a As Integer, b As Integer, c As Integer If GetDateFromString("17/04/2014", a, b, c) = 1 Then MsgBox a & "-" & b & "-" & c ' Khi do cac bien a,b,c da duoc ham tra ve gia tri cua nó End If End Sub Chỉnh sửa lần cuối bởi điều hành viên: 4/9/17 Upvote 0 B

batman1

Thành viên gạo cội
Tham gia 8/9/14 Bài viết 5,776 Được thích 9,819
sieuinan đã viết: hay quá cảm ơn ạ.............. Nhấp chuột vào đây để mở rộng...
Thực ra bài viết làm hại người đọc. DIM là khai báo biến và KIỂU (type) của nó. ByVal/ByRef trong các sub/function là xác định CÁCH TRUYỀN tham số. KIỂU và CÁCH TRUYỀN tham số là 2 cái giầy khác nhau của một đôi giầy. function hichic(a, b As Long) function hichic(ByVal a, b As Long) Trong cả 2 trường hợp KIỂU là không thay đổi. a trong cả 2 trường hợp đều có KIỂU là Variant (mặc định là Variant nếu không chỉ rõ KIỂU). b trong cả 2 trường hợp có KIỂU là Long. Cái thay đổi là CÁCH TRUYỀN tham số. Trong cả 2 trường hợp b được truyền bằng địa chỉ / tham chiếu. a trong trường hợp 1 được truyền bằng địa chỉ, trong trường hợp 2 được truyền bằng giá trị. So sánh 2 khai báo thì KIỂU là không đổi, y như nhau. Chỉ có CÁCH TRUYỀN tham số là thay đổi. DIM là khai báo biến cùng với KIỂU của biến. ByVal / ByRef là khai báo / xác định CÁCH TRUYỀN tham số. 2 vấn đề khác nhau mà lại so sánh với nhau? Nếu tác giả chỉ đưa ra những ví dụ về cách truyền tham số và chỉ ra những sự khác nhau thì tôi không có gì để viết. Nhưng tác giả lại đưa cái DIM vào để so sánh thì chỉ làm rối người đọc. DIM thì liên quan gì tới cách truyền tham số? Nếu tác giả chỉ viết trên GPE thì là một chuyện, nhưng nếu viết sách mà không chính xác thì chỉ làm đầu người đọc u mê thêm . :D Lần chỉnh sửa cuối: 14/10/19 hoangtuan243

hoangtuan243

Thành viên mới
Tham gia 1/10/19 Bài viết 1 Được thích 0
PhanTuHuong đã viết: m1. Biến số num1 có g Nhấp chuột vào đây để mở rộng...
Bài đã được tự động gộp: 24/10/19 tranthanh2200

tranthanh2200

Thành viên hoạt động
Tham gia 12/1/18 Bài viết 149 Được thích 33 Donate (Momo) Donate Giới tính Nam Đọc không hiểu luôn. Cung chưa hiểu ý nghĩa thực sự của Byval và byref HeSanbi

HeSanbi

Nam Nhân✨Hiếu Lễ Nghĩa Trí Tín✨
Tham gia 24/2/13 Bài viết 2,829 Được thích 4,612 Giới tính Nam
tranthanh2200 đã viết: Đọc không hiểu luôn. Cung chưa hiểu ý nghĩa thực sự của Byval và byref Nhấp chuột vào đây để mở rộng...
Đơn giản: Byval là ràng buộc biến số 1 chiều chỉ nhận, Byval a nếu nhập a với b là 2, gán a = 5, b sẽ có giá trị vẫn là 2 khi thủ tục gọi kết thúc. Byref là ràng buộc biến số 2 chiều nhận và trả, Byref a nếu nhập a với b là 2, gán a = 5, b sẽ có giá trị là 5 khi thủ tục gọi kết thúc. Mã: Sao chép. Sub Test() Dim b b = 2: ProcTest1 b: debug.print b b = 2: ProcTest2 b: debug.print b End Sub Sub ProcTest1(Byval a) a = 5 End Sub Sub ProcTest2(Byref a) a = 5 End Sub Bạn phải đăng nhập hoặc đăng ký để trả lời bài viết tại đây.

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

N Hướng dẫn công thức Query kết hợp Arrayfomula bị lỗi (1 người xem)
  • Na7979
  • Thứ bảy lúc 11:40
  • Lọc và sắp xếp dữ liệu
Trả lời 1 Đọc 65 Hôm nay lúc 10:22 trung1987 T PhanTuHuong Nếu diễn đàn GPE đóng cửa? (1 người xem)
    • Thích
    • Yêu thích
  • PhanTuHuong
  • 14/12/25
  • Thư giãn
Trả lời 21 Đọc 805 Hôm nay lúc 09:39 Quang_Hải Quang_Hải huuthang_bd Cùng xây dựng file Gia Phả (1 người xem)
    • Thích
  • huuthang_bd
  • 30/12/13
  • Xây dựng ứng dụng.
Trả lời 51 Đọc 21K Hôm nay lúc 05:37 Maika8008 Maika8008 L nhờ hoàn thiện file dò xổ số (1 người xem)
  • levovantoan
  • Thứ sáu lúc 23:25
  • Giải thích, gỡ rối, xử lý lỗi công thức
Trả lời 7 Đọc 238 Hôm nay lúc 03:37 SA_DQ SA_DQ GPE-Trợ Lý [GPE21] ỨNG DỤNG POWER QUERY TRONG ĐỐI CHIẾU DỮ LIỆU HÓA ĐƠN ĐIỆN TỬ VÀ DỮ LIỆU KẾ TOÁN (3 người xem)
    • Thích
  • GPE-Trợ Lý
  • Hôm qua, lúc 10:02
  • Học tập Online
Trả lời 0 Đọc 190 Hôm qua, lúc 10:02 GPE-Trợ Lý GPE-Trợ Lý H hướng dẫn xóa dòng, cột file excel
  • hoangvucntt
  • Thứ bảy lúc 10:16
  • Cấu trúc dữ liệu Excel và việc Xử lý dữ liệu
Trả lời 1 Đọc 74 Thứ bảy lúc 17:39 ptm0412 ptm0412 D Xin giúp.......Kết hợp countifs và Sumproduct để đếm dữ liệu và tính số lượng tổng không trùng lặp với nhiều điều kiện (1 người xem)
  • dieppk.nb92
  • 14/12/25
  • Hàm và công thức Excel
Trả lời 20 Đọc 585 Thứ bảy lúc 10:56 Phan Thế Hiệp Phan Thế Hiệp K Các nút Buttom, Combobox, Textbox bị thay đổi kích thước ... (2 người xem)
  • kaoehtkid
  • 15/12/25
  • Những vấn đề chung
Trả lời 13 Đọc 348 Thứ sáu lúc 19:07 ongke0711 ongke0711 HeSanbi Thuật ngữ "Đối chiếu Unicode" quan trọng trong việc xử lý chuỗi ký tự (1 người xem)
    • Thích
  • HeSanbi
  • 13/12/25
  • Xử lý chuỗi ký tự
Trả lời 2 Đọc 263 Thứ sáu lúc 17:38 HeSanbi HeSanbi Nguyenkhang2404 Tính định mức sản phẩm (1 người xem)
    • Chấp nhận
  • Nguyenkhang2404
  • 24/7/25
  • Hàm và công thức Excel
Trả lời 11 Đọc 958 Thứ sáu lúc 14:27 nguyenanhtruong2409 N T Lọc dự liệu với hai điều kiện
  • tiny1010
  • 16/3/10
  • Cấu trúc dữ liệu Excel và việc Xử lý dữ liệu
Trả lời 18 Đọc 7K Thứ sáu lúc 14:11 nguyenanhtruong2409 N N Tổng hợp 2 sheet khác nhau (có 1 cột dữ liệu trùng) trong goole sheet
  • Na7979
  • Thứ sáu lúc 14:01
  • Google Sheets
Trả lời 0 Đọc 53 Thứ sáu lúc 14:01 Na7979 N D
  • Question Question
Tách dòng tự động theo điều kiện bằng VBA
    • Cười
  • duongnhuxuyen
  • 12/12/25
  • Lập Trình với Excel
Trả lời 17 Đọc 478 Thứ sáu lúc 12:04 ptm0412 ptm0412 P Lỗi hàm VBA phải add-in sau mỗi lần mở file
  • phamdinh.huy.aladin@gmail
  • 15/12/25
  • Hàm và công thức Excel
Trả lời 7 Đọc 264 Thứ sáu lúc 08:11 minhnghia123 M M Sai lệch vùng dữ liệu khi tạo Name Range bằng VBA
    • Buồn
  • Mr_Siro
  • Thứ tư lúc 10:57
  • Giải thích, gỡ rối, xử lý lỗi công thức
Trả lời 5 Đọc 184 Thứ năm lúc 13:23 Mr_Siro M P Tìm giá trị tồn kho đầu ngày
  • ptthuongtn
  • Thứ tư lúc 15:15
  • Hàm và công thức Excel
Trả lời 3 Đọc 184 Thứ năm lúc 11:22 Duy Tùng 9x Duy Tùng 9x skygatevn Xin giúp đỡ về việc áp dụng hàm phù hợp để phân tách dữ liệu
  • skygatevn
  • Thứ tư lúc 11:59
  • Hướng dẫn sử dụng các hàm trong Excel
Trả lời 3 Đọc 147 Thứ tư lúc 13:52 skygatevn skygatevn PhanTuHuong Bán sách Excel nâng cao để ủng hộ đồng bào bão lũ năm 2025!
    • Yêu thích
  • PhanTuHuong
  • 10/12/25
  • Câu lạc bộ hoạt động xã hội
Trả lời 5 Đọc 372 Thứ tư lúc 12:43 GPE-Trợ Lý GPE-Trợ Lý GPE-Trợ Lý CHUNG TAY HƯỚNG VỀ MIỀN TRUNG NĂM 2025
    • Thích
  • GPE-Trợ Lý
  • 24/11/25
  • Câu lạc bộ hoạt động xã hội
Trả lời 12 Đọc 968 Thứ tư lúc 07:38 PhanTuHuong PhanTuHuong HeSanbi
  • Đã giải quyết
WeatherXL - Ứng dụng lấy dữ liệu Thời tiết siêu nhanh (***Đang phát triển lại)
    • Thích
    • Yêu thích
  • HeSanbi
  • 30/5/20
  • Lập Trình với Excel
Trả lời 92 Đọc 27K Thứ ba lúc 19:57 Maika8008 Maika8008 Xem thêm… Chia sẻ: Facebook X Bluesky LinkedIn Reddit Pinterest Tumblr WhatsApp Email Chia sẻ Link

Thành viên có số lượng bài viết cao nhất tháng

  • Maika8008 41
  • thanthanhan 23
  • dungpham01 19
  • ongke0711 19
  • Phan Thế Hiệp 17
  • ptm0412 17
  • eagle12 16
  • nguyenanhtruong2409 16
  • HUONGHCKT 12
  • vic_it 11
  • nhhnam 10
  • pycckuu410 10
  • dieppk.nb92 10
  • Vũ Hải Sơn 9
  • HeSanbi 9
  • le_vis 8
  • Gà Con yêu VBA 8
  • bsbnhh 7
  • duongnhuxuyen 7
  • Hana2610 6

Thành viên có điểm tương tác cao nhất tháng

  • Phan Thế Hiệp 87
  • Maika8008 34
  • thanthanhan 20
  • ongke0711 17
  • ptm0412 17
  • HeSanbi 17
  • dungpham01 11
  • HUONGHCKT 9
  • eagle12 9
  • SA_DQ 9
  • Cúc Hr 8
  • dieppk.nb92 6
  • Mr.hieudoanxd 5
  • befaint 5
  • pycckuu410 5
  • Hoàng Tuấn 868 4
  • Phuocam 4
  • nguyenanhtruong2409 4
  • nhhnam 2
  • Gà Con yêu VBA 2

Thời gian đếm ngược.

000 Ngày 00 Giờ 00 phút 00 giây Thân mời tham dự sự kiện sinh nhật GPE 2025
  • Trang chủ
  • Bài viết nổi bật và thông báo
  • Website này sử dụng cookies. Tiếp tục sử dụng trang này, đồng nghĩa với việc bạn chấp nhận website sử dụng cookies. Chấp nhận Tìm hiểu thêm.…
Back Top Bottom

Từ khóa » Byval Và Byref Trong Vba