[HELP] Trích lọc dữ liệu có nhiều điều kiện (1 người xem)

  • Thread starter Thread starter Tomtep
  • Ngày gửi Ngày gửi
Liên hệ QC

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

Tomtep

Thành viên mới
Tham gia
30/11/07
Bài viết
21
Được thích
13
Em đang làm cái bảng theo dõi hồ sơ tài liệu của dự án. Em muốn nhờ các bác viết giúp cái code vba để trích dữ liệu từ sheet "Theo doi ho so" đưa sang sheet "Tra cuu ho so" theo 3 điều kiện (điều kiện nào để trống thì không tìm theo điều kiện đó):
1. Văn bản từ ngày A đến ngày B
2. Loại văn bản (có danh sách để chọn)
3. Tìm kiếm theo từ khóa.
Sau khi nhập xong các điều kiện trên thì bấm nút TÌM KIẾM sẽ liệt kê ra các dữ liệu thỏa mãn điều kiện như trên.
Em gửi kèm cái file theo dõi hồ sơ nhờ các bác chỉ giúp em với.
Em xin cảm ơn nhiều
Thân mến
 

File đính kèm

Em đang làm cái bảng theo dõi hồ sơ tài liệu của dự án. Em muốn nhờ các bác viết giúp cái code vba để trích dữ liệu từ sheet "Theo doi ho so" đưa sang sheet "Tra cuu ho so" theo 3 điều kiện (điều kiện nào để trống thì không tìm theo điều kiện đó):
1. Văn bản từ ngày A đến ngày B
2. Loại văn bản (có danh sách để chọn)
3. Tìm kiếm theo từ khóa.
Sau khi nhập xong các điều kiện trên thì bấm nút TÌM KIẾM sẽ liệt kê ra các dữ liệu thỏa mãn điều kiện như trên.
Em gửi kèm cái file theo dõi hồ sơ nhờ các bác chỉ giúp em với.
Em xin cảm ơn nhiều
Thân mến

điều kiện thứ 3 (tim theo từ khóa) là tìm theo cột nào?
 
