Lỗi code dùng AdvancedFilter. (1 người xem)

Người dùng đang xem chủ đề này

phuyen89

Thành viên tích cực
Tham gia
20/11/08
Bài viết
875
Được thích
341
Nghề nghiệp
Student
Em dùng một Macro sau để lấy giá trị duy nhất từ Sheets(Database) sang range("B8") sheet Ma thôi!
Code như thế này thì chạy bình thường.
PHP:
Sub UniqueValue()
    Range("B9:B500").ClearContents
    With Sheets("DataBase")
        .Range("G12:G2000").AdvancedFilter _
        Action:=xlFilterCopy, CopyToRange:=Sheets("Ma").Range("B8"), unique:=True
    End With
    
End Sub

Nhưng em thay cái Range("G12:G2000") thành một cái Range động.
PHP:
Sub DynamicRange
Dim rngVung as range
set rngvung= sheets("Database").range("G12", [G4000].end(xlup))
with sheets("Database")
.rngVung.advancedFilter............
end with
End Sub

Nhưng đoạn Code sau bị lỗi, em chưa hiểu nguyên nhân vì sao, trong khi đoạn code trên Range("G12:G2000") em thay bằng rngvung thôi!
 
Bạn bỏ dấu chấm trước .Rngvung đi xem sao.
 
Upvote 0
Bạn bỏ dấu chấm trước .Rngvung đi xem sao.

Tại sao vậy nhỉ?rngVung nó đại diện cho 1 range.
Mình đã thử viết:
PHP:
Sub UniqueValue()
    Application.ScreenUpdating = False
    Range("B9:B500").ClearContents
    dim rngVung as range
    set rngVung= sheets("Database").range("G12",[G4000].end(xlup))
    With Sheets("DataBase").rngVung
        .AdvancedFilter _
        Action:=xlFilterCopy, CopyToRange:=Sheets("Ma").Range("B8"), unique:=True
    End With
    Application.ScreenUpdating = True
End Sub

1.Nó sẽ báo lỗi tại phần With Sheets("DataBase").rngVung
2.Còn nếu dùng .rngVung.AdvancedFilter cũng bi Lỗi

trong khi đó mình dùng With...End with theo sau nó là một Object, mà object thì có các method và properties, nên mình thêm dấu . ở đầu thì sao lại báo lỗi nhỉ?
Mong mọi người giải thích giúp em.
Em xin cảm ơn!!
 
Upvote 0
Tại sao vậy nhỉ?rngVung nó đại diện cho 1 range.
Mình đã thử viết:
PHP:
Sub UniqueValue()
    Application.ScreenUpdating = False
    Range("B9:B500").ClearContents
    dim rngVung as range
    set rngVung= sheets("Database").range("G12",[G4000].end(xlup))
    With Sheets("DataBase").rngVung
        .AdvancedFilter _
        Action:=xlFilterCopy, CopyToRange:=Sheets("Ma").Range("B8"), unique:=True
    End With
    Application.ScreenUpdating = True
End Sub

1.Nó sẽ báo lỗi tại phần With Sheets("DataBase").rngVung
2.Còn nếu dùng .rngVung.AdvancedFilter cũng bi Lỗi

trong khi đó mình dùng With...End with theo sau nó là một Object, mà object thì có các method và properties, nên mình thêm dấu . ở đầu thì sao lại báo lỗi nhỉ?
Mong mọi người giải thích giúp em.
Em xin cảm ơn!!
RngVung của bạn có dòng tiêu đề chưa or phải thêm vào cho nó : mới hiểu lọc duy nhất được. Không có dòng tiêu đề ( tên trường ) là hỏng mất.
Mã:
Sub UniqueValue()
    Application.ScreenUpdating = False
    Range("B9:B500").ClearContents
    Dim rngVung As Range
    Set rngVung = Sheets("Database").Range("G12", Sheets("Database").[G4000].End(xlUp))
    With Sheets("DataBase")
        rngVung.AdvancedFilter _
         Action:=xlFilterCopy, CopyToRange:=Sheets("Ma").Range("B8"), unique:=True
    End With
    Application.ScreenUpdating = True
End Sub
Bạn sửa lai như sau nhé
 
Lần chỉnh sửa cuối:
Upvote 0
Tại sao vậy nhỉ?rngVung nó đại diện cho 1 range.
Mình đã thử viết:
PHP:
Sub UniqueValue()
    Application.ScreenUpdating = False
    Range("B9:B500").ClearContents
    dim rngVung as range
    set rngVung= sheets("Database").range("G12",[G4000].end(xlup))
    With Sheets("DataBase").rngVung
        .AdvancedFilter _
        Action:=xlFilterCopy, CopyToRange:=Sheets("Ma").Range("B8"), unique:=True
    End With
    Application.ScreenUpdating = True
End Sub

1.Nó sẽ báo lỗi tại phần With Sheets("DataBase").rngVung
2.Còn nếu dùng .rngVung.AdvancedFilter cũng bi Lỗi

trong khi đó mình dùng With...End with theo sau nó là một Object, mà object thì có các method và properties, nên mình thêm dấu . ở đầu thì sao lại báo lỗi nhỉ?
Mong mọi người giải thích giúp em.
Em xin cảm ơn!!

Theo tôi, dấu "." bạn đang nói đến giúp VBA hiểu rằng bạn đang muốn nói đến đối tượng trước đó trong cấu trúc with - end with

VD: with sheets("Database")
set rngVung = .range(.range("G12"),.range("G4000").end(xlup))
end with
Dấu "." ở đầu mỗi range là bạn muốn nói đến sheets("Database")
 
Upvote 0
Bạn chưa nói rõ nếu bỏ dấu . thì còn lỗi không? Bởi mình online bằng điện thoại nên không test được. Cả 2 cách của bạn có lỗi do rngvung đã được set bằng sheets("database"). Range(...) rồi nên kết hợp với with thành Sheets("database"). Sheets("database"). Range(...)
 
Upvote 0

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Anh ơi, lọc duy nhất mà anh, unique= True rồi mà, trong file của anh A vẫn lặp lại anh ah
Em te st mấy trường hợp của anh đều vẫn trùng vì do không có tên trường

Xin lỗi bạn đúng là tôi nhầm. Advanfillter phải có tên trường mới lọc duy nhất đc.
 
Upvote 0
Em dùng một Macro sau để lấy giá trị duy nhất từ Sheets(Database) sang range("B8") sheet Ma thôi!
Code như thế này thì chạy bình thường.
PHP:
Sub UniqueValue()
    Range("B9:B500").ClearContents
    With Sheets("DataBase")
        .Range("G12:G2000").AdvancedFilter _
        Action:=xlFilterCopy, CopyToRange:=Sheets("Ma").Range("B8"), unique:=True
    End With
    
End Sub

Nhưng em thay cái Range("G12:G2000") thành một cái Range động.
PHP:
Sub DynamicRange
Dim rngVung as range
set rngvung= sheets("Database").range("G12", [G4000].end(xlup))
with sheets("Database")
.rngVung.advancedFilter............
end with
End Sub

Nhưng đoạn Code sau bị lỗi, em chưa hiểu nguyên nhân vì sao, trong khi đoạn code trên Range("G12:G2000") em thay bằng rngvung thôi!

Cả 2 code đều sai!
Không riêng gì Advanced Filter mà nói chung trong code VBA, khi các bạn tham chiếu đến một vùng nào đó thì "làm ơn" ghi rõ tên sheet (đôi lúc cần thiết phải ghi luôn tên Workbook)
Vậy nên câu lệnh:
Range("B9:B500").ClearContents là không rõ ràng (thiếu tên sheet). Đứng ở sheet khác Sheet Ma mà chạy code thì coi chừng nó "quét sạch" dữ liệu của bạn
set rngvung= sheets("Database").range("G12", [G4000].end(xlup)) cũng sai luôn ---> Chỗ màu đỏ không biết của sheet nào. Vậy nên khi đứng ở sheet Ma để chạy code thì đoạn màu đỏ sẽ được xem là Sheets("Ma").[G4000] ---> rngVung chẳng ra cái giống gì cả
.rngVung lại càng sai. Bản thân rngVung đã được thiết lập trước đó là của sheet("Database") rồi
-------------
Sửa lại:
Mã:
Sub DynamicRange()
  Dim rngVung As Range
  Set rngVung = Sheets("Database").Range("G12", Sheets("Database").Range("G4000").End(xlUp))
  rngVung.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Sheets("Ma").Range("B8"), Unique:=True
End Sub
hoặc:
Mã:
Sub DynamicRange()
  Dim rngVung As Range
  With Sheets("Database")
    Set rngVung = .Range("G12", .Range("G4000").End(xlUp))
  End With
  rngVung.AdvancedFilter xlFilterCopy, , Sheets("Ma").Range("B8"), True
End Sub
Bài này không cần công đoạn ClearContents vì khi Advanced Filter làm việc, nó cũng sẽ quét sạch dữ liệu
 
Upvote 0
Cảm ơn mọi người! Em đã hiểu được. Em bị nhầm sai 2 điểm.
1.
set rngvung= sheets("Database").range("G12", [G4000].end(xlup))

Em không ngờ rằng, ban đầu em đã set nó là dùng sheets("Database") thì caí đoạn sau, cũng nghĩ rằng nó lấy luôn cell bên sheets("Database") mà tịnh tiến đi lên. Không ngờ nó lại lấy sheets mà em đang Activate để chọn lấy.
2. đã
set rngvung= sheets("Database").range("G12", [G4000].end(xlup))
mà em còn dùng .rngVung làm nó tưởng tham chiếu
sheet("Database").
Sheets("Database").Range("G12", Sheets("Database").Range("G4000").End(xlUp))
 
Upvote 0
Bạn chưa nói rõ nếu bỏ dấu . thì còn lỗi không? Bởi mình online bằng điện thoại nên không test được. Cả 2 cách của bạn có lỗi do rngvung đã được set bằng sheets("database"). Range(...) rồi nên kết hợp với with thành Sheets("database"). Sheets("database"). Range(...)

Trong một trường hợp tương tự như vậy. Sau khi bỏ dấu . trước rngVung thì chạy được.
Xin cảm ơn!
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom