đếm số lần dữ liệu trùng trong 1 cột

Liên hệ QC
Cách chưa đúng nhe anh: ví dụ có 3 số bị trùng và đều trùng là 2, thì nó sẽ ra 6 chứ không phải 3, sao chỗ này anh --(COUNTIF(OFFSET(A2,,,COUNTA(A2:A1000000)),OFFSET(A2,,,COUNTA(A2:A1000000))) không viết là COUNTIF($A$2:$A$1000000,$A$2:$A$1000000)!!!
Hì hì!

Bạn hiền ghi là chỉ "nhận biết" là có trùng thôi (tức có số >0 là có trùng }}}}}) chứ không chủ đích "đếm trùng bao nhiêu mã" cả, nên nó nhẹ (nhờ Counta() chỉ tính đến dòng có dữ liệu) là phải rồi.

Anh nghĩ bạn Wisatan chỉ nên dùng công cụ "Remove Duplicate" thôi, không nên đếm nữa.

Chúc anh em có ngày thiệt vui. /-*+//-*+//-*+/
 
Hì hì!

Bạn hiền ghi là chỉ "nhận biết" là có trùng thôi (tức có số >0 là có trùng }}}}}) chứ không chủ đích "đếm trùng bao nhiêu mã" cả, nên nó nhẹ (nhờ Counta() chỉ tính đến dòng có dữ liệu) là phải rồi.

Anh nghĩ bạn Wisatan chỉ nên dùng công cụ "Remove Duplicate" thôi, không nên đếm nữa.

Chúc anh em có ngày thiệt vui. /-*+//-*+//-*+/
Lỡ giữa dòng có dữ liệu trống thì CT sẽ sai liền!!!
Chúc anh ngày vui!!
 
Cách chưa đúng nhe anh: ví dụ có 3 số bị trùng và đều trùng là 2, thì nó sẽ ra 6 chứ không phải 3, sao chỗ này anh --(COUNTIF(OFFSET(A2,,,COUNTA(A2:A1000000)),OFFSET(A2,,,COUNTA(A2:A1000000))) không viết là COUNTIF($A$2:$A$1000000,$A$2:$A$1000000)!!!
Đúng như bạn Quốc Gia Can nói, chỉ nhận biết có trùng chứ không đếm số lần trùng
COUNTIF($A$2:$A$1000000,$A$2:$A$1000000) sẽ tính countif tới 1000000 dòng sẽ nặng file
(COUNTIF(OFFSET(A2,,,COUNTA(A2:A1000000)),OFFSET(A2,,,COUNTA(A2:A1000000))) chỉ tính countif theo số dòng thực tế có dữ liệu nên sẽ nhẹ hơn nhiều
 
Đúng như bạn Quốc Gia Can nói, chỉ nhận biết có trùng chứ không đếm số lần trùng
COUNTIF($A$2:$A$1000000,$A$2:$A$1000000) sẽ tính countif tới 1000000 dòng sẽ nặng file
(COUNTIF(OFFSET(A2,,,COUNTA(A2:A1000000)),OFFSET(A2,,,COUNTA(A2:A1000000))) chỉ tính countif theo số dòng thực tế có dữ liệu nên sẽ nhẹ hơn nhiều
Nếu chỉ nhận biết có trùng hay không thì dùng hàm này sẽ nhẹ hơn:
Mã:
=IFERROR(IF(MODE(A2:A1000000),"trung"),"Khong trung")
 
Hì hì!

Bạn hiền ghi là chỉ "nhận biết" là có trùng thôi (tức có số >0 là có trùng }}}}}) chứ không chủ đích "đếm trùng bao nhiêu mã" cả, nên nó nhẹ (nhờ Counta() chỉ tính đến dòng có dữ liệu) là phải rồi.

Anh nghĩ bạn Wisatan chỉ nên dùng công cụ "Remove Duplicate" thôi, không nên đếm nữa.

Chúc anh em có ngày thiệt vui. /-*+//-*+//-*+/

Thấy đơn giản mà chẳng đơn giản chút nào, thôi nghe theo bác zay, cám ơn mọi người nhiều.
 
Cái này chỉ áp dụng cho số thôi bạn, chuỗi thì không được!!!
công thức trên của mình vẫn còn kẻ hở, dùng công thức nầy tính cả chuổi và số, và nhẹ hơn nữa
Mã:
=IF(COUNTIF(OFFSET(A2,,,COUNTA(A2:A1000000)),OFFSET(A2,,,COUNTA(A2:A1000000)))>1,"Trùng","Không trùng")
 
công thức trên của mình vẫn còn kẻ hở, dùng công thức nầy tính cả chuổi và số, và nhẹ hơn nữa
Mã:
=IF(COUNTIF(OFFSET(A2,,,COUNTA(A2:A1000000)),OFFSET(A2,,,COUNTA(A2:A1000000)))>1,"Trùng","Không trùng")
Thiếu Sumproduct rồi anh, nếu từ A3:A999999 có ô trống thì CT này có thể sẽ không đúng!!!
 