Upvote 0
Điều kiện số 3 tìm trong Cột B sheet "Theo doi ho so" bác ơi--=0
dùng code sau
Mã:
Sub GPE()
Dim i As Long, j As Integer, iRow As Long, Arr(), k As Long, Ngay1, Ngay2, LoaiVB As String
iRow = Sheets(2).Range("B5").End(xlDown).Row
ReDim Arr(1 To iRow, 1 To 11)
Ngay1 = Sheets(1).Range("C2"):   Ngay2 = Sheets(1).Range("F2")
LoaiVB = Sheets(1).Range("C3")
With Worksheets(2).Range("b5:b" & iRow)
    Set c = .Find(Sheets(1).Range("C4"), LookIn:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            If Sheets(2).Cells(c.Row, 4) = LoaiVB And Sheets(2).Cells(c.Row, 7) >= Ngay1 _
                            And Sheets(2).Cells(c.Row, 7) <= Ngay2 Then
                k = k + 1: Arr(k, 1) = k
                For j = 2 To 11
                    Arr(k, j) = Sheets(2).Cells(c.Row, j)
                Next
            End If
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With
Sheets(1).Range("A8:K" & Sheets(1).Range("B65500").End(xlUp).Row + 2).ClearContents
If k > 0 Then Sheets(1).Range("A8").Resize(k, 11) = Arr
End Sub
 

File đính kèm

Upvote 0
dùng code sau
Mã:
Sub GPE()
Dim i As Long, j As Integer, iRow As Long, Arr(), k As Long, Ngay1, Ngay2, LoaiVB As String
iRow = Sheets(2).Range("B5").End(xlDown).Row
ReDim Arr(1 To iRow, 1 To 11)
Ngay1 = Sheets(1).Range("C2"):   Ngay2 = Sheets(1).Range("F2")
LoaiVB = Sheets(1).Range("C3")
With Worksheets(2).Range("b5:b" & iRow)
    Set c = .Find(Sheets(1).Range("C4"), LookIn:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            If Sheets(2).Cells(c.Row, 4) = LoaiVB And Sheets(2).Cells(c.Row, 7) >= Ngay1 _
                            And Sheets(2).Cells(c.Row, 7) <= Ngay2 Then
                k = k + 1: Arr(k, 1) = k
                For j = 2 To 11
                    Arr(k, j) = Sheets(2).Cells(c.Row, j)
                Next
            End If
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With
Sheets(1).Range("A8:K" & Sheets(1).Range("B65500").End(xlUp).Row + 2).ClearContents
If k > 0 Then Sheets(1).Range("A8").Resize(k, 11) = Arr
End Sub
Hi bạn,
Mình cám ơn bạn đã hỗ trợ, mình thử thay BBH bằng loại văn bản khác rồi bấm TÌM KIẾM thì không ra kết quả, hoặc xóa chữ họp trong ô tìm kiếm từ khóa thì tìm kiếm không ra văn bản. Bạn xem lại code giúp mình nhé.
Tks
 
Upvote 0
Hi bạn,
Mình cám ơn bạn đã hỗ trợ, mình thử thay BBH bằng loại văn bản khác rồi bấm TÌM KIẾM thì không ra kết quả, hoặc xóa chữ họp trong ô tìm kiếm từ khóa thì tìm kiếm không ra văn bản. Bạn xem lại code giúp mình nhé.
Tks
không thỏa điều kiện tìm kiếm thì làm sao ra kết quả được +-+-+-+ +-+-+-+ +-+-+-+
bạn phải quan sát rồi nhập điều kiện khả thi mới ra kết quả
Bạn xóa chữ họp thì muốn trả về kết quả chỉ theo 3 điều kiện còn lại?
 
Upvote 0
không thỏa điều kiện tìm kiếm thì làm sao ra kết quả được +-+-+-+ +-+-+-+ +-+-+-+
bạn phải quan sát rồi nhập điều kiện khả thi mới ra kết quả
Bạn xóa chữ họp thì muốn trả về kết quả chỉ theo 3 điều kiện còn lại?
Ví dụ nhé bạn:
Ngày mình để nguyên (ko thay đổi) ; loại văn bản mình chọn là BBLV (biên bản làm việc); tìm kiếm từ khóa mình để trống sau đó bấm tìm kiếm ko ra văn bản nào trong khi thực tế có 13 cái Biên bản làm việc
Tương tự với loại văn bản Email thực tế có 1 kết quả nhưng code không đưa ra kết quả nào.
Còn nếu chọn loại văn bản là "Tất cả các văn bản" thì cũng không ra kết quả nào, mà thực tế phải ra hết các văn bản chứ?
Bạn xem lại thử có đúng ko nha.
TKS
 
Lần chỉnh sửa cuối:
Upvote 0
Ví dụ nhé bạn:
Ngày mình để nguyên (ko thay đổi) ; loại văn bản mình chọn là BBLV (biên bản làm việc); tìm kiếm từ khóa mình để trống sau đó bấm tìm kiếm ko ra văn bản nào trong khi thực tế có 13 cái Biên bản làm việc
Tương tự với loại văn bản Email thực tế có 1 kết quả nhưng code không đưa ra kết quả nào.
Còn nếu chọn loại văn bản là "Tất cả các văn bản" thì cũng không ra kết quả nào, mà thực tế phải ra hết các văn bản chứ?
Bạn xem lại thử có đúng ko nha.
TKS
Bạn chạy code mới
Mã:
Sub GPE()
Dim i As Long, j As Integer, iRow As Long, Arr(), k As Long, Ngay1, Ngay2, LoaiVB As String
iRow = Sheets(2).Range("B5").End(xlDown).Row
ReDim Arr(1 To iRow, 1 To 11)
Ngay1 = Sheets(1).Range("C2"):   Ngay2 = Sheets(1).Range("F2")
LoaiVB = Sheets(1).Range("C3")
If Sheets(1).Range("C4") = "" Then Sheets(1).Range("C4") = " "
With Worksheets(2).Range("b4:b" & iRow)
    Set c = .Find(Sheets(1).Range("C4"), LookIn:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            If Sheets(2).Cells(c.Row, 4) = LoaiVB Or Sheets(1).Range("w3") = LoaiVB Then
                If Sheets(2).Cells(c.Row, 7) >= Ngay1 And Sheets(2).Cells(c.Row, 7) <= Ngay2 Then
                    k = k + 1: Arr(k, 1) = k
                    For j = 2 To 11
                        Arr(k, j) = Sheets(2).Cells(c.Row, j)
                    Next
                End If
            End If
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With
Sheets(1).Range("A8:K" & Sheets(1).Range("B65500").End(xlUp).Row + 2).Clear
If k > 0 Then
    Sheets(1).Range("A8").Resize(k, 11) = Arr
    Sheets(1).Range("A8").Resize(k, 11).Borders.LineStyle = 1
End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn chạy code mới
Mã:
Sub GPE()
Dim i As Long, j As Integer, iRow As Long, Arr(), k As Long, Ngay1, Ngay2, LoaiVB As String
iRow = Sheets(2).Range("B5").End(xlDown).Row
ReDim Arr(1 To iRow, 1 To 11)
Ngay1 = Sheets(1).Range("C2"):   Ngay2 = Sheets(1).Range("F2")
LoaiVB = Sheets(1).Range("C3")
If Sheets(1).Range("C4") = "" Then Sheets(1).Range("C4") = " "
With Worksheets(2).Range("b4:b" & iRow)
    Set c = .Find(Sheets(1).Range("C4"), LookIn:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            If Sheets(2).Cells(c.Row, 4) = LoaiVB Or Sheets(1).Range("w3") = LoaiVB Then
                If Sheets(2).Cells(c.Row, 7) >= Ngay1 And Sheets(2).Cells(c.Row, 7) <= Ngay2 Then
                    k = k + 1: Arr(k, 1) = k
                    For j = 2 To 11
                        Arr(k, j) = Sheets(2).Cells(c.Row, j)
                    Next
                End If
            End If
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With
Set c = Nothing
Sheets(1).Range("A8:K" & Sheets(1).Range("B65500").End(xlUp).Row + 2).Clear
If k > 0 Then
    Sheets(1).Range("A8").Resize(k, 11) = Arr
    Sheets(1).Range("A8").Resize(k, 11).Borders.LineStyle = 1
End If
End Sub
Hi bạn, lần này thấy chuẩn rồi bạn, để mình kiểm tra lại kỹ xem còn lỗi gì nữa không, cám ơn bạn nhiều nhé
 
Upvote 0
Bạn @HieuCD cho mình hỏi thêm tý nữa:
- Cái code sao chạy ra cột ngày (G và J) lại dạng số chứ ko ra dạng dd/mm/yyyy
- Bạn chỉnh code giúp để cái cột K, cột K về dạng Wrap text (tự động xuống dòng khi nội dung dài), tất cả ô đều canh giữa thay vì canh dưới như hiện tại
- Bạn chỉnh code giúp để nét phân chia dòng dạng ... thay vì gạch đứt
- Và nếu được thêm giúp mình code tự động hide các dòng trống bên dưới như kiểu định dạng trang in cho đẹp ấy.
Tks
 
Upvote 0
Bạn chạy code mới
Mã:
Sub GPE()
Dim i As Long, j As Integer, iRow As Long, Arr(), k As Long, Ngay1, Ngay2, LoaiVB As String
iRow = Sheets(2).Range("B5").End(xlDown).Row
ReDim Arr(1 To iRow, 1 To 11)
Ngay1 = Sheets(1).Range("C2"):   Ngay2 = Sheets(1).Range("F2")
LoaiVB = Sheets(1).Range("C3")
If Sheets(1).Range("C4") = "" Then Sheets(1).Range("C4") = " "
With Worksheets(2).Range("b4:b" & iRow)
    Set c = [COLOR=#ff0000].Find(Sheets(1).Range("C4"), LookIn:=xlValues)[/COLOR]
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            If Sheets(2).Cells(c.Row, 4) = LoaiVB Or Sheets(1).Range("w3") = LoaiVB Then
                If Sheets(2).Cells(c.Row, 7) >= Ngay1 And Sheets(2).Cells(c.Row, 7) <= Ngay2 Then
                    k = k + 1: Arr(k, 1) = k
                    For j = 2 To 11
                        Arr(k, j) = Sheets(2).Cells(c.Row, j)
                    Next
                End If
            End If
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With
Sheets(1).Range("A8:K" & Sheets(1).Range("B65500").End(xlUp).Row + 2).Clear
If k > 0 Then
    Sheets(1).Range("A8").Resize(k, 11) = Arr
    Sheets(1).Range("A8").Resize(k, 11).Borders.LineStyle = 1
End If
End Sub

Cá là code này sai! Chỗ màu đỏ cần xem lại
----------------------
Với dạng bài lọc kiểu này, tôi lại thích dùng Advanced Filter hơn
 
Upvote 0
Điều kiện số 3 tìm trong Cột B sheet "Theo doi ho so" bác ơi--=0

góp vui với bạn một bài làm bằng ADO
nếu bạn chạy mà nó báo lổi "User-defined type not defined"
thì mở của sổ vba (Alt F11), vào Tool
Tools > References > Check the checkbox in front of "Microsoft ActiveX Data Objects 2.5 Library"
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
góp vui với bạn một bài làm bằng ADO
nếu bạn chạy mà nó báo lổi "User-defined type not defined"
thì mở của sổ vba (Alt F11), vào Tool
Tools > References > Check the checkbox in front of "Microsoft ActiveX Data Objects 2.5 Library"
Chạy tốt bác ơi, nhưng sao chọn loại văn bản là "Tất cả các văn bản" thì báo ko tìm đc kết quả. Với cả có cách nào đánh số thứ tự kết quả từ 1 trở đi ko bác, kq nó ra stt như bên sheet2
 
Upvote 0
Cá là code này sai! Chỗ màu đỏ cần xem lại
----------------------
Với dạng bài lọc kiểu này, tôi lại thích dùng Advanced Filter hơn
trong file nầy yêu cầu tìm từ sheets(1) ô C4 có trong ô ở cột B sheets(2) nên dùng cách nầy, chạy thử thấy được
các tham số của Find mình không rành, chỉ làm và thử thôi. Cám ơn bạn
mới đọc lại bài của Nguyễn Cảnh Hoàng Danh và hiểu hơn về Find, đúng là sơ sót lớn
 
Lần chỉnh sửa cuối:
Upvote 0
bạn Format dòng 5 trong sheet Theo doi ho so theo ý thích, mình sẽ lấy Format nầy qua bảng kết quả
Mã:
Sub GPE()
Dim i As Long, j As Integer, iRow As Long, Arr(), k As Long, Ngay1, Ngay2, LoaiVB As String
Application.ScreenUpdating = False
iRow = Sheets(2).Range("B5").End(xlDown).Row
ReDim Arr(1 To iRow, 1 To 11)
Ngay1 = Sheets(1).Range("C2"):   Ngay2 = Sheets(1).Range("F2")
LoaiVB = Sheets(1).Range("C3")
If Sheets(1).Range("C4") = "" Then Sheets(1).Range("C4") = " "
With Worksheets(2).Range("b4:b" & iRow)
    Set c = .Find(Sheets(1).Range("C4"), Lookat:=xlPart)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            If Sheets(2).Cells(c.Row, 4) = LoaiVB Or Sheets(1).Range("w3") = LoaiVB Then
                If Sheets(2).Cells(c.Row, 7) >= Ngay1 And Sheets(2).Cells(c.Row, 7) <= Ngay2 Then
                    k = k + 1: Arr(k, 1) = k
                    For j = 2 To 11
                        Arr(k, j) = Sheets(2).Cells(c.Row, j)
                    Next
                End If
            End If
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With
Sheets(1).Range("A8:K" & Sheets(1).Range("B65500").End(xlUp).Row + 2).Clear
If k > 0 Then
    Sheets(1).Range("A8").Resize(k, 11) = Arr
    Sheets(2).Range("A5:K5").Copy
    Sheets(1).Range("A8").Resize(k, 11).Select
    Selection.PasteSpecial Paste:=xlPasteFormats
    Application.CutCopyMode = False
    Sheets(1).Range("A8").Select
End If
Application.ScreenUpdating = True
End Sub
còn vụ Hide dòng, thì phải biết Hide từ dòng cuối đến dòng nào?
 
Lần chỉnh sửa cuối:
Upvote 0
bạn Format dòng 5 trong sheet Theo doi ho so theo ý thích, mình sẽ lấy Format nầy qua bảng kết quả
Mã:
Sub GPE()
......
[COLOR=#0000cd]If Sheets(1).Range("C4") = "" Then Sheets(1).Range("C4") = " "[/COLOR]
With Worksheets(2).Range("b4:b" & iRow)
    [COLOR=#ff0000]Set c = .Find(Sheets(1).Range("C4"), Lookat:=xlPart)[/COLOR]
  ........................
End Sub
Sửa gần đúng rồi nhưng sao được chỗ này lại mất chỗ kia thế? Lookin:=xlValues đâu rồi?
Dùng Find Method, bạn ghi càng rõ ràng nó chạy càng chính xác (nếu không sẽ có lúc nó tào lao)
Chỗ màu đỏ tôi nghĩ nên vầy:
Mã:
Set c = .Find([COLOR=#ff0000]"*" & Sheets(1).Range("C4") & "*"[/COLOR], , xlValues, [COLOR=#ff0000]xlWhole[/COLOR])
(tìm chính xác có kết hợp với ký tự đại diện. Mục đích khi xóa C4 thì ta sẽ tìm "*", tức là tìm tất cả)
Với code sửa lại thì chỗ màu xanh có thể xóa đi
-----------------
Thêm chút góp ý nữa chắc không thừa: KHAI BÁO BIẾN ĐẦY ĐỦ
 
Lần chỉnh sửa cuối:
Upvote 0
bạn Format dòng 5 trong sheet Theo doi ho so theo ý thích, mình sẽ lấy Format nầy qua bảng kết quả
Mã:
Sub GPE()
Dim i As Long, j As Integer, iRow As Long, Arr(), k As Long, Ngay1, Ngay2, LoaiVB As String
Application.ScreenUpdating = False
iRow = Sheets(2).Range("B5").End(xlDown).Row
ReDim Arr(1 To iRow, 1 To 11)
Ngay1 = Sheets(1).Range("C2"):   Ngay2 = Sheets(1).Range("F2")
LoaiVB = Sheets(1).Range("C3")
If Sheets(1).Range("C4") = "" Then Sheets(1).Range("C4") = " "
With Worksheets(2).Range("b4:b" & iRow)
    Set c = .Find(Sheets(1).Range("C4"), Lookat:=xlPart)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            If Sheets(2).Cells(c.Row, 4) = LoaiVB Or Sheets(1).Range("w3") = LoaiVB Then
                If Sheets(2).Cells(c.Row, 7) >= Ngay1 And Sheets(2).Cells(c.Row, 7) <= Ngay2 Then
                    k = k + 1: Arr(k, 1) = k
                    For j = 2 To 11
                        Arr(k, j) = Sheets(2).Cells(c.Row, j)
                    Next
                End If
            End If
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With
Sheets(1).Range("A8:K" & Sheets(1).Range("B65500").End(xlUp).Row + 2).Clear
If k > 0 Then
    Sheets(1).Range("A8").Resize(k, 11) = Arr
    Sheets(2).Range("A5:K5").Copy
    Sheets(1).Range("A8").Resize(k, 11).Select
    Selection.PasteSpecial Paste:=xlPasteFormats
    Application.CutCopyMode = False
    Sheets(1).Range("A8").Select
End If
Application.ScreenUpdating = True
End Sub
còn vụ Hide dòng, thì phải biết Hide từ dòng cuối đến dòng nào?
Code chạy tốt rồi bạn HieuCd ơi, nhờ bạn chỉnh code thêm để tự động đóng khung (thêm nét kẻ đậm bên dưới ô kết quả cuối cùng để tiện cho in ấn báo cáo) và tự động điều chỉnh chiều cao dòng cho phù hợp với nội dung nữa (vì nhiều kết quả liệt kê ra không thấy hết nội dung cho nội dung dài) là đẹp.
TKS
(Xem hình đính kèm chỗ mình bôi vàng)
 

File đính kèm

  • Capture.jpg
    Capture.jpg
    22.5 KB · Đọc: 23
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom