繁体   English   中英

在过滤数据中将Excel转换为CountIF

[英]Excel to CountIF in filtered data

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

因此,我想将计算移至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)

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

谢谢您的帮助!

加成:

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

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

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

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”次数。

希望这会有所帮助。 最好的祝福,

要遍历一列并仅查找可见(未过滤)的单元格,一种方法是:

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

注意事项:如果手动隐藏了任何行(或列)(而不是从筛选中隐藏),则使用此方法的计数将认为它们已被筛选(即,隐藏/不可见)。


更新:回答评论

范围实际上是将单元格聚合成一个分组或集合对象(范围)的非常通用的概念。 即使我们通常将范围视为单元格(即连续单元格)的方框或矩形,但范围实际上可以组装不连续的单元格。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM