Cùng Nhau Lý Giải Function Là Gì? | Tự Học VBA

Menu Tự học VBA
  • Trang chủ
  • Diễn đàn Bài viết mới Tìm chủ đề
  • Có gì mới Bài viết mới Hoạt động mới nhất
Đăng nhập Đăng ký Có gì mới? Tìm kiếm

Tìm kiếm

Everywhere Chủ đề This forum This thread Chỉ tìm trong tiêu đề Bởi: Tìm Tìm kiếm nâng cao…
  • Bài viết mới
  • Tìm chủ đề
Menu Đăng nhập Đăng ký
  • Cách upload ảnh lên diễn đàn
  • Trang chủ
  • Diễn đàn
  • Kỹ thuật xử lý Excel
  • Lập trình VBA
Cùng nhau lý giải Function là gì?
  • Thread starter Euler
  • Ngày gửi 3/10/19
Euler

Euler

Administrator
Thành viên BQT Trong Excel có rất nhiều hàm (Function), nhưng chúng ta cũng có thể tự tạo hàm riêng và sử dụng đấy, bạn đã biết chưa? Trong bài viết này, hãy cùng chúng tôi tìm hiểu để hiểu rõ hơn về Function nhé.
  • Function là gì?
  • Định nghĩa Function
  • Cách gọi Function
  • Chỉ định tham số (hay còn gọi là đối số) cho Function
