Tìm kiếm dữ liệu trong cột

Liên hệ QC

KhoiSMC

Thành viên thường trực
Tham gia
19/6/09
Bài viết
246
Được thích
32
Kính gửi các bạn trong diễn đàn excel

Tôi xin các bạn chỉ dẫn thực hiện hàm tìm kiếm như sau:
- Tìm kiếm dữ liệu trong một cột (giá trị tìm kiếm được nhập vào ô A44)
- Hiển thị kết quả là các dòng có cùng với giá trị với ô A44.

Xin xem file đính kèm để hiểu rõ hơn ạ.

Xin cám ơn diễn đàn nhiều.
 

File đính kèm

  • test.xlsx
    15.5 KB · Đọc: 50
Kính gửi các bạn trong diễn đàn excel

Tôi xin các bạn chỉ dẫn thực hiện hàm tìm kiếm như sau:
- Tìm kiếm dữ liệu trong một cột (giá trị tìm kiếm được nhập vào ô A44)
- Hiển thị kết quả là các dòng có cùng với giá trị với ô A44.

Xin xem file đính kèm để hiểu rõ hơn ạ.

Xin cám ơn diễn đàn nhiều.

Với bài này mình nghĩ dùng Code VBA sẽ khoẻ hơn

Cụ thể xem file đính kèm : Click vào mũi tên
Mã:
Sub Findlist()    Dim ID As Integer, i As Long, ir As Long, n As Long, j As Long
    Dim tmparr, arr
         tmparr = [A5:O39].Value
         ID = CInt([A44])
         ReDim arr(1 To UBound(tmparr, 1), 1 To 15)
         For i = 1 To UBound(tmparr, 1)
            ir = ir + 1
            If Len(tmparr(ir, 1)) Then
                If ID = Mid(tmparr(ir, 1), InStrRev(tmparr(ir, 1), "-") + 1) Then
                    n = n + 1
                    For j = 1 To 15
                        arr(n, j) = tmparr(ir, j)
                    Next
                End If
            End If
         Next
         [A45:O1000].ClearContents
         If n Then [A45].Resize(n, 15) = arr
End Sub
 
Thử code này nữa xem sao bạn nhé. Mình lọc theo ký tự cuối của cột A, lọc được các loại công văn có cùng số và ký hiệu.

Mã:
Public Sub GPE()
Dim sAr(), dAr(), I As Long, J As Long, K As Long, Tem As Long
sAr = [A5:O43].Value
ReDim dAr(1 To UBound(sAr, 1), 1 To UBound(sAr, 2))
Tem = [A44].Value
For I = 1 To UBound(sAr, 1)
    If sAr(I, 1) Like "*" & Tem Then
        K = K + 1
        For J = 1 To UBound(sAr, 2)
            dAr(K, J) = sAr(I, J)
        Next J
    End If
Next I
[A45:A1000].Resize(, UBound(sAr, 2)).ClearContents
If K Then [A45].Resize(K, UBound(sAr, 2)).Value = dAr
End Sub
 

File đính kèm

  • Loc_VBA.xls
    46.5 KB · Đọc: 33
Lần chỉnh sửa cuối:
Thử code này nữa xem sao bạn nhé. Mình lọc theo ký tự cuối của cột A, lọc được các loại công văn có cùng số và ký hiệu.

Mã:
Public Sub GPE()
Dim sAr(), dAr(), I As Long, J As Long, K As Long, Tem As Long
sAr = [A5:O43].Value
ReDim dAr(1 To UBound(sAr, 1), 1 To UBound(sAr, 2))
Tem = [A44].Value
For I = 1 To UBound(sAr, 1)
    If sAr(I, 1) Like "*" & Tem Then
        K = K + 1
        For J = 1 To UBound(sAr, 2)
            dAr(K, J) = sAr(I, J)
        Next J
    End If
Next I
[A45:A1000].Resize(, UBound(sAr, 2)).ClearContents
If K Then [A45].Resize(K, UBound(sAr, 2)).Value = dAr
End Sub
Thử delete ô A44 xem nó ra cái gì vậy xuan.nguyen82 ?
Ẹc..
 
Lần chỉnh sửa cuối:
Hic, quả này em lại bị "cốc" một cái nữa rồi.
Em sửa lại code một chút. khi A44 trống thì không có kết quả.

