Nguyen Rem
Tất cả chỉ là đưa ra quyết định đúng đắn
- Tham gia
- 23/2/22
- Bài viết
- 211
- Được thích
- 30
- Giới tính
- Nữ
Vâng ạ ! Nhưng mà h làm thế nào cho đúng ạLộn box rồi thì phải. Lỗi biến bị khai báo sai
Xin lỗi. giờ mở file mới biết code trong. Bạn thử thay bằngVâng ạ ! Nhưng mà h làm thế nào cho đúng ạ
If Mang(0) = Empty Then
À bài này mình đang test cái nothing ấy nên mình muốn dùng nó :> nhưng không hiểu nguyên nhân thế nào lại sinh ra lỗiXin lỗi. giờ mở file mới biết code trong. Bạn thử thay bằngxem thế nàoMã:If Mang(0) = Empty Then
Mình không rõ lắm. theo mình hiểu Is nothing trong trường hợp mang as range thì phảiÀ bài này mình đang test cái nothing ấy nên mình muốn dùng nó :> nhưng không hiểu nguyên nhân thế nào lại sinh ra lỗi
MÌnh cảm ơn bạn ^^ . Lần sau mình sẽ tìm hiểu kĩ hơn ạ ^^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
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
For Each X In Mang
MsgBox X
Next X
Public Sub RunThuTuc3()
Dim rng As Range
Set rng = Sheet1.Range("K7:M12")
Call ThuTuc3(100, rng)
End Sub
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
Nothing chỉ dùng được với OBJECT - đối tượng.
Bạn có 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() 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ị.
Bạn chú ý là trong trường hợp này rng là OBJECT nên lại có lỗi ở dòng MsgBox X, vì thế tôi chuyển đoạn
Mã:For Each X In Mang MsgBox X Next X
thành chú thích.
Nếu bây giờ sửa thành
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.Mã:Public Sub RunThuTuc3() Dim rng As Range Set rng = Sheet1.Range("K7:M12") Call ThuTuc3(100, rng) End Sub
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
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2