2009-11-06 3 views
2

Это для Excel: мне было поручено подсчитывать отдельные записи после того, как я отфильтровал данные. У меня есть 330 строк с столбцом A, содержащим «имя» и в столбце B. У меня есть имя теста, которое было выполнено для каждого «имени», которое каждое «имя» могло бы принимать несколько итераций одного и того же теста. Результаты испытаний в колонке 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 
....   ....    ... 

Если я фильтр Col B для экзамена 1, я хочу, чтобы подсчитать уникальное число студентов, которые приняли к экзамену 1.

ответ

0

Я не уверен, как колонка B уместно здесь, но ...

select distinct column_A, count(*) 
from table 
where column_C = 'A+' 
group by column_A 
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 
1

массив вступил

{= СУММ (ЕСЛИ (частоты (ПЧ (LEN (A1: A8)> 0, MATCH (A1: A8, A1: A8, FALSE), ""), ЕСЛИ (LEN (A1: A8) > 0, MATCH (A1: A8, A1: A8, FALSE), "")) * (В1: В9 = "экзамен 1")> 0,1))}

Обратите внимание, что поскольку частота возвращается еще одна точка данных, чем исходный диапазон, что диапазон столбцов 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 
+0

Что делать, если я хочу, чтобы фильтровать по классам/Col C? Это просто упрощенная примерная таблица данных, в реальной электронной таблице должно быть не менее 50 столбцов разных данных, и если я буду фильтровать любой из этих столбцов, мне потребуется отдельный столбец «name», чтобы изменить и иметь возможность указать отчетливое количество «имя» , Я использую следующее для подсчета отфильтрованного столбца, но не уверен, могу ли я использовать модифицированный verson для определения разного: = SUMPRODUCT (SUBTOTAL (9, OFFSET (U8: U331, ROW (U8: U331) -MIN (ROW (U8: U331)) ,, 1)), - (U8: U331> = $ I $ 3)). Цените любые советы, которые вы можете предоставить. – Deon

+0

Ваше сообщение произнесло «fitlered», не так ли? Я не знаю пути с формулами, но отредактировал свой ответ с некоторыми VBA. –

+0

Спасибо! Я пошел вперед и использовал код VBA, и он работает очень хорошо. – Deon

3

Нашел:

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

на Excel Forum

Испытано в на вашем примере и .. это работает :-)

Смежные вопросы