Đếm dữ liệu trùng chỉ tính 1 lần thỏa mãn theo điều kiện (1 người xem)

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

Minhhanh_89

Thành viên mới
Tham gia
14/3/14
Bài viết
40
Được thích
5
Gửi anh chị GPE !
Nhờ anh chị tính giúp em số lượng mã hàng chính và số lượng mã hàng phụ theo từng tháng, những mã hàng bị trùng lặp trong tháng chỉ tính 1 lần.
Em có gửi file đính kèm !
Mong anh chị giúp đỡ ạ.
Em cảm ơn !
 

File đính kèm

Gửi anh chị GPE !
Nhờ anh chị tính giúp em số lượng mã hàng chính và số lượng mã hàng phụ theo từng tháng, những mã hàng bị trùng lặp trong tháng chỉ tính 1 lần.
Em có gửi file đính kèm !
Mong anh chị giúp đỡ ạ.
Em cảm ơn !
Số mã sản phẩm chính:
Mã:
=SUMPRODUCT(1/COUNTIF($A$2:$A$18866,$A$2:$A$18866))
Số mã HC theo tháng 7:
Mã:
=SUMPRODUCT(($B$2:$B$18866=I3)*($C$2:$C$18866="HC"))
 
Số mã sản phẩm chính:
Mã:
=SUMPRODUCT(1/COUNTIF($A$2:$A$18866,$A$2:$A$18866))
Số mã HC theo tháng 7:
Mã:
=SUMPRODUCT(($B$2:$B$18866=I3)*($C$2:$C$18866="HC"))

Hi anh,
Em muốn tính ra số mã sản phẩm của HC/PK ở tháng 7 và tháng 8 những mã trùng chỉ tính 1 lần.
Code thứ 1 của anh tính ra số mã sản phẩm bao gồm cả HC và PK
Code thứ 2: Tính ra được số mã sản phẩm của HC/PK trong tháng, đếm tất cả mã những mã hàng trùng chưa được tính 1 lần.
 
Hi anh,
Em muốn tính ra số mã sản phẩm của HC/PK ở tháng 7 và tháng 8 những mã trùng chỉ tính 1 lần.
Code thứ 1 của anh tính ra số mã sản phẩm bao gồm cả HC và PK
Code thứ 2: Tính ra được số mã sản phẩm của HC/PK trong tháng, đếm tất cả mã những mã hàng trùng chưa được tính 1 lần.
Thử Hàm tự tạo xem sao, Nhớ Enable Macros khi mở file.
 

File đính kèm

Gửi anh chị GPE !
Nhờ anh chị tính giúp em số lượng mã hàng chính và số lượng mã hàng phụ theo từng tháng, những mã hàng bị trùng lặp trong tháng chỉ tính 1 lần.
Em có gửi file đính kèm !
Mong anh chị giúp đỡ ạ.
Em cảm ơn !

1. Công thức
Chọn ô J3 và đặt name tmp
Mã:
=IF(($B$2:$B$18866=$I3)*($C$2:$C$18866=J$2);$A$2:$A$18866;"")

Công thức cho J3
Mã:
=SUM(IF(tmp="";"";--(MATCH(tmp;tmp;0)=ROW($A$2:$A$18866)-1)))

Kết thúc bằng Ctrl+Shift+Enter. Kéo sang phải và xuống dưới.

Việc đặt name không chỉ đơn thuần là để đơn giản công thức. Nếu tôi không lầm thì khi đặt name thì mảng tmp trong công thức chỉ được tính 1 lần. Nếu không đặt name thì mảng
Mã:
IF(($B$2:$B$18866=$I3)*($C$2:$C$18866=J$2);$A$2:$A$18866;"")
trong công thức sẽ được tính 3 lần.

Với dữ liệu cỡ đó thì công thức cũng được. Nếu dữ liệu quá lớn thì chơi code

2. VBA
Hàm tự tạo thì cũng chỉ dùng trong tập tin của bạn vì viết cho vấn đề là cụ thể, cấu trúc dữ liệu cụ thể. Tôi truyền cả vùng $A$2:$C$18866. Nếu bạn truyền 3 cột A, B, C thì code tương tự.
Mã:
Function UniqueCount(data As Range, ByVal curr_col2 As String, ByVal curr_col3 As String) As Long
Dim dic As Object, Arr(), index As Long
    Set dic = CreateObject("Scripting.Dictionary")
    Arr = data.Value
    For index = 1 To UBound(Arr, 1)
        If Arr(index, 2) = curr_col2 And Arr(index, 3) = curr_col3 Then
            If Not dic.Exists(Arr(index, 1)) Then dic.Add Arr(index, 1), ""
        End If
    Next index
    UniqueCount = dic.Count
    Set dic = Nothing
End Function

Bạn để ý là code không làm việc nối 3 cột A, B, C vì chả để làm gì, hay nói cách khác thì chỉ để mất thêm điện nước - năng lượng.

Công thức cho N3 (xem tập tin)
Mã:
=UniqueCount($A$2:$C$18866;$M3;N$2)

Kéo sang phải và xuống dưới.
 

File đính kèm

Nếu dùng VBA thì mình sẽ làm thế này
 

File đính kèm

Nhìn If Not Intersect(Target, [F2:F100]) Is Nothing Then là biết ngay là khi xóa dữ liệu, sửa dữ liệu, thay dữ liệu mới thì kết quả không hề thay đổi
Ý tưởng của em chủ yếu là 1 giải pháp cho trường hợp dữ liệu nguồn nhiều quá. Nếu chủ topic biết ứng dụng thì tạo bảng theo dõi. Khi cần xem của tháng nào thì gõ vào 1 ô mà xem. Còn nếu viết hàm VBA thì em dùng ADO khỏi cần vòng lặp luôn cũng ra kết quả.

******
Nếu viết bằng ADO thì 1 rừng code luôn
PHP:
Function GetExcelConnection(ByVal Path As String, Optional ByVal Header As Boolean = True)
    Dim StrConn As String, ObjConn As Object, Pro As String, Ext As String
    Set ObjConn = CreateObject("ADODB.Connection")
    If Application.Version < 12 Then
        Pro = "Provider=Microsoft.JET.OLEDB.4.0;"
        Ext = ";Extended Properties=""Excel 8.0;"
    Else
        Pro = "Provider=Microsoft.ACE.OLEDB.12.0;"
        Ext = ";Extended Properties=""Excel 12.0;"
    End If
    StrConn = Pro & "Data Source=" & Path & Ext & _
    "HDR=" & IIf(Header, "Yes", "No") & ";IMEX=1"";"
    ObjConn.Open StrConn
    Set GetExcelConnection = ObjConn
End Function

PHP:
Function Dem(data As Range, dk1 As String, dk2 As String)
Dim ObjConn As Object, RS As Object, nguon
Dim StrRequest As String, Path As String, tam
Path = ThisWorkbook.FullName
nguon = "[Sheet1$" & data.Address(0, 0) & "]"
Set RS = CreateObject("ADODB.Recordset")
Set ObjConn = GetExcelConnection(Path, 0)
StrRequest = "SELECT count(f1) FROM (select distinct(f1),f2,f3 from" & nguon & ")" _
& " where f2 = '" & dk1 & "' and f3= '" & dk2 & "'"
RS.Open StrRequest, ObjConn, 3, 1
tam = RS.getrows
Dem = tam(0, 0)
ObjConn.Close
Set RS = Nothing
End Function
 
Lần chỉnh sửa cuối:

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

Back
Top Bottom