2015-06-08 41 views
1

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

所以我想将计算移动到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列,但只在滤波后的数据。

谢谢你的帮助!

ADDITION:

这是我为宏编写的代码到目前为止。它过滤不同工作表上的数据,然后使用日期范围更新数据透视表。我想将计数计算添加到此代码的末尾,并将计数返回到“报告”表中的单元格。

子的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 
+0

那怎么假设VBA宏想知道,如果被过滤或没有数据?请澄清。最好的问候, –

+0

看到我的问题 –

+0

此外代码很好。我只想添加到它。我想要计算在H列'2015 Master'表中过滤的数据中显示的“temp”的次数。这是过滤的位置:ActiveSheet.ListObjects(“Table44”)。Range.AutoFilter Field (“Table44 [[#Headers],[GMP or non-GMP]),或者是不符合GMP标准的产品,或者不符合GMP要求的产品,或者不符合GMP标准。 ]] “)选择 ActiveSheet.ListObjects(” Table44" )Range.AutoFilter场:= 2,标准1:= _ “GMP” –

回答

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 

其中的4 count值是数字的 “温度” 出现在指定“H”范围。

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

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对象模型说,在一般情况下,一个范围可组成的区域,每个区域本身也是由一系列代表的,但是这一次,它被理解为一个连续范围。您可以判断范围是否连续的唯一方法是将其创建为方框/矩形,或者如果Areas.Count = 1。

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

+0

嗨,谢谢,我只是回到这个,并希望你能解释“ar = r.Areas”这条线是做什么的?我也尝试在我的CountIF中使用rSub,并遇到一些困难。这是我有:tempcount = Application.WorksheetFunction.CountIf(范围(“rsub”),“*温度*”)任何帮助,将不胜感激。 –

+0

尝试将rSub作为变量而不是字符串传递给该函数。 (例如没有引号)。我认为你也不需要Range()。 –