【问题标题】:Excel to CountIF in filtered data过滤数据中的 Excel 到 CountIF
【发布时间】:2015-06-18 13:17:15
【问题描述】:

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

所以我想将计算移至 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 列中的次数,但仅出现在过滤后的数据中。

感谢您的帮助!

补充:

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

子按钮1_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

【问题讨论】:

  • 假设的 VBA 宏如何知道数据是否被过滤?请说清楚。最好的问候,
  • 查看我在问题中的补充
  • 该代码运行良好。我只是想补充一下。我想计算在 H 列的“2015 Master”表上过滤的数据中出现“temp”的次数。这是过滤的地方:ActiveSheet.ListObjects("Table44").Range.AutoFilter Field _ :=3, Criteria1:=">=" & dStart, Operator:=xlAnd, Criteria2:= _ "
  • 那么,你能把你的问题缩小到那个特定的任务吗?其他东西似乎无关紧要:根据您的解释,它已经完成/正常工作。最好的问候,

标签: vba excel


【解决方案1】:

针对明确的问题主题(即“基本上我想统计H列出现“Temp”的次数...”),VBA解决方案可以如下代码sn-p.假设在“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”次数。

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

【讨论】:

    【解决方案2】:

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

    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 将是反映这些不连续单元格的单个 Range。 SpecialCells 的返回值也会发生同样的情况。

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

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

    【讨论】:

    • 嗨,谢谢,我刚刚回到这个问题上,希望你能解释一下“ar=r.Areas”这条线的作用是什么?我也尝试在我的 CountIF 中使用 rSub 并且遇到了一些困难。这就是我所拥有的: tempcount = Application.WorksheetFunction.CountIf(Range("rsub"), "Temp") 任何帮助将不胜感激。
    • 尝试将 rSub 作为变量而不是字符串传递给函数。 (例如,不带引号)。我认为您也不需要 Range()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多