Cùng nhau lý giải Function là gì?

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:
 
Sửa lần cuối:

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:
 
Top