Thiếu Sumproduct rồi anh, nếu từ A3:A999999 có ô trống thì CT này có thể sẽ không đúng!!!
Đúng là bỏ Sumproduct không được, còn có ô trống chen giửa thì chịu, không còn cách nào ngoài việc phải dùng hàm mảng như hàm Row, thì lại chạy chậm
trường hợp nầy dùng code VBA là thích hợp nhất
 
Đúng là bỏ Sumproduct không được, còn có ô trống chen giửa thì chịu, không còn cách nào ngoài việc phải dùng hàm mảng như hàm Row, thì lại chạy chậm
trường hợp nầy dùng code VBA là thích hợp nhất
Vậy thì sẳn trớn "tiến lên" luôn đi bạn hiền.

Khà khà khà! Chúc anh em ngày thiệt vui }}}}}}}}}}}}}}}
 
Vậy thì sẳn trớn "tiến lên" luôn đi bạn hiền.

Khà khà khà! Chúc anh em ngày thiệt vui }}}}}}}}}}}}}}}
Lệnh của bạn hiền đâu dám không tuân }}}}}}}}}}}}}}}
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A2:A1000000")) Is Nothing Then
  If Range("A1000000").End(xlUp).Row > 1 Then
    Dim Darr(), tmp(), Dic As Object, i As Long, k As Long, ki As Long
    Darr = Range("A1", Range("A1000000").End(xlUp)).Value
    ReDim tmp(1 To UBound(Darr))
    Set Dic = CreateObject("scripting.dictionary")
    For i = 2 To UBound(Darr)
      If Darr(i, 1) <> "" Then
        If Not Dic.exists(Darr(i, 1)) Then
          If i <> Range(Cells(i, 1), Range("A1000000").End(xlUp)).Find(Darr(i, 1), , , 1).Row Then
            k = k + 1
            tmp(k) = i
          End If
          Dic.Add Darr(i, 1), Array(i, k)
        Else
          ki = Dic(Darr(i, 1))(1)
          tmp(ki) = tmp(ki) & "," & i
          Dic(Darr(i, 1)) = Array(tmp(ki), ki)
        End If
      End If
    Next i
    If k Then
      Range("B1") = k
      ReDim Preserve tmp(1 To k)
      Range("C1") = Join(tmp, " ; ")
    End If
    Set Dic = Nothing:  Erase Darr
  Else
    Range("B1:C1").ClearContents
  End If
End If
End Sub
 

File đính kèm

  • dem so lan du lieu trung.xlsb
    15.9 KB · Đọc: 6
Lệnh của bạn hiền đâu dám không tuân }}}}}}}}}}}}}}}
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A2:A1000000")) Is Nothing Then
  If Range("A1000000").End(xlUp).Row > 1 Then
    Dim Darr(), tmp(), Dic As Object, i As Long, k As Long, ki As Long
    Darr = Range("A1", Range("A1000000").End(xlUp)).Value
    ReDim tmp(1 To UBound(Darr))
    Set Dic = CreateObject("scripting.dictionary")
    For i = 2 To UBound(Darr)
      If Darr(i, 1) <> "" Then
        If Not Dic.exists(Darr(i, 1)) Then
          If i <> Range(Cells(i, 1), Range("A1000000").End(xlUp)).Find(Darr(i, 1), , , 1).Row Then
            k = k + 1
            tmp(k) = i
          End If
          Dic.Add Darr(i, 1), Array(i, k)
        Else
          ki = Dic(Darr(i, 1))(1)
          tmp(ki) = tmp(ki) & "," & i
          Dic(Darr(i, 1)) = Array(tmp(ki), ki)
        End If
      End If
    Next i
    If k Then
      Range("B1") = k
      ReDim Preserve tmp(1 To k)
      Range("C1") = Join(tmp, " ; ")
    End If
    Set Dic = Nothing:  Erase Darr
  Else
    Range("B1:C1").ClearContents
  End If
End If
End Sub
Khà khà khà,

Đâu dám, đâu dám!!!!

Nhìn bạn hiền tiến triển cấp độ "thâm sâu" nội công VBA, đã được các anh em "cao thủ" khác nhìn nhận, rất vui và mừng cho bạn hiền.

Chúc bạn một ngày năng động và thiệt vui. }}}}}}}}}}}}}}}
 
Khà khà khà,
Đâu dám, đâu dám!!!!
Nhìn bạn hiền tiến triển cấp độ "thâm sâu" nội công VBA, đã được các anh em "cao thủ" khác nhìn nhận, rất vui và mừng cho bạn hiền.
Chúc bạn một ngày năng động và thiệt vui. }}}}}}}}}}}}}}}
Đâu dám!!!
Mình chỉ học qua code của các bạn trên diễn đàn, copy các lệnh, lập thư viện riêng và viết lại theo tình huống mới thôi
Nhiều lệnh không hiểu nên khi dùng vẫn bị chạy lung tung, kiến thức về VBA của mình rất ít, rất nhiều thứ hoàn toàn không biết, chỉ liều mạng viết code và đưa lên thôi )*&^)
chúc bạn vui cả ngày }}}}}}}}}}}}}}}
 
Web KT

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

Back
Top Bottom