Đếm dữ liệu trùng lặp (1 người xem)

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

trieutoan

Thành viên chính thức
Tham gia
13/4/09
Bài viết
50
Được thích
2
ai có công thức nào đếm được như trong file kèm theo giúp mình với
 

File đính kèm

sao không dùng countif(C3:C22,C3:C22) thôi ?
 
^^ e nhầm câu hỏi , cái này phải dùng công thức mảng :D
 
Dể như ăn cơm =COUNTIF($C$3:$C$22,"Nguyễn Văn A").Chúc thành công
-------------------------------------------------
=COUNTIF($C$3:$C$22,C3)
Với C3 là ô Nguyễn Văn A
Hoặc =COUNTIF($C$3:$C$22,"Nguyễn Văn A")
Nhớ dùng phím F4 cố định vùng cộng lại không thì khi copy công thức xuống thì sai đó!
-------------------------------------------------
=SUM(1/COUNTIF(C3:C22,C3:C22)) Kết thúc bằng Ctrl + Shift + Enter nhé
sai bét
 
Chỉnh sửa lần cuối bởi điều hành viên:
=SUM(1/COUNTIF(C3:C22,C3:C22)) Kết thúc bằng Ctrl + Shift + Enter LÀ DÚNG RỒI,

=COUNTIF($C$3:$C$22,"Nguyễn Văn A") ....CÁI NÀY KO DÙNG ĐƯỢC ANH ƠI VÌ NẾU CÓ ĐẾN 10 NGƯỜI MÌNH ĐÁNH ĐIỀU KIỆN ("NGUYỄN VĂN A") VÀO ĐÃ CHẾT RỒI CHỨ CHƯA NÓI ĐẾN 10000 NGƯỜI
 
Dùng công thức mảng

hoặc dùng code sau :
PHP:
Public Function Demdulieu(v1 As Range) As Single
Dim mycell As Range
Dim i As Single, tong As Single    
    tong = 0    
              For Each mycell In v1.Cells        
                         i = 1 / WorksheetFunction.CountIf(v1, mycell)        
                        If i < 1 Then        
                             tong = tong + i        
                       End If    
             Next    
     Demdulieu = tong
End Function
 
Dùng công thức mảng

hoặc dùng code sau :
PHP:
Public Function Demdulieu(v1 As Range) As Single
Dim mycell As Range
Dim i As Single, tong As Single    
    tong = 0    
              For Each mycell In v1.Cells        
                         i = 1 / WorksheetFunction.CountIf(v1, mycell)        
                        If i < 1 Then        
                             tong = tong + i        
                       End If    
             Next    
     Demdulieu = tong
End Function

Đã viết code mà còn dùng WorksheetFunction vậy thôi ta gõ trực tiếp lên bảng tính luôn cho rồi
Đó là chưa nói đến trường hợp COUNTIF cho kết quả = 0 (khi cell rổng), dẫn đến biến i sẽ bị lỗi
Đã nói đến Unique thì ta nên nghĩ đến Scripting.Dictionary. Tôi viết vầy:
PHP:
Function CountUnique(ByVal Source_Array) as Long
  Dim tmpArr, Item, tmp As String
  tmpArr = Source_Array
  On Error Resume Next
  With CreateObject("Scripting.Dictionary")
    For Each Item In tmpArr
      tmp = Trim(CStr(Item))
      If Len(tmp) Then
        If Not .Exists(tmp) Then .Add tmp, ""
      End If
    Next
    CountUnique = .Count
  End With
End Function
Xử lý mảng, đương nhiên sẽ cho tốc độ cực nhanh
 
=COUNTIF($C$3:$C$22,C3)HOẶC =COUNTIF($C$3:$C$22,"Nguyễn Văn A")
 
Nếu không cần đánh tên "Nguyễn Văn A" Thì ta dùng ô chứa "Nguyễn Văn A"
=COUNTIF($C$3:$C$22,C3)
Mà công thức của bạn sao tôi làm mãi cũng cho kqua= 0.2 vậy
 
Nếu không cần đánh tên "Nguyễn Văn A" Thì ta dùng ô chứa "Nguyễn Văn A"
=COUNTIF($C$3:$C$22,C3)
Mà công thức của bạn sao tôi làm mãi cũng cho kqua= 0.2 vậy