1. Function là gì? Function giống như hàm của VBA, chúng ta tự tạo ra nó và có thể sử dụng để xử lý nội dung nào đó. Function (hàm số) là một nhóm các xử lý chứa bên trong nó. Function có thể tiến hành xử lý một nội dung nào đó bằng cách sử dụng các giá trị của biến số hay của mảng. Chúng ta cũng có thể lấy ra kết quả xử lý của nó để phục vụ cho các mục đích khác. Tham số đầu vào (hay còn gọi là đối số) có thể là biến số thông thường, hay là mảng như vừa nói ở trên. Bên trong hàm, chúng ta có thể định nghĩa các biến số và sử dụng nó. Kết quả xử lý của hàm, gọi là giá trị trả về. Giá trị trả về có thể lưu vào một biến số, hoặc vào một Object. Ngoài Function, chúng ta còn có Sub. Tuy nhiên Sub thì không có giá trị trả về. Điểm khác nhau lớn nhất giữa Function và Sub chính là ở điều này, Function có giá trị trả về, Sub thì không có giá trị trả về. 2. Định nghĩa Function Đầu tiên, hãy nhìn vào phương pháp định nghĩa Function. Sau đây ta sẽ phân chia ra làm hai nhóm Function có giá trị trả về và Function không có giá trị trả về. Thậm chí còn có cách phân chia khác, Function có tham số đầu vào (đối số) và Function không có tham số đầu vào. Định nghĩa Function không có giá trị trả về, không có đối số đầu vào: Mã: Function ten_ham() 'Nội dung xử lý bên trong' End Function Ta ví dụ một Function đơn giản trong trường hợp này: Mã: Function func1() MsgBox "Hello tuhocvba.net!" End Function Trường hợp này thì Function chẳng khác gì Sub, chỉ có xử lý bên trong, không có giá trị trả về, cũng không có đối số đầu vào. Định nghĩa Function có giá trị trả về, không có đối số đầu vào: Mã: Function ten_ham() As Kiểu dữ liệu của giá trị trả về ten_ham = giá trị trả về End Function Ta ví dụ: Mã: Function func1() As String func1 = "Hello tuhocvba.net!" End Function Hàm này có kiểu giá trị trả về là String. Giá trị trả về của nó là chuỗi ký tự "Hello tuhocvba.net!". 3. Cách gọi Function: Để sử dụng Function, tôi sẽ giới thiệu mọi người cách gọi Function. Trường hợp Function có giá trị trả về và Function không có giá trị trả về sẽ có sự khác biệt, hãy chú ý. Trường hợp không có giá trị trả về, chúng ta sử dụng câu lệnh Call. Câu lệnh Call còn được dùng cho cả Sub. 3.1 Chúng ta gọi bằng Call: Cấu trúc của nó là: Mã: Call Function tên_hàm Ví dụ cụ thể: Mã: Sub macro1() Call func1 End Sub Function func1() MsgBox "Hello VBA!" End Function Kết quả khi chạy Sub macro1 là: Bạn cần đăng nhập để thấy đính kèm Khi chạy thủ tục macro1, func1 được gọi bằng Call và câu lệnh bên trong nó được thực thi. Dẫn đến hộp thoại thông báo được hiển thị như trên. 3.2 Phương pháp gọi Function có giá trị trả về: Cấu trúc: Mã: Dim tên_đối_tượng As Kiểu dữ liệu của giá trị trả về tên_đối_tượng = tên_hàm Ví dụ: Mã: Sub macro1() Dim str As String 'Khai báo string, giống với kiểu dữ liệu trả về của func1 str = func1() MsgBox str, vbInformation 'Hiển thị thông báo nội dung str End Sub Function func1() As String 'Kiểu dữ liệu trả về là String func1 = "Hello VBA!" End Function Kết quả: Bạn cần đăng nhập để thấy đính kèm str được gán bằng func1, mà func1 có giá trị là "Hello VBA!", do đó dẫn tới kết quả như trên. 4. Chỉ định tham số (hay còn gọi là đối số) cho Function Ở trên, thì chúng ta đã làm quen với Function không có đối số đầu vào. Bây giờ chúng ta sẽ làm quen với Function có đối số đầu vào. Trường hợp chỉ có một đối số: Cấu trúc: Mã: Function tên_hàm(ByVal tên_đối_số As Kiểu dữ liệu) As Kiểu dữ liệu của giá trị trả về tên_hàm = Giá trị trả về End Function Ở trên ta viết ByVal, ngoài ra còn có ByRef, tôi sẽ giới thiệu và chỉ rõ sự khác biệt sau. Mã: Sub macro2() Dim str As String Dim num As Integer num = 3 str = func2(num) MsgBox str, vbInformation End Sub Function func2(ByVal num As Integer) As String Dim square As Integer square = num ^ 2 func2 = CStr(num) & " ^ 2 = " & CStr(square) End Function Kết quả: Bạn cần đăng nhập để thấy đính kèm Hàm func2 có kiểu giá trị trả về là chuỗi ký tự String. Đối số đầu vào là kiểu số nguyên integer. Hàm func2 sẽ sử dụng đối số đầu vào num và tính bình phương số num. Giá trị trả về là kiểu chuỗi ký tự String, cho nên ta sử dụng hàm Cstr để chuyển đổi số thành chuỗi ký tự (String). Trường hợp có nhiều đối số: Ta đi tới tổng quát, cấu trúc như sau: Mã: Function tên_hàm(ByVal đối_số_1 As kiểu dữ liệu, ByVal đối_số_2 As kiểu dữ liệu, ...) As kiểu dữ liệu của giá trị trả về tên_hàm = giá trị trả về End Function Ví dụ: Mã: Sub macro3() Dim str As String str = func3(2, 3) MsgBox str, vbInformation End Sub Function func3(ByVal num1 As Integer, ByVal num2 As Integer) As String Dim mul As Integer mul = num1 * num2 func3 = CStr(num1) & " * " & CStr(num2) & " = " & CStr(mul) End Function Kết quả: Bạn cần đăng nhập để thấy đính kèm Ở các ví dụ trên, ta sử dụng đối số đầu vào được khai báo là Byval, nó có nghĩa là chúng ta chỉ sử dụng giá trị của đối số đầu vào, và không làm thay đổi đối số đầu vào. Nó như thế nào thì vẫn cứ như thế, tôi chỉ lấy giá trị của anh để phục vụ tính toán của tôi mà thôi. Trong trường hợp mà ta vừa lấy giá trị để sử dụng, lại muốn thay đổi luôn giá trị của đối số đầu vào thì ta sẽ khai báo ByRef. Hãy xem đoạn code dưới đây: Mã: Sub macro2() Dim str As String Dim num As Integer num = 3 str = CStr(func2(num)) MsgBox num, vbInformation 'Theo bạn thì lúc này num là bao nhiêu??? End Sub Function func2(ByRef num As Integer) As Integer 'Tôi khai báo bằng ByRef num = num ^ 2 func2 = num End Function Kết quả: Bạn cần đăng nhập để thấy đính kèm Tôi sử dụng đoạn code giống hoàn toàn, nhưng thay đổi ByRef -> ByVal: Mã: Sub macro2() Dim str As String Dim num As Integer num = 3 str = CStr(func2(num)) MsgBox num, vbInformation 'Theo bạn lúc này num là bao nhiêu? End Sub Function func2(ByVal num As Integer) As Integer 'ByRef -> ByVal num = num ^ 2 func2 = num End Function Kết quả: Bạn cần đăng nhập để thấy đính kèm (Còn nữa) Nguồn tham khảo: Bạn cần đăng nhập để thấy link Sửa lần cuối: 3/10/19 tuhocvba

