2015-06-08 130 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()。 –