Không biết bạn đang trả lời cho vấn đề nào nữa? Ở đây người ta đang hỏi ĐẾM DỮ LIỆU TRÙNG cơ mà, liên quan gì đến vụ COUNTIF($C$3:$C$22,C3) hay COUNTIF($C$3:$C$22,"Nguyễn Văn A") hà bạn?
 
Đó là đếm ra có 4 người trùng, vậy còn lọc 4 người đó ra thế nào các bác? (Dùng công thức)
 
Cảm ơn pác ndu đã gợi ý cho e học thêm về "scripting.dictionary "
do yêu cầu của đề bài là đếm xem có bn dữ liệu trùng nhau
ví dụ : nguyen van a,
nguyen van b
-------> kêt quả là 1 thôi ^^
em đoán chắc cái ny áp dụng vào việc đếm :
- có bao loại thí sinh trùng tên nhau
- mỗi tên có bao nhiêu thí sinh

Tiên thể vừa học "
scripting.dictionary" nên em thử viết luôn code sau :

Do mới vào nghề nên ngôn ngữ viết còn hơi rườm rà, các pác đóng góp thêm cho e, để e sửa ^^

PHP:
Public Sub Count_unique()
   Dim dic As Object, i As Integer, j As Integer, irow As Integer
   Dim tmparr, arr() As Variant    
Range("E9:F15").ClearContents    
Set dic = CreateObject("Scripting.Dictionary")    
tmparr = Range("C3:C50")    
ReDim arr(1 To UBound(tmparr, 1), 1 To 2)   
           For irow = 1 To UBound(tmparr, 1)        
                   If Not IsEmpty(tmparr(irow, 1)) And Not dic.exists(tmparr(irow, 1)) Then          
                                 i = i + 1            
                                  dic.Add tmparr(irow, 1), i            
                                   arr(i, 1) = tmparr(irow, 1)           
                                   arr(i, 2) = 1        
                     Else            
                                  If Not IsEmpty(tmparr(irow, 1)) Then                
                                       For j = 1 To UBound(tmparr, 1)                   
                                           If arr(j, 1) = tmparr(irow, 1) Then                        
                                                  arr(j, 2) = arr(j, 2) + 1                        
                                                   Exit For                    
                                           End If               
                                         Next            
                                     End If        
                       End If   
                       Next    
Range("E9:F15") = arr   
For i = 1 To dic.Count        
  If arr(i, 2) > 1 Then            
           sdem = sdem + 1        
   End If   
   Next    
MsgBox " co tat ca " & sdem & " loai ten trung nhau "
End Sub

ah em muốn hỏi thêm pác ndu :
code của pác có khai báo byval source_arry
--Nếu để mặc đinh là byref có vấn đề gì xảy ra không
---- pác khai báo on error next resume để bẫy lỗi trong trường hợp nào ?
--- Nếu trong cel mình khai báo khóa $$ có giá trị giống byval không
thanks pac ^^ :)
 
Lần chỉnh sửa cuối:
Đã viết code mà còn dùng WorksheetFunction vậy thôi ta gõ trực tiếp lên bảng tính luôn cho rồi
Đó là chưa nói đến trường hợp COUNTIF cho kết quả = 0 (khi cell rổng), dẫn đến biến i sẽ bị lỗi
Đã nói đến Unique thì ta nên nghĩ đến Scripting.Dictionary. Tôi viết vầy:
PHP:
Function CountUnique(ByVal Source_Array) as Long
  Dim tmpArr, Item, tmp As String
  tmpArr = Source_Array
  On Error Resume Next
  With CreateObject("Scripting.Dictionary")
    For Each Item In tmpArr
      tmp = Trim(CStr(Item))
      If Len(tmp) Then
        If Not .Exists(tmp) Then .Add tmp, ""
      End If
    Next
    CountUnique = .Count
  End With
End Function
Xử lý mảng, đương nhiên sẽ cho tốc độ cực nhanh

Câu hỏi đặt ra là "Có bao nhiêu người trùng tên", có nghĩa là chỉ đếm số tên có bị trùng thôi, còn tên 1 mình lẻ bóng thì không đếm, tính sao với anh Dic hả Thầy?
 
bạn xem file mình vừa up lên ở bài 14 Dùng dic !

pác ndu nói đúng "Đã nói đến Unique thì ta nên nghĩ đến Scripting.Dictionary"
 
