3

这适用于 Excel:我的任务是在过滤数据后计算不同的记录。我有 330 行,其中 A 列包含“名称”,并且在 BI 列中有一个为每个“名称”完成的测试的名称,每个“名称”可能已经对同一测试进行了多次迭代。测试结果在 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

4 回答 4

3

发现这个:

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

Excel 论坛上

在您的示例中进行了测试,并且..它有效:-)

于 2009-11-17T09:36:10.250 回答
1

输入数组

{=SUM(IF(频率(IF(LEN(A1:A8)>0,MATCH(A1:A8,A1:A8,FALSE),""),IF(LEN(A1:A8)>0,MATCH(A1 :A8,A1:A8,FALSE),""))*(B1:B9="考试 1")>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
于 2009-11-09T16:42:19.090 回答
0

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

select distinct column_A, count(*)
from table
where column_C = 'A+'
group by column_A
于 2009-11-06T22:34:26.313 回答
0

与周四极客一致

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
于 2009-11-09T13:59:27.220 回答