Trợ giúp dùng macro ghi lại quá trình lọc dữ liệu

Liên hệ QC

ditimdl

Thành viên thường trực
Tham gia
11/10/06
Bài viết
378
Được thích
107
Giới tính
Nam
Nghề nghiệp
Pharmacist
Nhờ các bác trên diễn đàn giúp em dùng macro để ghi lại quá trình lọc dữ liệu.
Giả sử em có vùng dữ liệu trong sheet1 từ A1:A10 chứa các phần tử A, B. Em dùng macro để ghi lại quá trình autofilter như sau:
- Lọc các phần tử A: copy sang sheet2
- Lọc các phần tử B: copy sang sheet2 sau dòng cuối cùng (Ví dụ trong quá trình em autofilter thì dòng A5 là dòng cuối cùng và Macro nó hiểu là A5.
Em gặp khó khăn khi các phần tử A, B thay đổi thì dòng cuối cùng của phần tử A có thể nhiều hơn hoặc ít hơn nên khi thực hiện macro nó bị sai kết quả.
Mong các bác giúp em xác định dòng cuối khi dữ liệu thay đổi.
 
Nhờ các bác trên diễn đàn giúp em dùng macro để ghi lại quá trình lọc dữ liệu.
Giả sử em có vùng dữ liệu trong sheet1 từ A1:A10 chứa các phần tử A, B. Em dùng macro để ghi lại quá trình autofilter như sau:
- Lọc các phần tử A: copy sang sheet2
- Lọc các phần tử B: copy sang sheet2 sau dòng cuối cùng (Ví dụ trong quá trình em autofilter thì dòng A5 là dòng cuối cùng và Macro nó hiểu là A5.
Em gặp khó khăn khi các phần tử A, B thay đổi thì dòng cuối cùng của phần tử A có thể nhiều hơn hoặc ít hơn nên khi thực hiện macro nó bị sai kết quả.
Mong các bác giúp em xác định dòng cuối khi dữ liệu thay đổi.
Đoạn code bên dưới thực hiện thao tác copy vùng dữ liệu vừa autofilter ra sheet khác. Bạn xem nhé. File của bạn phải có hai sheet, sheet("Data") và sheet("Report"), nếu chưa có hãy tạo và test đoạn code này nhé!
PHP:
Sub AutoFilterAndCopy()
Sheets("Data").[A1:A50].AutoFilter Field:=1, Criteria1:="A"      ''Lọc giá trị A
Sheets("Data").[A1].Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy Sheets("Report").[A1]    ''Copy ra sheet khác
End Sub
 
Lần chỉnh sửa cuối:
Anh hiểu sai ý em rồi, em lọc 2 lần và copy giá trị 2 lần lọc đó ra 1 sheet được chỉ định.
Ví dụ lọc lần 1 với phần tử A và copy/paste giá trị này qua sheet2 từ A1:A5
Lọc lần 2 với phần tử B và copy/paste giá trị qua sheet2 sau dòng A5
Nếu dữ liệu cố định thì macro ghi lại ko sai nhưng khi dữ liệu thay đổi thì macro lại sai.
 
Anh hiểu sai ý em rồi, em lọc 2 lần và copy giá trị 2 lần lọc đó ra 1 sheet được chỉ định.
Ví dụ lọc lần 1 với phần tử A và copy/paste giá trị này qua sheet2 từ A1:A5
Lọc lần 2 với phần tử B và copy/paste giá trị qua sheet2 sau dòng A5
Nếu dữ liệu cố định thì macro ghi lại ko sai nhưng khi dữ liệu thay đổi thì macro lại sai.

Thì bạn sửa lại chút xíu thôi mà:
Mấu chốt là chỗ này:
PHP:
Dim MaxRow as Interger
MaxRow=Sheets("Report").[A65000].End(xlUp).Row+1

Bạn xem lại đoạn code đã sửa:
PHP:
Sub AutoFilterAndCopy()
''Lọc lần 1:
Sheets("Data").[A1:A50].AutoFilter Field:=1, Criteria1:="A"      ''Lọc giá trị A
Sheets("Data").[A1].Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy Sheets("Report").[A1]    ''Copy ra sheet khác
''========================================================
''Lọc lần 2:
Dim MaxRow as Interger
MaxRow=Sheets("Report").[A65000].End(xlUp).Row+1
Sheets("Data").[A1:A50].AutoFilter Field:=1, Criteria1:="B"      ''Lọc giá trị B
Sheets("Data").[A1].Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy Sheets("Report").Range("A" & MaxRow)
End Sub
 
Lần chỉnh sửa cuối:
Cảm ơn code của anh, em sẽ test xem thế nào. Hiện tại em đang dùng cái này để nó hiểu và paste vào dòng cuối cùng thấy cũng ok.
PHP:
    Range("A100").Select: Selection.End(xlUp).Select
    Selection.Offset(1, 0).Select
 
Cảm ơn code của anh, em sẽ test xem thế nào. Hiện tại em đang dùng cái này để nó hiểu và paste vào dòng cuối cùng thấy cũng ok.
PHP:
    Range("A100").Select: Selection.End(xlUp).Select
    Selection.Offset(1, 0).Select
PHP:
Dim MaxRow as Interger
MaxRow=Sheets("Report").[A65000].End(xlUp).Row+1
Hai đoạn code này nhìn chung là tương tự nhau mà bạn. Tuy nhiên đoạn code của bạn nên viết ngắn lại chút:

PHP:
Như thế này là đủ:
Range("A100").End(xlUp).Offset(1, 0).Select
 
Khi ta lọc dữ liệu lần 2 để chép vào ô sau cùng đã xác định nhưng kết quả lọc lần 2 là rỗng(không có phần tử B) thì nó báo lỗi khi đoạn naỳ:
PHP:
Range("A100").Select: Selection.End(xlUp).Select 
    Selection.Offset(1, 0).Select  
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
Nếu dữ liệu lọc có đầy đủ phần tử A, B thì macro trên chạy bình thường.
Vậy có cách nào để cho nó hiểu khi lọc ra kết quả là rỗng thì nó dừng lại bước xác định ô cuối và paste vào dòng sau cùng không vậy các bác?
 
Khi ta lọc dữ liệu lần 2 để chép vào ô sau cùng đã xác định nhưng kết quả lọc lần 2 là rỗng(không có phần tử B) thì nó báo lỗi khi đoạn naỳ:
PHP:
Range("A100").Select: Selection.End(xlUp).Select 
    Selection.Offset(1, 0).Select  
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
Nếu dữ liệu lọc có đầy đủ phần tử A, B thì macro trên chạy bình thường.
Vậy có cách nào để cho nó hiểu khi lọc ra kết quả là rỗng thì nó dừng lại bước xác định ô cuối và paste vào dòng sau cùng không vậy các bác?

Trước khi Paste, bạn phải kiểm tra xem dữ liệu cần paste có rỗng hay không cái đã rồi mới patse:
Hãy thử đoạn code này:
PHP:
Sub AutoFilterAndCopy()
Sheets("Data").[A1:A50].AutoFilter Field:=1, Criteria1:="A"
Sheets("Data").[A1].Select
Range(Selection, Selection.End(xlDown)).Select
''//Kiểm tra xem dữ liệu filter có rỗng hay không:
''//Nếu rỗng thì thoát khỏi thủ tục:
If Selection.Rows.Count >= 65536 Then
Exit Sub
Else
''//Nếu không rỗng mới copy:
Selection.Copy Sheets("Report").[A65000].End(xlUp).Offset(1, 0)
End If
End Sub
 
Lần chỉnh sửa cuối:
Bạn dùng AutoFilter lọc 2 lần theo 2 điều kiện... Tôi đang nghĩ tại sao bạn không dùng Advanced Filter lọc cùng lúc 2 điều kiện luôn nhỉ?
 
Mình sẽ test thử code của ca_dafi xem thế nào.
To NDU: Đây chỉ là ví dụ thôi bạn à, file chính của mình lọc ra tới 4đk nên phải lọc 2 lần sau đó copy vào 1sheet nên mới gặp vướng mắc chổ này.
 
Mình sẽ test thử code của ca_dafi xem thế nào.
To NDU: Đây chỉ là ví dụ thôi bạn à, file chính của mình lọc ra tới 4đk nên phải lọc 2 lần sau đó copy vào 1sheet nên mới gặp vướng mắc chổ này.
Advanced Filter có thể lọc được rất nhiều điều kiện mà bạn
Chưa thấy file mẫu của bạn nên khó hình dung bạn đang cần lọc theo điều kiện thế nào? Sao bạn không đưa lên, biết đâu AF làm được thì sao?
 
Mình chỉ dùng autofilter thôi, AF mắc công tạo ra vùng điều kiện. Trên cùng 1 CSDL lúc thì AF lúc thì Autofilter phiền lắm. Hơn nữa mình ghi lại macro nên chỉ cần vậy thôi.
 
Trước khi Paste, bạn phải kiểm tra xem dữ liệu cần paste có rỗng hay không cái đã rồi mới patse:
Hãy thử đoạn code này:
PHP:
Sub AutoFilterAndCopy()
Sheets("Data").[A1:A50].AutoFilter Field:=1, Criteria1:="A"
Sheets("Data").[A1].Select
Range(Selection, Selection.End(xlDown)).Select
''//Kiểm tra xem dữ liệu filter có rỗng hay không:
''//Nếu rỗng thì thoát khỏi thủ tục:
If Selection.Rows.Count >= 65536 Then
Exit Sub
Else
"//Nếu không rỗng mới copy:
Selection.Copy Sheets("Report").[A65000].End(xlUp).Offset(1, 0)
End If
End Sub
To Ca_dafi: Code này hoạt động tốt nhưng em lại gặp khó khăn khi dữ liệu rỗng thì thủ tục trên thoát và các bước lọc tiếp theo bị dừng lại (Các sub sau bị dừng lại). Anh giúp em sửa lại dùm: Khi kiểm tra dữ liệu filter rỗng thì bỏ qua và tiến hành lọc các điều kiện tiếp theo.
PHP:
Sub AutoFilterAndCopy()
Sheets("Data").[A1:A50].AutoFilter Field:=1, Criteria1:="A"
Sheets("Data").[A1].Select
Range(Selection, Selection.End(xlDown)).Select
''//Kiểm tra xem dữ liệu filter có rỗng hay không:
''//Nếu rỗng thì thoát khỏi thủ tục:
If Selection.Rows.Count >= 65536 Then
Exit Sub
Else
''//Nếu không rỗng mới copy:
Selection.Copy Sheets("Report").[A65000].End(xlUp).Offset(1, 0)
End If
'Phần này không hoạt động được
Sheets("Data").[A1:A50].AutoFilter Field:=1, Criteria1:="D"
Sheets("Data").[A1].Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy 
Sheets("Report2).select
range("A2").select
....
End Sub
Phần code không hoạt động có phải do sub kiểm tra dữ liệu trên không? Giúp em sửa lại nha.
 
Lần chỉnh sửa cuối:
em thử xem có thật không post bài ở mục này không
 
AutoFilter

Mình sẽ test thử code của ca_dafi xem thế nào.
To NDU: Đây chỉ là ví dụ thôi bạn à, file chính của mình lọc ra tới 4đk nên phải lọc 2 lần sau đó copy vào 1sheet nên mới gặp vướng mắc chổ này.

Với AutoFilter bạn có thể lọc 1 lần với vô số điều kiện! Chỉ 4 đk mà bạn mất công lọc đến 2 lần, nếu với 16 điều kiện thì sao?
(Hãy quan sát cách AutoFilter của Excel sẽ suy ra khả năng lọc 1 lần nhiều điều kiện)
 
Web KT
Back
Top Bottom