Nhờ xem giúp lỗi Run time error 424: Object required

Liên hệ QC

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ữ
Nhờ mọi người vào modul3 rồi chạy thử giúp em
1649135015346.png
 

File đính kèm

  • 16.xlsm
    16.9 KB · Đọc: 9
Lộn box rồi thì phải. Lỗi biến bị khai báo sai
 
Upvote 0
Upvote 0
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.
 
Upvote 0
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.
MÌnh cảm ơn bạn ^^ . Lần sau mình sẽ tìm hiểu kĩ hơn ạ ^^
 
Upvote 0
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
Mã:
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
 
Lần chỉnh sửa cuối:
Upvote 0
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
Mã:
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

Mình cảm ơn bạn rất nhiều . Cảm ơn vì đã dành thời gian viết một bài chi tiết như vậy. Người mới như mình thật sự rất dễ đọc <3
 
Upvote 0
Web KT
Back
Top Bottom