Em nhờ giúp đỡ code lọc ( countif ) 2 lần theo ví dụ sau ạ! (1 người xem)

Liên hệ QC

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

babe_nice

Thành viên chính thức
Tham gia
30/8/09
Bài viết
89
Được thích
9
Em nhờ các anh, Thầy giúp đỡ:
Em có cột Số HD, và Ma CH. Em muốn lọc cột Số HD xem có trùng không, nếu trùng thì xét tiếp cột Ma CH, nếu Ma CH trùng ( >1) thì loại, nếu duy nhất (=1 ) thì xuất hiện mã CH đó và bôi màu.
Em cám ơn các anh, Thầy.
( )
 

File đính kèm

Vấn đề 1:
F3=IF(AND(COUNTIF($A$3:$A$65000,A3)>1,COUNTIF($C$3:$C$65000,C3)=1),C3,"") Rồi kéo xuống
Vấn đề 2 (bôi màu): Sử dụng Conditional Formatting với (Bôi đen từ F3 đến hết):
Use a formula to determine which cells to format có công thức là : =F3<>"", chọn format là bôi màu vàng.
 
Lần chỉnh sửa cuối:
Upvote 0
Thêm file cho bạn nhé! Lúc nãy quên chưa đính file
 

File đính kèm

Upvote 0
Thêm file cho bạn nhé! Lúc nãy quên chưa đính file
em cám ơn anh..
Nhưng không đơn giản thế ạ
( cái này do em giải thích kém )
em nói rõ hơn:
tức là khi em lọc 1, ra những giá trị trong cột A xuất hiện lớn hơn 1 lần
sau đó mới xét nhưng giá trị đó tương ứng với Ma CH chỉ xuất hiện 1 lần.
Ví dụ, bây giờ em sửa ô C14 = R là kết quả ở cột F13 nhảy sai. Mặc dù F13 là kết quả đúng.
P/S: với lại em nghĩ, nếu dữ liệu hơn 30.000 dòng, excel chạy " từ từ" lắm ạ. Em test rồi ạ, nên giải pháp = code thì hợp lý hơn
 

File đính kèm

Upvote 0
em cám ơn anh..
Nhưng không đơn giản thế ạ
( cái này do em giải thích kém )
em nói rõ hơn:
tức là khi em lọc 1, ra những giá trị trong cột A xuất hiện lớn hơn 1 lần
sau đó mới xét nhưng giá trị đó tương ứng với Ma CH chỉ xuất hiện 1 lần.
Ví dụ, bây giờ em sửa ô C14 = R là kết quả ở cột F13 nhảy sai. Mặc dù F13 là kết quả đúng.
P/S: với lại em nghĩ, nếu dữ liệu hơn 30.000 dòng, excel chạy " từ từ" lắm ạ. Em test rồi ạ, nên giải pháp = code thì hợp lý hơn
Với 30000 dòng dữ liệu, nếu khoảng 10000 dòng đạt yêu cầu phải tô màu thì đây là cả vấn đề vì màu mè là làm việc trực tiếp trên sheet, nếu có thể thì bạn nên đổi cách nhận kết quả
Viết thử thôi, có mấy dòng dữ liệu nó chạy xoẹt là xong nhưng 30000 thì....má ơi. Híc
Thân
Mã:
Public Sub MauMau()
    Dim Vung, Tam, I, Wf, Dic, K, kK, M
        Application.ScreenUpdating = False
        Set Vung = Range([A3], [A50000].End(xlUp)).Resize(, 3): Set Wf = Application.WorksheetFunction
        Set Dic = CreateObject("scripting.dictionary")
        ReDim M(1 To Vung.Rows.Count, 1 To 1)
            For I = 1 To Vung.Rows.Count
                If Wf.CountIf(Vung.Columns(1), Vung(I, 1)) > 1 Then
                    Tam = Vung(I, 1) & Vung(I, 3)
                    If Not Dic.exists(Tam) Then
                        K = K + 1: Dic.Add Tam, K: M(K, 1) = Vung(I, 3).Address
                    Else
                        kK = Dic.Item(Tam): M(kK, 1) = ""
                    End If
                End If
            Next I
            Vung.Columns(3).Interior.ColorIndex = xlNone
                For I = 1 To UBound(M)
                    If M(I, 1) <> "" Then Range(M(I, 1)).Interior.ColorIndex = 6
                Next I
        Application.ScreenUpdating = True
End Sub
 
Upvote 0
Với 30000 dòng dữ liệu, nếu khoảng 10000 dòng đạt yêu cầu phải tô màu thì đây là cả vấn đề vì màu mè là làm việc trực tiếp trên sheet, nếu có thể thì bạn nên đổi cách nhận kết quả
Viết thử thôi, có mấy dòng dữ liệu nó chạy xoẹt là xong nhưng 30000 thì....má ơi. Híc
Thân
Mã:
Public Sub MauMau()
    Dim Vung, Tam, I, Wf, Dic, K, kK, M
        Application.ScreenUpdating = False
        Set Vung = Range([A3], [A50000].End(xlUp)).Resize(, 3): Set Wf = Application.WorksheetFunction
        Set Dic = CreateObject("scripting.dictionary")
        ReDim M(1 To Vung.Rows.Count, 1 To 1)
            For I = 1 To Vung.Rows.Count
                If Wf.CountIf(Vung.Columns(1), Vung(I, 1)) > 1 Then
                    Tam = Vung(I, 1) & Vung(I, 3)
                    If Not Dic.exists(Tam) Then
                        K = K + 1: Dic.Add Tam, K: M(K, 1) = Vung(I, 3).Address
                    Else
                        kK = Dic.Item(Tam): M(kK, 1) = ""
                    End If
                End If
            Next I
            Vung.Columns(3).Interior.ColorIndex = xlNone
                For I = 1 To UBound(M)
                    If M(I, 1) <> "" Then Range(M(I, 1)).Interior.ColorIndex = 6
                Next I
        Application.ScreenUpdating = True
End Sub
em cám ơn anh concogia:
-
dữ liệu chạy đúng ạ
- còm màu...vâng..tùy bài...em sẽ thay đổi, nếu cần em tắt vòng lặp For ở cuối đi là được đúng không anh?
 
Upvote 0
Tôi thật sự không hiểu ý bạn. Tôi thay C14 = R, kết quả đúng mà. Cột Ma CH chữ R xuất hiện 2 lần (theo của bạn là 1 lần mới lọc) nên loại luôn. Đâu đưa vào kết quả đâu?
 
Upvote 0
Tôi thật sự không hiểu ý bạn. Tôi thay C14 = R, kết quả đúng mà. Cột Ma CH chữ R xuất hiện 2 lần (theo của bạn là 1 lần mới lọc) nên loại luôn. Đâu đưa vào kết quả đâu?
em chào anh.
Những mã ở Cột A xuất hiện lớn hơn 1. Sau đó chỉ xét những mã đó thôi.
Thôi, em nói luôn công việc thực tế: tìm xem Hóa đơn nào xuất hiện hơn 1 lần, với điều kiện chỉ xuất hiện ở 1 Cửa hàng thì được, nếu xuất hiện ở 2 Cửa hàng khác nhau thi có cách phát hiện vì đây là sai. ( màu )
 
Upvote 0
Với 30000 dòng dữ liệu, nếu khoảng 10000 dòng đạt yêu cầu phải tô màu thì đây là cả vấn đề vì màu mè là làm việc trực tiếp trên sheet, nếu có thể thì bạn nên đổi cách nhận kết quả
Viết thử thôi, có mấy dòng dữ liệu nó chạy xoẹt là xong nhưng 30000 thì....má ơi. Híc
Thân
Mã:
Public Sub MauMau()
    Dim Vung, Tam, I, Wf, Dic, K, kK, M
        Application.ScreenUpdating = False
        Set Vung = Range([A3], [A50000].End(xlUp)).Resize(, 3): Set Wf = Application.WorksheetFunction
        Set Dic = CreateObject("scripting.dictionary")
        ReDim M(1 To Vung.Rows.Count, 1 To 1)
            For I = 1 To Vung.Rows.Count
                If Wf.CountIf(Vung.Columns(1), Vung(I, 1)) > 1 Then
                    Tam = Vung(I, 1) & Vung(I, 3)
                    If Not Dic.exists(Tam) Then
                        K = K + 1: Dic.Add Tam, K: M(K, 1) = Vung(I, 3).Address
                    Else
                        kK = Dic.Item(Tam): M(kK, 1) = ""
                    End If
                End If
            Next I
            Vung.Columns(3).Interior.ColorIndex = xlNone
                For I = 1 To UBound(M)
                    If M(I, 1) <> "" Then Range(M(I, 1)).Interior.ColorIndex = 6
                Next I
        Application.ScreenUpdating = True
End Sub
Đúng như anh concogia dự, hơn 30 ngàn dòng, code tô màu chậm rồi...
Nếu em thay đổi cách phát hiện bằng cách phát hiện ở cột bên cạnh có dấu X thì sửa đoạn code chỗ này như nào ạ:
Mã:
If M(I, 1) <> "" Then Range(M(I, 1)).Interior.ColorIndex = 6
(em gửi File đi kèm)
 
Lần chỉnh sửa cuối:
Upvote 0
(em gửi File đính kèm, có bổ sung thêm 1 dấu hiệu, bỏ dấu hiệu tô màu đi cũng được ạ )
Nhưng em tự sửa thì báo lỗi...nhờ các anh giúp đỡ
( code là của anh concogia , không sai, chỉ là em muốn thay đổi dấu hiệu nhưng sửa code báo lỗi )
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
em chào anh.
Những mã ở Cột A xuất hiện lớn hơn 1. Sau đó chỉ xét những mã đó thôi.
Thôi, em nói luôn công việc thực tế: tìm xem Hóa đơn nào xuất hiện hơn 1 lần, với điều kiện chỉ xuất hiện ở 1 Cửa hàng thì được, nếu xuất hiện ở 2 Cửa hàng khác nhau thi có cách phát hiện vì đây là sai. ( màu )
Tôi hiểu ý bạn rồi. Nếu 1 cửa hàng mà có nhiều hơn 1 hóa đơn trùng nhau thì là sai phải không?
Còn code phần tô màu thì theo tôi bạn nên sử dụng Conditional Formatting chứ code nào chả chậm. 30000 dòng cơ mà.
 
Upvote 0
ẹc,...em đang trên " mây ", em xin lỗi.
Trong file bổ sung rồi ạ, ngắn gọn, không dài dòng ạ )
Mã:
Public Sub hello()
Dim arr, r As Long, Dic As Object
arr = Sheet1.Range("A3:D" & Sheet1.[A1000000].End(xlUp).Row).Value
Set Dic = CreateObject("scripting.dictionary")
For r = 1 To UBound(arr) Step 1
    Dic(arr(r, 1)) = Dic(arr(r, 1)) + 1
    Dic(arr(r, 1) & ";" & arr(r, 3)) = Dic(arr(r, 1) & ";" & arr(r, 3)) + 1
Next
Sheet1.Range("C3:C" & UBound(arr) + 2).Interior.ColorIndex = xlNone
For r = 1 To UBound(arr) Step 1
    If Dic(arr(r, 1)) > 1 Then
        If Dic(arr(r, 1) & ";" & arr(r, 3)) = 1 Then
            If arr(r, 4) = "x" Then
                Sheet1.Range("C" & r + 2).Interior.ColorIndex = 6
            End If
        End If
    End If
Next
End Sub
 
Upvote 0
Mã:
Public Sub hello()
Dim arr, r As Long, Dic As Object
arr = Sheet1.Range("A3:D" & Sheet1.[A1000000].End(xlUp).Row).Value
Set Dic = CreateObject("scripting.dictionary")
For r = 1 To UBound(arr) Step 1
    Dic(arr(r, 1)) = Dic(arr(r, 1)) + 1
    Dic(arr(r, 1) & ";" & arr(r, 3)) = Dic(arr(r, 1) & ";" & arr(r, 3)) + 1
Next
Sheet1.Range("C3:C" & UBound(arr) + 2).Interior.ColorIndex = xlNone
For r = 1 To UBound(arr) Step 1
    If Dic(arr(r, 1)) > 1 Then
        If Dic(arr(r, 1) & ";" & arr(r, 3)) = 1 Then
            If arr(r, 4) = "x" Then
                Sheet1.Range("C" & r + 2).Interior.ColorIndex = 6
            End If
        End If
    End If
Next
End Sub
teng..teng..code gọn gàng..không dùng countif...
em cám ơn anh !
 
Upvote 0
Mã:
Public Sub hello()
Dim arr, r As Long, Dic As Object
arr = Sheet1.Range("A3:D" & Sheet1.[A1000000].End(xlUp).Row).Value
Set Dic = CreateObject("scripting.dictionary")
For r = 1 To UBound(arr) Step 1
    Dic(arr(r, 1)) = Dic(arr(r, 1)) + 1
    Dic(arr(r, 1) & ";" & arr(r, 3)) = Dic(arr(r, 1) & ";" & arr(r, 3)) + 1
Next
Sheet1.Range("C3:C" & UBound(arr) + 2).Interior.ColorIndex = xlNone
For r = 1 To UBound(arr) Step 1
    If Dic(arr(r, 1)) > 1 Then
        If Dic(arr(r, 1) & ";" & arr(r, 3)) = 1 Then
            If arr(r, 4) = "x" Then
                Sheet1.Range("C" & r + 2).Interior.ColorIndex = 6
            End If
        End If
    End If
Next
End Sub
Em nhờ anh giúp đỡ thêm yêu cầu:
- em muốn tìm số Hóa đơn ( cột A), kết hợp cả ký hiệu ( cột B) xuất hiện lớn hơn 1, với điều kiện phải thuộc Ma ST/CH chỉ xuất hiện 1 lần. ( code cũ ,em đang chỉnh lại nhưng chưa ra...++)
- Vùng F:H hiện ra những số hóa đon tìm thấy( NHƯ VÍ DỤ )
em cám ơn anh doveandrse ( học anh cũng chèn vào bài mấy hôm trước để không ai biết, em cám ơn, code chạy rồi )
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em nhờ anh giúp đỡ thêm yêu cầu:
- em muốn tìm số Hóa đơn ( cột A), kết hợp cả ký hiệu ( cột B) xuất hiện lớn hơn 1, với điều kiện phải thuộc Ma ST/CH chỉ xuất hiện 1 lần. ( code cũ ,em đang chỉnh lại nhưng chưa ra...++)
- Vùng F:H hiện ra những số hóa đon tìm thấy( NHƯ VÍ DỤ )

từ đầu đến giờ bạn thay đổi bao nhiêu lần rồi
tôi cho bạn 3 ngày để suy nghĩ xem bạn cần gì . Sau 3 ngày nếu không có thay đổi gì hoặc chưa ai làm thì tôi mới làm

============================================================================
Mã:
Public Sub hello()
Dim arr, r As Long, Dic As Object, k As Long, dArr
arr = Sheet1.Range("A3:D" & Sheet1.[A1000000].End(xlUp).Row).Value
ReDim dArr(1 To UBound(arr), 1 To 3)
Set Dic = CreateObject("scripting.dictionary")
For r = 1 To UBound(arr) Step 1
    Dic(arr(r, 1) & ";" & arr(r, 2)) = Dic(arr(r, 1) & ";" & arr(r, 2)) + 1
    Dic(arr(r, 1) & ";" & arr(r, 2) & ";" & arr(r, 3)) = Dic(arr(r, 1) & ";" & arr(r, 2) & ";" & arr(r, 3)) + 1
Next
Sheet1.Range("C3:C" & UBound(arr) + 2).Interior.ColorIndex = xlNone
Sheet1.Range("F3:H" & UBound(arr) + 2).ClearContents
Sheet1.Range("D3:D" & UBound(arr) + 2).ClearContents
For r = 1 To UBound(arr) Step 1
    If Dic(arr(r, 1) & ";" & arr(r, 2)) > 1 Then
        If Dic(arr(r, 1) & ";" & arr(r, 2) & ";" & arr(r, 3)) = 1 Then
            Sheet1.Range("C" & r + 2).Interior.ColorIndex = 6
            Sheet1.Range("D" & r + 2) = "x"
            k = k + 1
            dArr(k, 1) = "'" & arr(r, 1)
            dArr(k, 2) = arr(r, 2)
            dArr(k, 3) = arr(r, 3)
        End If
    End If
Next
If k > 0 Then Sheet1.Range("F3").Resize(k, 3).Value = dArr
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom