Giải thích thêm về code lọc dữ liệu của bác RoberLiem (1 người xem)

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

thaythichvba

Thành viên mới
Tham gia
19/7/14
Bài viết
20
Được thích
1
Em thấy trên gpe có bài viết của bác RoberLiem về lọc dữ liệu rất hay.
cho em hỏi 1 tý, em là thành viên mới tinh có gì các bác đừng cười nhé.
- Sao trong code của bác em không thấy chỗ nào nói đến "Kiểm soát" và người bc" mà lọc nó lại ra nhỉ các bác chỉ em làm chi tiết với.
- Cũng với nội dung yêu cầu như vậy, nhưng em muốn lấy thông tin vài cột không liên tục ở sheet Data thôi, ví dụ như cột B, cột D, cột Fcột G thì code mình phải sửa như thế nào ạ
mong tác giả và các cao thủ khác giải thích và sửa giúp em
em cảm ơn!
 

File đính kèm

Bạn có sử dụng được advance filter ko?
Record marco lại.. chỉnh sửa lại là làm đc bài này
 
Upvote 0
Em thấy trên gpe có bài viết của bác RoberLiem về lọc dữ liệu rất hay.
cho em hỏi 1 tý, em là thành viên mới tinh có gì các bác đừng cười nhé.
- Sao trong code của bác em không thấy chỗ nào nói đến "Kiểm soát" và người bc" mà lọc nó lại ra nhỉ các bác chỉ em làm chi tiết với.
- Cũng với nội dung yêu cầu như vậy, nhưng em muốn lấy thông tin vài cột không liên tục ở sheet Data thôi, ví dụ như cột B, cột D, cột Fcột G thì code mình phải sửa như thế nào ạ
mong tác giả và các cao thủ khác giải thích và sửa giúp em
em cảm ơn!
Ban xoá sạch code củ, thay cái này vào thì muốn lọc cột nào cũng được
Chỉ cần dòng tiêu đề khớp với dòng 1 bên sheet data là được
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$2" Then
    [IV2].FormulaR1C1 = "=Data!RC2=R2C5"
    Rows("5:10000").Clear
    Sheet1.[A1:H10000].AdvancedFilter 2, [IV1:IV2], [B4].CurrentRegion
End If
End Sub
 
Upvote 0
Ban xoá sạch code củ, thay cái này vào thì muốn lọc cột nào cũng được
Chỉ cần dòng tiêu đề khớp với dòng 1 bên sheet data là được
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$2" Then
    [IV2].FormulaR1C1 = "=Data!RC2=R2C5"
    Rows("5:10000").Clear
    Sheet1.[A1:H10000].AdvancedFilter 2, [IV1:IV2], [B4].CurrentRegion
End If
End Sub
cảm ơn bác rất nhiều, hay lắm ạ. nhưng em còn thêm vấn đề này nhờ bác giúp đỡ thêm:
- cột số thứ tự khi lọc ra em muốn nó điền từ 1 đến số cuối liên tục(nghĩa là không theo thứ tự bên sheet Data nữa)
- còn cái vụ điền thông tin người báo cáo thì sao hả bác
- Bác giải thích đoạn code giúp em được không, em muốn hiểu cơ chế hoạt động của nó
em cảm ơn!
 
Lần chỉnh sửa cuối:
Upvote 0
[/PHP][/QUOTE]
"- Sao trong code của bác em không thấy chỗ nào nói đến "Kiểm soát" và người bc" mà lọc nó lại ra nhỉ các bác chỉ em làm chi tiết với."

Bạn xem code ở 2 dòng :
.[D5].Offset(K + 1).Value = .[K1].Value
.[G5].Offset(K + 1).Value = .[K2].Value
và giải ẩn cột K ra sẽ hiểu .

To Quang Hải : trả lời nhầm vào bài của đại ca .
 
Lần chỉnh sửa cuối:
Upvote 0
cảm ơn bác rất nhiều, hay lắm ạ. nhưng em còn thêm vấn đề này nhờ bác giúp đỡ thêm:
- cột số thứ tự khi lọc ra em muốn nó điền từ 1 đến số cuối liên tục(nghĩa là không theo thứ tự bên sheet Data nữa)
- còn cái vụ điền thông tin người báo cáo thì sao hả bác
- Bác giải thích đoạn code giúp em được không, em muốn hiểu cơ chế hoạt động của nó
em cảm ơn!
Biết thế nào cũng đòi thêm STT mà. Cứ lấy code về xài, đến 1 lúc nào đó sẽ hiểu. Giải thích chắc tới sáng quá
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$2" Then
    [IV2].FormulaR1C1 = "=Data!RC2=R2C5"
    Rows("5:10000").Clear
    Sheet1.[A1:H10000].AdvancedFilter 2, [IV1:IV2], [B4].CurrentRegion
    If [B5] <> "" Then Range([B5], [B65536].End(3)) = [row(a:a)]
End If
End Sub
 
Upvote 0
Biết thế nào cũng đòi thêm STT mà. Cứ lấy code về xài, đến 1 lúc nào đó sẽ hiểu. Giải thích chắc tới sáng quá
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$2" Then
    [IV2].FormulaR1C1 = "=Data!RC2=R2C5"
    Rows("5:10000").Clear
    Sheet1.[A1:H10000].AdvancedFilter 2, [IV1:IV2], [B4].CurrentRegion
    If [B5] <> "" Then Range([B5], [B65536].End(3)) = [row(a:a)]
End If
End Sub
Anh giải thích dùm em cái này [B65536].End(3)) giúp em anh Hải
 
Lần chỉnh sửa cuối:
Upvote 0
Thực ra mình cũng đang mò thôi nhé bạn. Cái của mình là thịt ba gọi. Bạn xem thử nhé.
 

File đính kèm

Upvote 0
Biết thế nào cũng đòi thêm STT mà. Cứ lấy code về xài, đến 1 lúc nào đó sẽ hiểu. Giải thích chắc tới sáng quá
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$2" Then
    [IV2].FormulaR1C1 = "=Data!RC2=R2C5"
    Rows("5:10000").Clear
    Sheet1.[A1:H10000].AdvancedFilter 2, [IV1:IV2], [B4].CurrentRegion
    If [B5] <> "" Then Range([B5], [B65536].End(3)) = [row(a:a)]
End If
End Sub
cảm ơn bác nhiều lắm lắm.
 
Upvote 0
Thử thêm code # để bạn tham khảo
Code ở sheet BaoCao:
[GPECODE=vb]
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$2" Then
Dim Bang As Range
Dim EndR As Long
Set Bang = Sheet1.Range("B1:H1000")
With Sheet2
Rows("5:10000").Clear
Bang.AdvancedFilter 2, .[K1:K2],.[C4:I4]
EndR = .[C65536].End(3).Row
SoTT Range("B5" & ":B" & EndR)
DrawBorder Range("B4" & ":I" & EndR)
End With
Set Bang = Nothing
End If
End Sub

[/GPECODE]

.[K1:K2] là điều kiện
: bạn có thể thay công thức ngoài bảng tính
.[C4:I4] là nơi trả kết quả: bạn có để đặt lại thứ tự các trường theo ý mình

Code ở Module (để đánh số thứ tự và kẻ bảng)
[GPECODE=vb]
Sub SoTT(Rng As Range)
With Rng
.Resize(10000, 1).Clear
.Value = Evaluate("=row(R:R)")
.NumberFormat = "00"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
End With
End Sub
Sub DrawBorder(Rng As Range)
On Error Resume Next
With Rng
.Borders.LineStyle = 1
.Borders.Weight = 2
End With
End Sub

[/GPECODE]
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Biết thế nào cũng đòi thêm STT mà. Cứ lấy code về xài, đến 1 lúc nào đó sẽ hiểu. Giải thích chắc tới sáng quá
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$2" Then
    [IV2].FormulaR1C1 = "=Data!RC2=R2C5"
    Rows("5:10000").Clear
    Sheet1.[A1:H10000].AdvancedFilter 2, [IV1:IV2], [B4].CurrentRegion
    If [B5] <> "" Then Range([B5], [B65536].End(3)) = [row(a:a)]
End If
End Sub

Em lại phải làm phiền bác.
Bác cho em hỏi:
- Tại sao cái địa chỉ ô IV2 = Data!$B2=$E$2 ý nghĩa như thế nào
- Criteria = Baocao!$IV$1:$IV$2 để làm gì
xin chém em nhẹ tay, vì em còn nhỏ dại.
Cảm ơn bác.
 
