过滤然后计算不同的值

时间:2009-11-06 22:04:05

标签: excel excel-formula

这是针对Excel的:在我过滤数据后,我的任务是计算不同的记录。我有330行,其中A列包含'name',而在B列中,我有一个为每个'name'完成的测试的名称,每个'name'可以进行多次相同测试的迭代。测试结果在C栏中。

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
....            ....                ...

如果我过滤考试1的作业B,我想计算参加考试1的学生的唯一数量。

4 个答案:

答案 0 :(得分:3)

发现这个:

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

上的

在您的示例中测试并且..它的工作原理: - )

答案 1 :(得分:1)

输入数组

  

{= SUM(IF(频率(IF(LEN(A1:A8)大于0,MATCH(A1:A8,A1:A8,FALSE), “”),IF(LEN(A1:A8)&GT; 0,MATCH(A1:A8,A1:A8,FALSE), “”))*(B1:B9 =“考试   1" )&GT; 0,1))}

请注意,由于FREQUENCY返回的数据点多于源范围,因此B列范围实际上是B1:B9,这仅在B9不等于考试1时才有效。

如果您希望每次都将条件基于过滤而不是某个列,我不知道如何使用公式。如果你不反对VBA,你可以使用这个简单的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

答案 2 :(得分:0)

我不确定B列是如何适合的,但是......

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

答案 3 :(得分:0)

符合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
相关问题