Excel到过滤数据中的CountIF

时间:2015-06-08 20:58:30

标签: excel vba excel-vba

我正在尝试计算过滤数据中特定字符串的出现次数。我可以使用单元格中的公式来实现它,但是当我将其与工作簿中的其他宏结合使用时,整个事情就会冻结。

所以我想将计算移动到VBA,以便它只计算运行宏的时间。以下是在单元格中工作的公式:

=SUMPRODUCT(SUBTOTAL(3,OFFSET('2015 Master'!H:H,ROW('2015 Master'!H:H)-MIN(ROW('2015 Master'!H:H)),,1)),ISNUMBER(SEARCH("*Temp*",'2015 Master'!H:H))+0)

基本上我想计算次数" Temp"在H列中出现,但仅在过滤后的数据中出现。

感谢您的帮助!

此外:

以下是我为宏编写的代码。它过滤不同工作表上的数据,然后使用日期范围更新数据透视表。我想将计数计算添加到此代码的末尾,并将计数返回到'报告'片。

Sub Button1_Click()    '刷新数据透视表和活动工作表中的所有计算

ActiveWorkbook.RefreshAll

'Gather the start and end times from the active sheet

dStart = Cells(2, 5).Value
dEnd = Cells(3, 5).Value

'Change the active sheet to the alarms database, clear all filters and then filter for the defined date range and filter for only GMP alarms

Sheets("2015 Master").Select

If ActiveWorkbook.ActiveSheet.FilterMode Or ActiveWorkbook.ActiveSheet.AutoFilterMode Then
ActiveWorkbook.ActiveSheet.ShowAllData
End If

ActiveSheet.ListObjects("Table44").Range.AutoFilter Field _
    :=3, Criteria1:=">=" & dStart, Operator:=xlAnd, Criteria2:= _
    "<=" & dEnd

Range("Table44[[#Headers],[GMP or non-GMP]]").Select
ActiveSheet.ListObjects("Table44").Range.AutoFilter Field:=2, Criteria1:= _
    "GMP"
'Change the active sheet to the Reporting sheet

Sheets("Reporting").Select

'Within the alarms pivot table clear the label filters then filter for the date range and GMP alarms

ActiveSheet.PivotTables("PivotTable1").PivotFields("Active Time"). _
    ClearLabelFilters
ActiveSheet.PivotTables("PivotTable1").PivotFields("Active Time").PivotFilters. _
    Add Type:=xlDateBetween, Value1:=dStart, Value2:=dEnd
ActiveSheet.PivotTables("PivotTable1").PivotFields("GMP or non-GMP"). _
    CurrentPage = "GMP"
 End Sub

2 个答案:

答案 0 :(得分:0)

相对于澄清的问题主题(即“基本上我想计算次数”Temp“出现在H列中......”),VBA解决方案可以如下面的代码片段所示。假设在“H”列中输入样本数据:

<强>ħ

Temp Directory on C: Drive
Temp Directory
Project Directory
Output Temp Directory
Start Directory
Temp obj

应用VBA宏:

Sub CountTempDemo()
Dim i As Integer
Dim count As Integer
Dim startRow As Integer
Dim lastRow As Integer
Dim s As String

startRow = 2 'or use your "filtered range"
lastRow = Cells(Rows.count, "H").End(xlUp).Row 'or use your "filtered range"
count = 0
For i = 2 To lastRow
    If InStr(Cells(i, 8).Value, "Temp") > 0 Then
        count = count + 1
    End If
Next
End Sub

其中count值为4是指定“H”范围内出现的“Temp”次数。

希望这可能会有所帮助。最好的问候,

答案 1 :(得分:0)

迭代一列并找到只有可见(未过滤)的单元格,其中一种方法是:

Set h = ... Columns ("H");
Set r = h.SpecialCells(xlCellTypeVisible)
' now r is a composite range of potentially discontiguous cells 
' -- it is composed of zero or more areas
'but only the visible cells; all hidden cells are skipped
Set ar = r.Areas
for ac = 1 to ar.Count
    Set rSub = ar(ac)
    'rSub is a contiguous range
    'you can use a standard formula, e.g. Application.WorksheetFunction.CountIf(...)
    'or loop over individual elements
    'and count what you like
next

警告:如果手动隐藏任何行(或列)(而不是过滤),使用此方法的计数会将它们视为已过滤(即隐藏/不可见)。

更新:回复评论

范围实际上是将细胞聚合成分组或收集对象(范围)的非常通用的概念。尽管我们通常认为Range是一个盒子或矩形的单元格(即连续的单元格),但Range实际上可以组装不连续的单元格。

一个例子是当用户选择几个不连续的单元格,行和/或列时。然后,例如,ActiveSheet.Selection将是反映这些不连续细胞的单个范围。来自SpecialCells的返回值也会发生同样的情况。

因此,Excel对象模型说通常,Range可以由Areas组成,其中每个Area本身也由Range表示,但这次,它被理解为一个连续的Range。唯一可以判断范围是否连续的方法是将其创建为方框/矩形,或者,如果Areas.Count = 1。

调查更多一点的一种方法可能是选择一些不连续的单元格,然后输入一个宏并使用调试器来观察Selection