Mã:
Public Sub GPE()
Dim sAr(), dAr(), I As Long, J As Long, K As Long, Tem As String
sAr = [A5:O43].Value
ReDim dAr(1 To UBound(sAr, 1), 1 To UBound(sAr, 2))
Tem = [A44].Value
If Len(Tem) Then
    For I = 1 To UBound(sAr, 1)
        If sAr(I, 1) Like "*" & Tem Then
            K = K + 1
            For J = 1 To UBound(sAr, 2)
                dAr(K, J) = sAr(I, J)
            Next J
        End If
    Next I
End If
[A45:A1000].Resize(, UBound(sAr, 2)).ClearContents
If K Then [A45].Resize(K, UBound(sAr, 2)).Value = dAr
End Sub
 

File đính kèm

  • Loc_VBA2..xls
    47.5 KB · Đọc: 28
Lần chỉnh sửa cuối:
Kính gửi anh xuan.nguyen82,

Làm sao mà đưa được đoạn code của anh vào file chính của em nhỉ (file test đó chỉ là một phần nhỏ trong dữ liệu của em thôi ạ).

Thanks
 
Kính gửi anh xuan.nguyen82,

Làm sao mà đưa được đoạn code của anh vào file chính của em nhỉ (file test đó chỉ là một phần nhỏ trong dữ liệu của em thôi ạ).

Thanks

Hic, "anh xuan.nguyen82" xin trả lời bạn như sau:

Bạn mở file thật của bạn lên (đảm bảo các cấu trúc dữ liệu như file mẫu bạn gửi). Sau đó bạn ấn Alt + F11, tại ô cửa sổ bên trái kích chuột phải vào Module, rồi insert module, copy đoạn code của mình, dán vào cửa sổ module mới đó.
Trong sheet 1, bên cửa sổ Worksheet Change bạn copy đoạn này dán vào:

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$44" Then GPE
End Sub
Bạn lưu file, save as nó vào.


Khi mở file muốn chạy code, bạn vào View-Macro, Mục View Macro có tên code của mình là GPE, bạn nhấn Run là nó chạy code. sau đó muốn lọc mã thì nhập vào ô A44, enter nó sẽ ra kết quả.

Hoặc nếu file của bạn không quá lớn bạn có thể gửi lên đây mình dán đoạn code vào cho bạn.
 
Lần chỉnh sửa cuối:
Với dữ liệu test có ít nên mình lọc ngay ở ô A44, nhưng với dữ liệu thật của bạn, cũng vẫn chỉ lọc cho sheet Data phải không? Các sheet khác mình không quan tâm nhé.
Mình chỉ lọc từ Sheet Data theo yêu cầu đề bài, nhưng sẽ lọc ra 1 sheet mới nhé? Không cho chung với sheet Data vì như thế rất rối mắt mà dữ liệu của bạn dài nữa
Nếu được thì mình làm?
 
Hic, bạn xem đúng ý bạn chưa nhé. Ô C1 là điều kiện lọc, chữ hoặc số đều được. Format dạng Text.
Mã:
Public Sub GPE()
Dim sAr(), dAr(), i As Long, j As Long, K As Long, Tem As String
With Sheets("Data")
    sAr = .Range(.[A4], .[A65000].End(xlUp)).Resize(, 25).Value
End With
ReDim dAr(1 To UBound(sAr, 1), 1 To UBound(sAr, 2))
Tem = UCase([C1])
If Len(Tem) Then
    For i = 1 To UBound(sAr, 1)
        If UCase(sAr(i, 1)) Like "*" & Tem Then
            K = K + 1
            For j = 1 To UBound(sAr, 2)
                dAr(K, j) = sAr(i, j)
            Next j
        End If
    Next i
End If
[A4:A65000].Resize(, UBound(sAr, 2)).ClearContents
If K Then [A4].Resize(K, UBound(sAr, 2)).Value = dAr
End Sub

Bạn xem file đính kèm nhé.
 

File đính kèm

  • LOC_VBA2.rar
    261.8 KB · Đọc: 46
Với dữ liệu test có ít nên mình lọc ngay ở ô A44, nhưng với dữ liệu thật của bạn, cũng vẫn chỉ lọc cho sheet Data phải không? Các sheet khác mình không quan tâm nhé.
Mình chỉ lọc từ Sheet Data theo yêu cầu đề bài, nhưng sẽ lọc ra 1 sheet mới nhé? Không cho chung với sheet Data vì như thế rất rối mắt mà dữ liệu của bạn dài nữa
Nếu được thì mình làm?

Vậy hả bạn, bạn làm chung vào sheet Data cho tớ nhé, nếu về sau tớ chèn thêm dòng thêm vào vẫn được chứ a,
Vì nếu sang sheet khác thì mỗi lần tìm kiếm phải di chuyển sang sheet khác hơi mất thời gian. :)