tuhocvba

Administrator
Thành viên BQT Trong phần này, chúng ta sẽ đi vào vấn đề phức tạp hơn một chút. Giá trị trả về của Function nếu là chuỗi ký tự String, hay số nguyên Long, hay số thực double, thì sẽ chẳng có gì đáng nói. Nhưng nếu giá trị trả về của Function là một đối tượng, chả hạn như một vùng Range, thì khi đó chúng ta phải làm như thế nào? Chỉ định giá trị trả về của Function là Object (đối tượng) Gán giá trị liên quan tới Object, ta hãy nhớ lại câu lệnh Set. Cấu trúc code của ta sẽ là: Mã: Function tên_hàm(đối số) As kiểu dữ liệu của giá trị trả về  Set tên_hàm = Object End Function Ví dụ: Mã: Sub macro5() Dim str As String Dim range As range str = "A1" Set range = obj(str) range.Value = "Hello VBA!" End Sub Function obj(ByVal str As String) As range Set obj = range(str) End Function Kết quả: Bạn cần đăng nhập để thấy đính kèm Đối số và giá trị trả về là mảng Cấu trúc sẽ như sau: Mã: Function tên_hàm(tên_mảng() As kiểu dữ liệu) As kiểu dữ liệu của giá trị trả về() tên_hàm = giá trị trả về End Function Ví dụ: Mã: Sub macro6() Dim i As Integer Dim arr(3) As Integer ' Khởi tạo giá trị ban đầu cho mảng For i = LBound(arr) To UBound(arr) arr(i) = i Next i ' Khai báo mảng mới và gán nó bằng giá trị trả về của Function ReDim new_arr(3) As Integer new_arr = myArray(arr) ' Xuất giá trị từ mảng và cho hiển thị Dim str As String For i = LBound(new_arr) To UBound(new_arr) str = str & new_arr(i) & vbCrLf Next i MsgBox str, vbInformation End Sub Function myArray(arr() As Integer) As Integer() Dim i As Integer For i = LBound(arr) To UBound(arr) arr(i) = arr(i) + 10 Next i myArray = arr End Function Kết quả: Bạn cần đăng nhập để thấy đính kèm Đến đây, chúng tôi đã trình bày xong các vấn đề về khai báo Function. Nếu có vấn đề gì thắc mắc, hãy phản hồi trong topic này nhé. Nguồn tham khảo và dịch: Bạn cần đăng nhập để thấy link Bạn phải đăng nhập hoặc đăng ký để bình luận. Chia sẻ: Facebook Twitter WhatsApp Email Link
  • Trang chủ
  • Diễn đàn
  • Kỹ thuật xử lý Excel
  • Lập trình VBA
Top

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