2009-11-06 6 views
2

Ceci est pour Excel: J'ai été chargé de compter des enregistrements distincts après avoir filtré les données. J'ai 330 lignes avec la colonne A contenant le 'nom' et dans la colonne B j'ai le nom d'un test qui a été fait pour chaque 'nom', que chaque 'nom' aurait pu prendre plusieurs itérations du même test. Les résultats du test sont dans la colonne C.Filtrage, puis comptage des valeurs distinctes

Col A -Student Col B -Exam   Col C - Grade 
Student 1  Exam 1    .80 
Student 2  Exam 1    .50 
Student 3  Exam 1    .90 
Student 2  Exam 1    .75 
Student 4  Exam 1    .90 
Student 5  Exam 1    .55 
Student 2  Exam 2    .90 
Student 1  Exam 2    .90 
....   ....    ... 

Si je filtre col B pour examen 1, je veux compter le nombre unique d'étudiants qui ont pris l'examen 1.

Répondre

0

Je ne sais pas comment la colonne B convient ici, mais ...

select distinct column_A, count(*) 
from table 
where column_C = 'A+' 
group by column_A 
0

conformément à thursdaysgeek

strFile = Workbooks(1).FullName 
''Note HDR=Yes, so column names can be used 
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _ 
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";" 

Set cn = CreateObject("ADODB.Connection") 
cn.Open strCon 
Set rs = CreateObject("ADODB.Recordset") 

strSQL = "SELECT DISTINCT Student, Exam FROM [Sheet4$] " _ 
     & "WHERE Exam='Exam 1'" 

rs.Open strSQL, cn 

For i = 0 To rs.Fields.Count - 1 
    Sheets("Sheet5").Cells(1, i + 1) = rs.Fields(i).Name 
Next 

Sheets("Sheet5").Cells(2, 1).CopyFromRecordset rs 
1

tableau entré

{= SUM (IF (FREQUENCY (IF (LEN (A1: A8)> 0, MATCH (A1: A8, A1: A8, FALSE), ""), IF (LEN (A1: A8) > 0, MATCH (A1: A8, A1: A8, FAUX), "")) * (B1: B9 = "examen 1")> 0,1))}

Notez que depuis la fréquence retourne un point de données de plus que la plage source, que la plage de la colonne B est en réalité B1: B9 et que cela ne fonctionne que si B9 n'est pas égal à l'examen 1.

Si vous voulez baser la condition sur ce qui est filtré plutôt que sur une certaine colonne à chaque fois, je ne connais pas un moyen de le faire avec une formule. Si vous n'êtes pas opposé à VBA, vous pouvez utiliser cette simple UDF.

Public Function CountUniqueFiltered(rColumn As Range) As Long 
    Dim rCell As Range 
    Dim colUnique As Collection 

    Set colUnique = New Collection 

    For Each rCell In rColumn.Cells 
     If Not rCell.EntireRow.Hidden Then 
      On Error Resume Next 
       colUnique.Add rCell.Value, CStr(rCell.Value) 
      On Error GoTo 0 
     End If 
    Next rCell 

    CountUniqueFiltered = colUnique.Count 
End Function 
+0

si je veux filtrer par catégorie/Col C? Ceci est juste un exemple de feuille de données simplifiée, la feuille de calcul réelle a au moins 50 colonnes de données différentes et si je filtre sur l'une de ces colonnes, j'ai besoin de la colonne 'name' pour changer et être capable de fournir un nom . J'utilise ce qui suit pour compter une colonne filtrée, mais je ne sais pas si je peux utiliser une verson modifiée pour déterminer distinct: = SUMPRODUCT (SUBTOTAL (9, OFFSET (U8: U331, ROW (U8: U331) -MIN (ROW (U8: U331)) ,, 1)), - (U8: U331> = $ I $ 3)). Appréciez tout conseil que vous pouvez fournir. – Deon

+0

Votre message a dit "fitlered" n'est-ce pas? Je ne connais pas un moyen avec des formules, mais édité ma réponse avec un certain VBA. –

+0

Merci! Je suis allé de l'avant et utilisé le code VBA et cela fonctionne très bien. – Deon

3

trouvé ceci:

=SUMPRODUCT((A1:A30000<>"")/COUNTIF(A1:A30000,A1:A30000&"")) 

sur le Excel Forum

Testée sur votre exemple et .. cela fonctionne :-)

Questions connexes