Khoi
 
Vậy hả bạn, bạn làm chung vào sheet Data cho tớ nhé, nếu về sau tớ chèn thêm dòng thêm vào vẫn được chứ a,
Vì nếu sang sheet khác thì mỗi lần tìm kiếm phải di chuyển sang sheet khác hơi mất thời gian. :)

Khoi

Không mất thời gian đâu, khi bạn nhìn vào sheet Data, bạn muốn lọc mã nào thì bạn vào sheet Loc ngay đó, bạn gõ vào ô C1 điều kiện lọc, sẽ cho ra kết quả. Hơn nữa khi lọc nên để riêng ra 1 sheet bạn dễ nhìn hơn, còn nếu để chung với sheet Data rối mắt và mỗi lần lại phải kéo trang xuống dưới. Bạn xem file trên mình đã làm đó nhé.
 
Cám ơn bạn nhiều, nó hoạt động rồi.

Một vấn đề nhỏ nữa Khôi muốn hỏi thêm là, nếu tớ muốn tìm ở cột khác ví dụ ở cột C hoặc/và cột D thì phải sử thêm mã VBA nữa nhỉ.
Tớ định làm như sau có được không? thiếu gì thì chỉnh tiếp giúp mình với nhé.
Mình thử viết code cho cột C

Public Sub GPEC()
Dim sAr(), dAr(), i As Long, j As Long, K As Long, Tem As String
With Sheets("Data")
sAr = .Range(.[C4], .[C65000].End(xlUp)).Resize(, 25).Value
End With
ReDim dAr(1 To UBound(sAr, 1), 1 To UBound(sAr, 2))
Tem = UCase([D1])
If Len(Tem) Then
For i = 1 To UBound(sAr, 1)
If UCase(sAr(i, 1)) Like "*" & Tem Then
K = K + 1
For j = 1 To UBound(sAr, 2)
dAr(K, j) = sAr(i, j)
Next j
End If
Next i
End If
[C4:C65000].Resize(, UBound(sAr, 2)).ClearContents
If K Then [C4].Resize(K, UBound(sAr, 2)).Value = dAr
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$D$1" Then GPEC
End Sub


Vì cũng lần đầu tập tọe với VBA, việc đưa thêm code trên vào trong VBA là xong ah?

Vấn đề xin trợ giúp thêm là làm sao để trong vùng kết quả không để lặp lại duplicate những dòng trùng nhau nhỉ?

thanks bạn
Khoi
 
Lần chỉnh sửa cuối:
Mình góp vui 1 giải pháp bằng ADO theo đính kèm
Bạn đặt Name vùng dữ liệu cần lọc là Data (không gồm tiêu đề nhé)
Chép code này vào 1 modul
[GPECODE=vb]
Sub Truysuat()
Dim Cnn As New ADODB.Connection
Dim Recd As New ADODB.Recordset
Dim Cnnstr As String
Dim MySQL As String
Dim Myfile As String

Myfile = ThisWorkbook.Path & "\" & ThisWorkbook.Name

'Tao ket noi
If Val(Application.Version) < 12 Then
Cnnstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
Myfile & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1;"""
Else
Cnnstr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
Myfile & ";Extended Properties=""Excel 12.0 Xml;HDR=No;IMEX=1;"""
End If


'Mo ket noi
Cnn.Open Cnnstr

'Tao truy suat du lieu
MySQL = "SELECT DISTINCT * FROM [Data]" & Chr(13) & "WHERE Data.f1 LIKE '%" & Sheets("Sheet2").[A44].Value & "';"
Recd.Open MySQL, Cnn

'Kiem tra co du lieu truy suat khong
If Recd.EOF Then
MsgBox "Khong co du lieu thoa man dieu kien", vbOKOnly
End If

'Copy du lieu
Sheets("Sheet2").[45:500].Clear
Sheets("sheet2").[A45].CopyFromRecordset Recd

'Giai phong bo nho
If Recd.State = adStateOpen Then
Recd.Close: Set Recd = Nothing
End If
Cnn.Close: Set Cnn = Nothing

MsgBox "Hoan thanh!", vbOKOnly

End Sub

[/GPECODE]
Câu lệnh "Select Distinct " là cho phép lọc không trùng rồi nhé
 
