Nhờ hỗ trợ code đếm duy nhất theo điều kiện

Liên hệ QC

tangoctuan

Thành viên hoạt động
Tham gia
22/4/08
Bài viết
153
Được thích
19
Các bác giúp em một đoạn code để đếm số lượng serial duy nhất ở cột A theo điều kiện NOK ở cột B và C với ạ. Kết quả điền tương ứng vào ô F1, F2 bôi vàng.
Em dùng hàm Countif để đếm thì số lượng lớn quá máy chạy không nổi. Dữ liệu thực có khoảng 500k dòng.
Cảm ơn mọi người!
 

File đính kèm

  • Dem duy nhat theo dieu kien.xlsb
    358.4 KB · Đọc: 23
Mã:
Option Explicit
Sub ABC()
On Error Resume Next
Dim Dic As Object
Dim Arr
Dim I, m, n As Long
Arr = Sheet1.Range("A2:C" & Sheet1.Range("A1").End(xlDown).Row).Value
Set Dic = CreateObject("Scripting.dictionary")
For I = 1 To UBound(Arr)
    If Not Dic.exists(Arr(I, 1)) Then
        Dic.Add Arr(I, 1)
        If Arr(I, 2) = "NOK" Then
            n = n + 1
        End If
        If Arr(I, 3) = "NOK" Then
            m = m + 1
        End If
    End If
Next I
With Sheet1
    .Range("F1") = n
    .Range("F2") = m
End With
Set Dic = Nothing
End Sub
Bạn tự test xem đúng ý k
Sửa: Logic của mk bị sai lên kết quả code trên sai. Sửa như này mới đúng
Mã:
Option Explicit
Sub ABC()
On Error Resume Next
Dim Dic As Object
Dim Arr
Dim I, n As Long
Arr = Sheet1.Range("A2:C" & Sheet1.Range("A1").End(xlDown).Row).Value
Set Dic = CreateObject("Scripting.dictionary")
For I = 1 To UBound(Arr)
    If Arr(I, 2) = "NOK" Then
        If Not Dic.exists(Arr(I, 1)) Then
            Dic.Add Arr(I, 1), n
            n = n + 1
        End If
    End If
Next I
With Sheet1
    .Range("F1") = n
End With
Set Dic = Nothing
End Sub
Mới tìm dc 1 điều kiện, gộp chung code vẫn chưa nghĩ ra :=)))
 
Lần chỉnh sửa cuối:
Upvote 0
Các bác giúp em một đoạn code để đếm số lượng serial duy nhất ở cột A theo điều kiện NOK ở cột B và C với ạ. Kết quả điền tương ứng vào ô F1, F2 bôi vàng.
Em dùng hàm Countif để đếm thì số lượng lớn quá máy chạy không nổi. Dữ liệu thực có khoảng 500k dòng.
Cảm ơn mọi người!
Có phải kết quả như sau không bạn?

1628148332268.png
 
Upvote 0
Bạn thử code này
Mã:
Public Sub Dem()
    Dim Vung, Dic, I, K, kK, Tam
    Vung = Range([A2], [A500000].End(xlUp)).Resize(, 3)
    Set Dic = CreateObject("scripting.dictionary")
        For I = 1 To UBound(Vung)
            If Vung(I, 2) = "NOK" Then
                If Not Dic.exists(Vung(I, 1)) Then
                    Dic.Add Vung(I, 1), ""
                    K = K + 1
                 End If
            End If
                If Vung(I, 3) = "NOK" Then
                    Tam = Vung(I, 1) & "@"
                    If Not Dic.exists(Tam) Then
                        Dic.Add Tam, ""
                        kK = kK + 1
                     End If
                End If
        Next I
    [G1] = K: [G2] = kK
End Sub
 
Upvote 0
Đúng rồi,Anh Hai hay quá
Híc
Em cũng thử xem sao:

