Làm thế nào để tôi trả về một kết quả từ một chức năng?
Ví dụ:
Public Function test() As Integer
return 1
End Function
Điều này đưa ra một lỗi biên dịch.
Làm thế nào để tôi thực hiện chức năng này trả về một số nguyên?
Làm thế nào để tôi trả về một kết quả từ một chức năng?
Ví dụ:
Public Function test() As Integer
return 1
End Function
Điều này đưa ra một lỗi biên dịch.
Làm thế nào để tôi thực hiện chức năng này trả về một số nguyên?
Câu trả lời:
Đối với các kiểu trả về không phải đối tượng, bạn phải gán giá trị cho tên hàm của mình, như thế này:
Public Function test() As Integer
test = 1
End Function
Ví dụ sử dụng:
Dim i As Integer
i = test()
Nếu hàm trả về một loại Đối tượng, thì bạn phải sử dụng Set
từ khóa như thế này:
Public Function testRange() As Range
Set testRange = Range("A1")
End Function
Ví dụ sử dụng:
Dim r As Range
Set r = testRange()
Lưu ý rằng việc gán giá trị trả về cho tên hàm không chấm dứt việc thực thi hàm của bạn. Nếu bạn muốn thoát khỏi chức năng, thì bạn cần phải nói rõ ràng Exit Function
. Ví dụ:
Function test(ByVal justReturnOne As Boolean) As Integer
If justReturnOne Then
test = 1
Exit Function
End If
'more code...
test = 2
End Function
Tài liệu: http://msdn.microsoft.com/en-us/l Library / office / gg264233% 28v = office.14% 29.aspx
Range
ví dụ như ví dụ), bạn cần sử dụng Set
giống như bạn sẽ làm nếu đặt một biến đối tượng trong một phương thức thông thường. Vì vậy, nếu, ví dụ, "test" là một hàm trả về Phạm vi, câu lệnh return sẽ giống như thế này set test = Range("A1")
.
set
có thể dẫn đến các vấn đề. Tôi đã có vấn đề khi làm điều đó mà không có, nhưng nếu tôi sử dụng thì set
tôi không :).
set test = Range("A1")
chính xác tương đương với test = Range("A1").Value
, trong đó "test" được định nghĩa là Biến, thay vì Phạm vi.
Các hàm VBA coi chính tên hàm là một loại biến. Vì vậy, thay vì sử dụng return
câu lệnh "", bạn chỉ cần nói:
test = 1
Mặc dù vậy, lưu ý rằng điều này không thoát ra khỏi chức năng. Bất kỳ mã nào sau câu lệnh này cũng sẽ được thực thi. Do đó, bạn có thể có nhiều câu lệnh gán gán các giá trị khác nhau test
và bất kể giá trị là gì khi bạn đạt đến cuối hàm sẽ là giá trị được trả về.
Chỉ cần đặt giá trị trả về cho tên hàm vẫn không hoàn toàn giống với câu lệnh Java (hoặc khác) return
, bởi vì trong java, return
thoát khỏi hàm, như thế này:
public int test(int x) {
if (x == 1) {
return 1; // exits immediately
}
// still here? return 0 as default.
return 0;
}
Trong VB, tương đương chính xác mất hai dòng nếu bạn không đặt giá trị trả về ở cuối hàm . Vì vậy, trong VB, hệ quả chính xác sẽ như thế này:
Public Function test(ByVal x As Integer) As Integer
If x = 1 Then
test = 1 ' does not exit immediately. You must manually terminate...
Exit Function ' to exit
End If
' Still here? return 0 as default.
test = 0
' no need for an Exit Function because we're about to exit anyway.
End Function
Vì đây là trường hợp, thật tuyệt khi biết rằng bạn có thể sử dụng biến trả về như bất kỳ biến nào khác trong phương thức. Như thế này:
Public Function test(ByVal x As Integer) As Integer
test = x ' <-- set the return value
If test <> 1 Then ' Test the currently set return value
test = 0 ' Reset the return value to a *new* value
End If
End Function
Hoặc, ví dụ cực đoan về cách biến trả về hoạt động (nhưng không nhất thiết là một ví dụ hay về cách bạn thực sự nên viết mã). Đây là một ví dụ sẽ giúp bạn thức dậy vào ban đêm:
Public Function test(ByVal x As Integer) As Integer
test = x ' <-- set the return value
If test > 0 Then
' RECURSIVE CALL...WITH THE RETURN VALUE AS AN ARGUMENT,
' AND THE RESULT RESETTING THE RETURN VALUE.
test = test(test - 1)
End If
End Function
Variant
và mục tiêu của bạn là trả về một mảng thì một cái gì đó giống như ReDim test(1 to 100)
sẽ gây ra lỗi. Ngoài ra, mặc dù nó là tốt để điều trị loại hình cơ bản như Integers
như vậy nó được coi là hơi unidiomatic. Nó làm cho mã khó đọc hơn. Các lập trình viên VBA quét các dòng gán cho tên hàm để hiểu hàm làm gì. Sử dụng tên hàm như một biến thông thường không cần thiết che khuất điều này.
Exit Function
liên quan đếnreturn
ReDim test(1 to 100)
không gây ra lỗi đơn giản vì 'test' không được khai báo là một mảng! và không có lý do nào khác! Bạn không thể khai báo một hàm như một mảng. Khai báo nó dưới dạng a Variant
, sau đó chỉ cần xây dựng mảng đầu ra của bạn (nó có thể là Động hoặc Tĩnh) bên trong hàm này test
và sau đó gán ("=") mảng này test
làm giá trị trả về. Để tiếp tục thao tác, như ReDim
ing nó, bạn cần gán giá trị được trả về cho một biến, ví dụ Dim x as Variant
và gọi x = test
, sau đó x
là những gì bạn đã thực hiện test
!