Lần chỉnh sửa cuối:
Khi chạy code rồi mới phát sinh nhiều yêu cầu khác. Như bạn nói thì sẽ phải 2 điều kiện lọc
Cột muốn lọc (Cột 1,2,3...) nhập ở ô B1.
điều kiện lọc là những ký tự cuối nhập ở ô C1.
Nếu ô B1 bỏ trống thì mặc định là lọc theo cột 1 (Cột A)
Bạn xem file đính kèm nhé:

Mã:
Public Sub GPE()
Dim sAr(), dAr(), i As Long, j As Long, K As Long, Tem As String, Cot As Long
Cot = [B1].Value
If Cot = 0 Then Cot = 1
With Sheets("Data")
    sAr = .Range(.[A4], .[A65000].End(xlUp)).Resize(, 25).Value
End With
ReDim dAr(1 To UBound(sAr, 1), 1 To UBound(sAr, 2))
Tem = UCase([C1])
If Len(Tem) Then
    For i = 1 To UBound(sAr, 1)
        If UCase(sAr(i, Cot)) Like "*" & Tem Then
            K = K + 1
            For j = 1 To UBound(sAr, 2)
                dAr(K, j) = sAr(i, j)
            Next j
        End If
    Next i
End If
[A4:A65000].Resize(, UBound(sAr, 2)).ClearContents
If K Then [A4].Resize(K, UBound(sAr, 2)).Value = dAr
End Sub


Việc chỉnh sửa code và lọc dữ liệu không trùng sẽ có các cao thủ giúp bạn. Mình biết đến đây thôi. Hihi
 

File đính kèm

  • LOC_VBA5.rar
    264.3 KB · Đọc: 30
Lần chỉnh sửa cuối:
Mình vừa chạy xong,

Thông thường mình vẫn hay dùng cách thủ công là dùng fillter, rồi dùng điều kiện lọc theo containts thì thường hiện ra các yêu cầu của mình, tuy nhiên module của bạn lại chỉ lọc được text ở cuối chỗi thôi nên kết quả không hiện đầy đủ.
Mục đích muốn giảm một số thao tác khi dùng fillter nên muốn hỏi các cao thủ xem có cách nào không?

thanks bạn nhiều.
Khoi
 
Hi tttmuahmuah,

Mình dốt VBA lắm, vừa mới được bạn xua.nguyen82 dạy một ít, tuy nhiên đã làm rồi mà nó cứ báo lỗi debug gì đó?
Bạn add code của bạn vào file này được không ah? https://www.dropbox.com/s/b6mv9easdl...0-%20Copy.xlsx

thanks bạn
Khoi
 
Mình vừa chạy xong,

Thông thường mình vẫn hay dùng cách thủ công là dùng fillter, rồi dùng điều kiện lọc theo containts thì thường hiện ra các yêu cầu của mình, tuy nhiên module của bạn lại chỉ lọc được text ở cuối chỗi thôi nên kết quả không hiện đầy đủ.
Mục đích muốn giảm một số thao tác khi dùng fillter nên muốn hỏi các cao thủ xem có cách nào không?

thanks bạn nhiều.
Khoi

thì bạn nói ngay từ đầu viết code 1 lần cho khỏe, đề bài chưa cụ thể rõ ràng nên viết lọc như vậy. Bạn nói rõ bạn muốn lọc kiểu gì?
Bạn cũng chưa nói rõ là muốn lọc theo điều kiện nào? Tóm lại là bạn muốn lọc theo đầu chuỗi hay cuối chuỗi? hay cả chuỗi? vì mình thấy dữ liệu có những mã cuối giống nhau nhưng đầu lại không giống nhau?

Mỗi lúc thêm 1 tý, mới ra được 1 "ý" của bạn.
Bạn nói từ đầu thì đỡ mệt cho việc sửa code. Mà làm 1 lần là xong.
Hic hic....đói quá!
 
Lần chỉnh sửa cuối:
xin lỗi bạn nhé, hic mình mới tiếp cận vấn đề nên đầu óc còn tối tăm lắm, làm đến đâu mới thấy xuất hiện nhiều vấn đề vậy đó bạn. Mình xin tóm tắt lại mục đích của mình lại như sau để bạn hiểu rõ hơn nhé:
- Mình muốn lọc cả chuỗi, việc lặp lại các dòng dữ liệu cũng được không sao bạn ạ.
- Điều kiện lọc sẽ được nhập vào các ô A1, B1, C1, ... và nó sẽ lọc vào vùng dữ liệu của cột A, B, C tương ứng.

Hi, không biết đền đáp công ơn bạn giúp đỡ mình ntn đây, hihi

Khoi
 
Web KT
Back
Top Bottom