Mã:
Sub Dem_HLMT()
    Dim cnn As String, strSQL As String
    strSQL = "Select Distinct Serial from [Sheet1$]"
    cnn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0"
    With CreateObject("ADODB.Recordset")
        .Open strSQL & " Where   [" & Sheet1.Range("B1") & "] Like 'NOK'", cnn, 1
        MsgBox ("Tieu chi 1 la: " & .RecordCount)
        .Close
        .Open strSQL & " Where   [" & Sheet1.Range("C1") & "] Like 'NOK'", cnn, 1
        MsgBox ("Tieu chi 2 la: " & .RecordCount)
    End With
End Sub
 
Upvote 0
Mã:
Option Explicit
Sub ABC()
On Error Resume Next
Dim Dic As Object
Dim Arr
Dim I, m, n As Long
Arr = Sheet1.Range("A2:C" & Sheet1.Range("A1").End(xlDown).Row).Value
Set Dic = CreateObject("Scripting.dictionary")
For I = 1 To UBound(Arr)
    If Not Dic.exists(Arr(I, 1)) Then
        Dic.Add Arr(I, 1)
        If Arr(I, 2) = "NOK" Then
            n = n + 1
        End If
        If Arr(I, 3) = "NOK" Then
            m = m + 1
        End If
    End If
Next I
With Sheet1
    .Range("F1") = n
    .Range("F2") = m
End With
Set Dic = Nothing
End Sub
Bạn tự test xem đúng ý k
Sửa: Logic của mk bị sai lên kết quả code trên sai. Sửa như này mới đúng
Mã:
Option Explicit
Sub ABC()
On Error Resume Next
Dim Dic As Object
Dim Arr
Dim I, n As Long
Arr = Sheet1.Range("A2:C" & Sheet1.Range("A1").End(xlDown).Row).Value
Set Dic = CreateObject("Scripting.dictionary")
For I = 1 To UBound(Arr)
    If Arr(I, 2) = "NOK" Then
        If Not Dic.exists(Arr(I, 1)) Then
            Dic.Add Arr(I, 1), n
            n = n + 1
        End If
    End If
Next I
With Sheet1
    .Range("F1") = n
End With
Set Dic = Nothing
End Sub
Mới tìm dc 1 điều kiện, gộp chung code vẫn chưa nghĩ ra :=)))
Cám ơn bác, code ra kết quả đúng rồi nhưng lại chạy ra kết quả cho từng tiêu chí một chứ không được một lần xong hết.
Em cũng thử xem sao:

Mã:
Sub Dem_HLMT()
    Dim cnn As String, strSQL As String
    strSQL = "Select Distinct Serial from [Sheet1$]"
    cnn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0"
    With CreateObject("ADODB.Recordset")
        .Open strSQL & " Where   [" & Sheet1.Range("B1") & "] Like 'NOK'", cnn, 1
        MsgBox ("Tieu chi 1 la: " & .RecordCount)
        .Close
        .Open strSQL & " Where   [" & Sheet1.Range("C1") & "] Like 'NOK'", cnn, 1
        MsgBox ("Tieu chi 2 la: " & .RecordCount)
    End With
End Sub
Cảm ơn bác, em chạy code ra kết quả đúng rồi nhưng lại hiện ra dưới dạng pop up báo kết quả (báo lần lượt từng kết quả) chứ không trả vào ô. Và cũng quay quay một lúc tầm 1 phút mới ra đó bác.
Bạn thử code này
Mã:
Public Sub Dem()
    Dim Vung, Dic, I, K, kK, Tam
    Vung = Range([A2], [A500000].End(xlUp)).Resize(, 3)
    Set Dic = CreateObject("scripting.dictionary")
        For I = 1 To UBound(Vung)
            If Vung(I, 2) = "NOK" Then
                If Not Dic.exists(Vung(I, 1)) Then
                    Dic.Add Vung(I, 1), ""
                    K = K + 1
                 End If
            End If
                If Vung(I, 3) = "NOK" Then
                    Tam = Vung(I, 1) & "@"
                    If Not Dic.exists(Tam) Then
                        Dic.Add Tam, ""
                        kK = kK + 1
                     End If
                End If
        Next I
    [G1] = K: [G2] = kK
