Lỗi này là lỗi đăng bài sai góc. Khắc phục bằng cách nhờ mót chuyển qua góc Lập trình. Nguyên nhân sinh ra lỗi là do tính cẩu thả, bạ đâu đăng bài đấy, không chịu phân tích kỹ xem vấn đề của mình thuộc loại nào vfa diễn đàn có những góc nào.
Lỗi này là lỗi đăng bài sai góc. Khắc phục bằng cách nhờ mót chuyển qua góc Lập trình. Nguyên nhân sinh ra lỗi là do tính cẩu thả, bạ đâu đăng bài đấy, không chịu phân tích kỹ xem vấn đề của mình thuộc loại nào vfa diễn đàn có những góc nào.
Public Sub ThuTuc3(ByVal Z As Integer, ParamArray Mang() As Variant)
Dim X As Variant
If (LBound(Mang) = 0) And (UBound(Mang) = -1) Then
MsgBox "Arguments array was not provided"
Exit Sub
End If
For Each X In Mang
MsgBox X
Next X
If Mang(0) Is Nothing Then
MsgBox "Nothing was passed in"
Exit Sub
End If
End Sub
Public Sub RunThuTuc3()
Call ThuTuc3(100, 1)
End Sub
Rõ ràng bạn truyền vào 1, tức Mang(0) = 1. Đây là giá trị đơn kiểu numeric. 1 không phải là OBJECT nên sẽ có lỗi ở dòng If Mang(0) Is Nothing Then
Ta xét code
Mã:
Public Sub ThuTuc3(ByVal Z As Integer, ParamArray Mang() As Variant)
Dim X As Variant
If (LBound(Mang) = 0) And (UBound(Mang) = -1) Then
MsgBox "Arguments array was not provided"
Exit Sub
End If
' For Each X In Mang
' MsgBox X
' Next X
If Mang(0) Is Nothing Then
MsgBox "Nothing was passed in"
Exit Sub
End If
End Sub
Public Sub RunThuTuc3()
Dim rng As Range
Call ThuTuc3(100, rng)
End Sub
Bây giờ thì không còn lỗi nữa vì Mang(0) = rng là RANGE, tức OBJECT. Tuy nhiên do rng không được thiết lập ở thời điểm "chào buổi sáng" nên OBJECT rng = Nothing, vì thế MsgBox được hiển thị.
Public Sub RunThuTuc3()
Dim rng As Range
Set rng = Sheet1.Range("K7:M12")
Call ThuTuc3(100, rng)
End Sub
Thì rng cũng vẫn là OBJECT nên không có lỗi. Nhưng do rng được thiết lập ở thời điểm "chào buổi sáng" nên cũng không hiển thị MsgBox luôn - do rng <> Nothing.
Thế nhưng tôi hiểu là bạn có thể truyền vào Sub ThuTuc3 những giá trị khác nhau, vd. giá trị 1 (numeric) như ban đầu, hoặc rng (object). Vậy nếu bạn muốn kiểm tra xem tham số truyền vào có là object không, nếu là object thì nó có được thiết lập (initiation) hay không thì phải viết thế nào?
Tôi cho ví dụ.
Mã:
Public Sub ThuTuc3(ByVal Z As Integer, ParamArray Mang() As Variant)
Dim X As Variant
If (LBound(Mang) = 0) And (UBound(Mang) = -1) Then
MsgBox "Arguments array was not provided"
Exit Sub
End If
For Each X In Mang
If IsObject(X) Then
If X Is Nothing Then
Debug.Print "Doi tuong la Nothing"
Else
Debug.Print "Doi tuong " & TypeName(X) & " khong Nothing"
End If
Else
Debug.Print "Tham so truyen vao la " & TypeName(X)
End If
Next X
End Sub
Public Sub RunThuTuc3()
Dim Arr() As Double, rng As Range, dic As Object
Set dic = CreateObject("Scripting.Dictionary")
Call ThuTuc3(100, 0, True, "hic hic", Arr, rng, dic)
End Sub
Khi chạy code bạn sẽ có kết quả:
Tham so truyen vao la Integer
Tham so truyen vao la Boolean
Tham so truyen vao la String
Tham so truyen vao la Double()
Doi tuong la Nothing
Doi tuong Dictionary khong Nothing
Public Sub ThuTuc3(ByVal Z As Integer, ParamArray Mang() As Variant)
Dim X As Variant
If (LBound(Mang) = 0) And (UBound(Mang) = -1) Then
MsgBox "Arguments array was not provided"
Exit Sub
End If
For Each X In Mang
MsgBox X
Next X
If Mang(0) Is Nothing Then
MsgBox "Nothing was passed in"
Exit Sub
End If
End Sub
Public Sub RunThuTuc3()
Call ThuTuc3(100, 1)
End Sub
Rõ ràng bạn truyền vào 1, tức Mang(0) = 1. Đây là giá trị đơn kiểu numeric. 1 không phải là OBJECT nên sẽ có lỗi ở dòng If Mang(0) Is Nothing Then
Ta xét code
Mã:
Public Sub ThuTuc3(ByVal Z As Integer, ParamArray Mang() As Variant)
Dim X As Variant
If (LBound(Mang) = 0) And (UBound(Mang) = -1) Then
MsgBox "Arguments array was not provided"
Exit Sub
End If
' For Each X In Mang
' MsgBox X
' Next X
If Mang(0) Is Nothing Then
MsgBox "Nothing was passed in"
Exit Sub
End If
End Sub
Public Sub RunThuTuc3()
Dim rng As Range
Call ThuTuc3(100, rng)
End Sub
Bây giờ thì không còn lỗi nữa vì Mang(0) = rng là RANGE, tức OBJECT. Tuy nhiên do rng không được thiết lập ở thời điểm "chào buổi sáng" nên OBJECT rng = Nothing, vì thế MsgBox được hiển thị.
Public Sub RunThuTuc3()
Dim rng As Range
Set rng = Sheet1.Range("K7:M12")
Call ThuTuc3(100, rng)
End Sub
Thì rng cũng vẫn là OBJECT nên không có lỗi. Nhưng do rng được thiết lập ở thời điểm "chào buổi sáng" nên cũng không hiển thị MsgBox luôn - do rng <> Nothing.
Thế nhưng tôi hiểu là bạn có thể truyền vào Sub ThuTuc3 những giá trị khác nhau, vd. giá trị 1 (numeric) như ban đầu, hoặc rng (object). Vậy nếu bạn muốn kiểm tra xem tham số truyền vào có là object không, nếu là object thì nó có được thiết lập (initiation) hay không thì phải viết thế nào?
Tôi cho ví dụ.
Mã:
Public Sub ThuTuc3(ByVal Z As Integer, ParamArray Mang() As Variant)
Dim X As Variant
If (LBound(Mang) = 0) And (UBound(Mang) = -1) Then
MsgBox "Arguments array was not provided"
Exit Sub
End If
For Each X In Mang
If IsObject(X) Then
If X Is Nothing Then
Debug.Print "Doi tuong la Nothing"
Else
Debug.Print "Doi tuong " & TypeName(X) & " khong Nothing"
End If
Else
Debug.Print "Tham so truyen vao la " & TypeName(X)
End If
Next X
End Sub
Public Sub RunThuTuc3()
Dim Arr() As Double, rng As Range, dic As Object
Set dic = CreateObject("Scripting.Dictionary")
Call ThuTuc3(100, 0, True, "hic hic", Arr, rng, dic)
End Sub
Khi chạy code bạn sẽ có kết quả:
Tham so truyen vao la Integer
Tham so truyen vao la Boolean
Tham so truyen vao la String
Tham so truyen vao la Double()
Doi tuong la Nothing
Doi tuong Dictionary khong Nothing