Câu hỏi đặt ra là "Có bao nhiêu người trùng tên", có nghĩa là chỉ đếm số tên có bị trùng thôi, còn tên 1 mình lẻ bóng thì không đếm, tính sao với anh Dic hả Thầy?
Thì.....tính ngược lại, thằng nào duy nhất thì....nghỉ chơi nó ra
Mắc cười chưa
Híc
 
Câu hỏi đặt ra là "Có bao nhiêu người trùng tên", có nghĩa là chỉ đếm số tên có bị trùng thôi, còn tên 1 mình lẻ bóng thì không đếm, tính sao với anh Dic hả Thầy?

Nhớ không lầm thì câu hỏi này cũng có làm rồi!
Tuy nhiên, Nghĩa download file ở bài 1 về, xem câu hỏi trong đó thì sẽ biết rằng câu mà Nghĩa vừa hỏi lại chẳng liên quan gì đến câu hỏi của tác giả cả ----> Nếu thích thì TỰ NGHIÊN CỨU đi
Ẹc... Ẹc...
 
Nhớ không lầm thì câu hỏi này cũng có làm rồi!
Tuy nhiên, Nghĩa download file ở bài 1 về, xem câu hỏi trong đó thì sẽ biết rằng câu mà Nghĩa vừa hỏi lại chẳng liên quan gì đến câu hỏi của tác giả cả ----> Nếu thích thì TỰ NGHIÊN CỨU đi
Ẹc... Ẹc...

Hì hì, tiêu đề là "đếm dữ liệu trùng lặp" chứ có nói đếm dữ liệu riêng lẽ đâu Thầy! Với lại trong file của tác giả thật sự là 4 tên và mỗi tên đều có trùng!
 
--Nếu để mặc đinh là byref có vấn đề gì xảy ra không
Với bài này thì byRef hay byVal đều không có vấn đề. Tuy nhiên tôi luôn có thói quen dùng byVal, còn byRef thì dùng cho 1 trong số ít những trường hợp đặc biệt khác
Muốn phân biệt byVal, byRef bạn tìm trên diễn đàn nhé






Cảm ơn pác ndu đã gợi ý cho e học thêm về "scripting.dictionary "

em đoán chắc cái ny áp dụng vào việc đếm :
- có bao loại thí sinh trùng tên nhau
- mỗi tên có bao nhiêu thí sinh

Tiên thể vừa học "
scripting.dictionary" nên em thử viết luôn code sau :

Do mới vào nghề nên ngôn ngữ viết còn hơi rườm rà, các pác đóng góp thêm cho e, để e sửa ^^
Bài này bạn For... Next nhiều quá! Nếu là tôi thì tôi làm chỉ 1 vòng lập:
PHP:
Sub Count_unique2()
  Dim tmpArr, Arr(), Item, tmp As String, n As Long, k As Long
  On Error Resume Next
  Range("E9:F10000").ClearContents
  tmpArr = Range("C3:C10000")
  ReDim Arr(1 To UBound(tmpArr, 1), 1 To 2)
  With CreateObject("Scripting.Dictionary")
    For Each Item In tmpArr
      tmp = Trim(CStr(Item))
      If Len(tmp) Then
        If Not .Exists(tmp) Then
          n = n + 1
          .Add tmp, n
           Arr(n, 1) = tmp
           Arr(n, 2) = 1
        Else
          Arr(.Item(tmp), 2) = Arr(.Item(tmp), 2) + 1
          If Arr(.Item(tmp), 2) = 2 Then k = k + 1
        End If
      End If
    Next
  End With
  If n Then
    Range("E9").Resize(n, 2) = Arr
    MsgBox " co tat ca " & k & " loai ten trung nhau "
  End If
End Sub
---------------------------------------
Hì hì, tiêu đề là "đếm dữ liệu trùng lặp" chứ có nói đếm dữ liệu riêng lẽ đâu Thầy! Với lại trong file của tác giả thật sự là 4 tên và mỗi tên đều có trùng!
Thế Nghĩa có đọc bài này của tác giả không:
=SUM(1/COUNTIF(C3:C22,C3:C22)) Kết thúc bằng Ctrl + Shift + Enter LÀ DÚNG RỒI,
Vậy theo Nghĩa tác giả đang hỏi với Ý gì?
 
Lần chỉnh sửa cuối:

File đính kèm

=sumproduct(1/countif(c3:c22,c3:c22))
 

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

Back
Top Bottom