End Sub
Code chạy ra luôn kết quả ngay sau khi bấm nút, và chính xác! Em cảm ơn bác nhiều!
 
Upvote 0
Bạn thử code này
Mã:
Public Sub Dem()
    Dim Vung, Dic, I, K, kK, Tam
    Vung = Range([A2], [A500000].End(xlUp)).Resize(, 3)
    Set Dic = CreateObject("scripting.dictionary")
        For I = 1 To UBound(Vung)
            If Vung(I, 2) = "NOK" Then
                If Not Dic.exists(Vung(I, 1)) Then
                    Dic.Add Vung(I, 1), ""
                    K = K + 1
                 End If
            End If
                If Vung(I, 3) = "NOK" Then
                    Tam = Vung(I, 1) & "@"
                    If Not Dic.exists(Tam) Then
                        Dic.Add Tam, ""
                        kK = kK + 1
                     End If
                End If
        Next I
    [G1] = K: [G2] = kK
End Sub
Nhờ bác code giúp em theo file đính kèm với ạ nếu được, rule tương tự như trước nhưng do các tiêu chí nhiều nên chia thành 2 sheet, sheet 1 là dữ liệu, sheet 2 là bảng trả kết quả.
 

File đính kèm

  • Demtheodieukien.xlsb
    1.2 MB · Đọc: 6
Upvote 0
Nhờ bác code giúp em theo file đính kèm với ạ nếu được, rule tương tự như trước nhưng do các tiêu chí nhiều nên chia thành 2 sheet, sheet 1 là dữ liệu, sheet 2 là bảng trả kết quả.
Cái này là cái gì mà nhìn chóng mặt vậy. Kiểm tra kết quả chắc "tèo" luôn quá, sao có 2 cột tiêu chí không có dữ liệu, tại thiếu hay....nó vậy. Bạn biết kết quả hông? nếu biết thì nhập vào xem sao, chứ mình viết xong kiểm tra kết quả cho chắc cú thì ....hơi lâu à.
Rảnh, ngồi không cũng muốn làm cho giải toả căng thẳng chút mà nhìn bài này muốn....đi ngủ quá
Thân
 
Upvote 0
Nhờ bác code giúp em theo file đính kèm với ạ nếu được, rule tương tự như trước nhưng do các tiêu chí nhiều nên chia thành 2 sheet, sheet 1 là dữ liệu, sheet 2 là bảng trả kết quả.
Hên xui nhé, mình ...cảm giác nó đúng, nếu sai thì....làm lại, bấm vào con mèo nhé
Thân
 

File đính kèm

  • Demtheodieukien.rar
    2.3 MB · Đọc: 9
Upvote 1
Giải pháp
Hên xui nhé, mình ...cảm giác nó đúng, nếu sai thì....làm lại, bấm vào con mèo nhé
Thân
Có phải ý bác đang nói 2 cột Tiêu chí 06 và Tiêu chí 41 không ạ? Đây là dữ liệu từ hệ thống xuất ra, chỉ quan trọng là cái đánh giá NOK, còn lại (blank hay Ok) thì đều đánh giá đạt. Cám ơn bác, để em thử chạy xem. Hi hi.
 
Upvote 0
Hên xui nhé, mình ...cảm giác nó đúng, nếu sai thì....làm lại, bấm vào con mèo nhé
Thân
Đẹp quá. Em cũng... không đủ kiên nhẫn để kiểm tra được hết. :D
Nhưng kiểm tra xác suất thử 8 9 trường hợp thì đều chuẩn hết không trượt phát nào.
Một lần nữa cảm ơn bác rất nhiều và chúc bác nhiều sức khỏe!
Bài đã được tự động gộp:

P/s là chú mèo Tom & Jerry đáng yêu quá, làm gợi nhớ lại tuổi thơ em.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom