Cách trả về nhiều giá trị trả về giả tạo cho hàm trong VBA

vbano1

SMod
Thành viên BQT
1. Phương pháp trả về nhiều hơn một giá trị trả về cho hàm Function
Đối với Function, chúng ta biết rằng có thể trả về cho nó một giá trị trả về. Tuy nhiên, đôi khi chúng ta muốn trả về cho hàm nhiều hơn một giá trị trả về. Thật đáng tiếc đó là Function chỉ có một giá trị trả về. Việc gia tăng số lượng giá trị trả về cho Function là việc vô lý không thể nào làm được.
Tuy nhiên, bằng cách giả tạo là một giá trị trả về, chúng ta có thể trả về cho Function số lượng giá trị trả về nhiều hơn 1.

  1. Sử dụng mảng làm giá trị trả về.
  2. Mảng hóa giá trị trả về bằng hàm Array
  3. Sử dụng đối số truyền vào là nơi lưu trữ giá trị trả về
Ngoài ra người dùng có thể tự định nghĩa kiểu giá trị trả về, hay sử dụng collection. Tuy nhiên, bản chất của vấn đề vẫn là sử dụng mảng cho giá trị trả về.
Việc sử dụng các đối số làm nơi lưu trữ giá trị trả về thường được cho là tốt nhất, tuy nhiên một cách đơn giản nhất chính là sử dụng mảng. Sau đây tôi sẽ lần lượt giới thiệu 3 ví dụ.

2. Các ví dụ:
2.1 Giá trị trả về là mảng:

Mã:
Function MultiReturn(a_sPath)
    Dim v
   
    v = Split(a_sPath, "\")
   
    MultiReturn = v
End Function
Giá trị trả về của hàm Split là kiểu Variant, nói cách khác v trong code trên chính là mảng. Và vì vậy giá trị trả về của hàm MultiReturn là mảng.
Chạy thủ tục sau:
Mã:
Sub MultiReturnTest()
    Dim sPath
    Dim v
    Dim s
   
    sPath = "C:\web\test\abc.txt"
   
    v = MultiReturn(sPath)
   
    For Each s In v
        Debug.Print s
    Next
End Sub
Kết quả:
Mã:
C:
web
test
abc.txt
2.2 Mảng hóa giá trị trả về bằng hàm Array:
Mã:
Function MultiReturnArray(a_sPath)
    Dim sPath
    Dim sFile
    Dim i
   
    i = InStrRev(a_sPath, "\")
   
    sPath = Left(a_sPath, i)
    sFile = Mid(a_sPath, i + 1)
   
    MultiReturnArray = Array(sPath, sFile)
End Function
Chạy thủ tục sau:
Mã:
Sub MultiReturnArrayTest()
    Dim sPath
    Dim v
    Dim s
   
    sPath = "C:\web\test\abc.txt"
   
    v = MultiReturnArray(sPath)
   
    For Each s In v
        Debug.Print s
    Next
End Sub
Ta được kết quả là:
Mã:
C:\web\test\
abc.txt
2.3 Sử dụng đối số truyền vào là nơi lưu trữ giá trị trả về
Đối số thứ nhất ( a_sPath ) đóng vai trò là INPUT, đối số thứ hai và thứ ba ( a_sDir, a_sFile ) đóng vai trò là OUTPUT.
Mã:
Sub MultiParam(a_sPath, a_sDir, a_sFile)
    Dim sPath
    Dim sFile
    Dim i
   
    i = InStrRev(a_sPath, "\")
   
    a_sDir = Left(a_sPath, i)
    a_sFile = Mid(a_sPath, i + 1)
End Sub
Bây giờ chạy thủ tục sau:
Mã:
Sub MultiParamTest()
    Dim sPath
    Dim s
    Dim sDir
    Dim sFile
   
    sPath = "C:\web\test\abc.txt"
   
    Call MultiParam(sPath, sDir, sFile)
   
    Debug.Print sDir
    Debug.Print sFile
End Sub
Kết quả sẽ là:
Mã:
C:\web\test\
abc.txt
Nguồn tham khảo và dịch:
 

NhanSu

SMod
Thành viên BQT
Sử dụng mảng làm giá trị trả về là cách cần thiết để có thể gọi hàm trực tiếp trên sheet. Tuy nhiên bình thường excel không cho phép trả về nhiều giá trị. Có một số cách để giải quyết vấn đề này mà đơn giản nhất là sử dụng Excel 365.
 
Top