Upvote 0
Thử thêm code # để bạn tham khảo
Code ở sheet BaoCao:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$2" Then cài lại máy 
    Dim Bang As Range
    Dim EndR As Long
    Set Bang = Sheet1.Range("B1:H1000")
        With Sheet2
            Rows("5:10000").Clear
            Bang.AdvancedFilter 2, [COLOR=#ff0000][B].[K1:K2][/B][/COLOR], [COLOR=#0000ff][B].[C4:I4][/B][/COLOR]
            EndR = .[C65536].End(3).Row
            SoTT Range("B5" & ":B" & EndR)
            DrawBorder Range("B4" & ":I" & EndR)
        End With
Set Bang = Nothing
End If
End Sub

.[K1:K2] là điều kiện
: bạn có thể thay công thức ngoài bảng tính
.[C4:I4] là nơi trả kết quả: bạn có để đặt lại thứ tự các trường theo ý mình

Code ở Module (để đánh số thứ tự và kẻ bảng)
Mã:
Sub SoTT(Rng As Range)
With Rng
    .Resize(10000, 1).Clear
    .Value = Evaluate("=row(R:R)")
    .NumberFormat = "00"
    .HorizontalAlignment = xlCenter
    .VerticalAlignment = xlCenter
End With
End Sub
Sub DrawBorder(Rng As Range)
On Error Resume Next
With Rng
    .Borders.LineStyle = 1
    .Borders.Weight = 2
End With
End Sub
Cảm ơn bác rất nhiều, em đang xem trên phone để em về mở máy áp dụng xem sao. Em chua hiểu bác bảo thay công thức ngoài bảng tính chỗ k1:k2 là sao ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn để ý cell K2 là công thức dạng logic. Nó sẽ trả kết quả về true/false -> AF sẽ chạy từ trên xuống dưới, những cái nào true nó sẽ lọc ra (Từ K2 bạn kéo công thức xuống dưới là hiểu vấn đề)..
 
Lần chỉnh sửa cuối:
Upvote 0
Anh Hải ơi. Nhờ anh hỗ trợ giúp em.
Trong file đính kèm em đã copy code của anh, 3 vấn đề còn vướng mắc nhờ anh chỉ bảo:
'- Thay đổi vị trí từ $E$2 sang một ô bất kỳ trong sheet
'- Thay đổi dữ liệu dò tìm bằng ngày sang tên khách hàng hay tiêu chí khác
=> Như vầy mình cần chỉnh sửa như thế nào ạ
'- Cuối cùng em mong muốn có một hàng cộng ở cuối dữ liệu dò tìm mà không cần phải chừa dòng. Nhờ anh hướng dẫn code này giúp em với ạ
Em cám ơn
 

File đính kèm

Upvote 0
Tranh thủ lúc hắn chưa lên diễn đàn

Anh Hải hỗ trợ giúp em.
Trong file đính kèm em đã copy code của anh, 3 vấn đề còn vướng mắc nhờ anh chỉ bảo:
(1)- Thay đổi vị trí từ $E$2 sang một ô bất kỳ trong sheet
(2)- Thay đổi dữ liệu dò tìm bằng ngày sang tên khách hàng hay tiêu chí khác
=> Như vầy mình cần chỉnh sửa như thế nào ạ
(3)- Cuối cùng em mong muốn có một hàng cộng ở cuối dữ liệu dò tìm mà không cần phải chừa dòng. Nhờ anh hướng dẫn code này giúp em với ạ

(1) Trong macro sự kiện
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$2" Then   '<=|'
    [IV2].FormulaR1C1 = "=Data!RC2=R2C5"
    Rows("5:10000").Clear
    Sheet1.[A1:H10000].AdvancedFilter 2, [IV1:IV2], [B4].CurrentRegion
    If [B5] <> "" Then Range([B5], [B65536].End(3)) = [row(a:a)]
End If
End Sub
Ta cần thay đổi nội dung dòng lệnh mà mình đánh dấu 1 cách tương ứng

(2) Muốn làm điều này 1 cách nhuần nhuyễn tự thân, bạn cần thực hiện fương thức lọc AdvancedFilter nhiều lần; Rồi sau đó mở bộ thu macro lên vài lần; Mỗi lần là lọc với các tiêu chí thay đổi khác nhau
Sau đó nghiên cứu cú fáp mà VBA đã ghi cho bạn để rõ vấn đề.

(3) Hàng cộng dồn này theo mình nên bỏ ở đâu đó rất sâu ở dòng dưới, như ở dòng 9999;
Sau khu macro lọc xong, ta cần viết vài dòng lệnh ẩn các dòng trống không cần thiết trên dòng 4 số 9 này đi.
(Lúc đó có khi tiện, vì khỏi định dạng dòng tổng này cho diêm dúa)
 
Upvote 0
(1) Trong macro sự kiện
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$2" Then   '<=|'
    [IV2].FormulaR1C1 = "=Data!RC2=R2C5"
    Rows("5:10000").Clear
    Sheet1.[A1:H10000].AdvancedFilter 2, [IV1:IV2], [B4].CurrentRegion
    If [B5] <> "" Then Range([B5], [B65536].End(3)) = [row(a:a)]
End If
End Sub
Ta cần thay đổi nội dung dòng lệnh mà mình đánh dấu 1 cách tương ứng

(2) Muốn làm điều này 1 cách nhuần nhuyễn tự thân, bạn cần thực hiện fương thức lọc AdvancedFilter nhiều lần; Rồi sau đó mở bộ thu macro lên vài lần; Mỗi lần là lọc với các tiêu chí thay đổi khác nhau
Sau đó nghiên cứu cú fáp mà VBA đã ghi cho bạn để rõ vấn đề.

(3) Hàng cộng dồn này theo mình nên bỏ ở đâu đó rất sâu ở dòng dưới, như ở dòng 9999;
Sau khu macro lọc xong, ta cần viết vài dòng lệnh ẩn các dòng trống không cần thiết trên dòng 4 số 9 này đi.
(Lúc đó có khi tiện, vì khỏi định dạng dòng tổng này cho diêm dúa)

Cám ơn bác.
Em sẽ làm như bác hướng dẫn ngay ạ.
 
Upvote 0

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

Back
Top Bottom