【问题标题】:How to count hidden/filtered out rows that has content in them using excel VBA?如何使用 excel VBA 计算隐藏/过滤掉的包含内容的行?
【发布时间】:2018-04-23 02:29:56
【问题描述】:

下面的代码只显示可见行的计数,但是,在运行代码之前过滤行时,它不会检测到隐藏行。

Total_rows_Pick = Workbooks("Job Production Monitoring.xlsm").Worksheets("Pick-ups").Range("B" & Rows.count).End(xlUp).Row

我应该怎么做才能获得等效代码,包括检测甚至隐藏/过滤掉的包含文本的行?

我的过滤工作表示例是(注意第 2 行被过滤掉了):

运行上面这行代码后,locals窗口只计算标题,不计算第2行。

变量的屏幕截图如 locals 窗口所示:

【问题讨论】:

  • 添加了一个简单的解决方案,循环遍历使用范围的数据字段数组。此外,我展示了一个基于@Jon-Crowell 有趣方法的替代方案。

标签: excel vba


【解决方案1】:

循环使用范围内的数据字段数组

实体End(xlUp) 方法因隐藏行而失败,因为在可见范围内没有可移动的内容。因此,我只是尝试从 B 列的最后一行开始循环遍历使用的范围并检查值。

提示:最好使用变体 datafield Array(在示例代码中称为 v),因为通过 VBA 循环遍历范围很慢。: p>

示例代码

Sub FindLastRow()
Dim i As Long, Total_rows_Pick As Long
Dim ws As Worksheet, v As Variant
Set ws = ThisWorkbook.Worksheets("Pick-ups")
v = ws.Range("B1:B" & ws.UsedRange.Rows.Count)  ' write data into 1-based 2-dim datafield array
For i = UBound(v) To 2 Step -1                  ' start search in last row of used range
    If Len(v(i, 1) & "") <> 0 Then              ' take first value
       Exit For
    End If
Next i
total_rows_pic = i                              ' last row with value
MsgBox Total_rows_Pick
End Sub

临时表的替代解决方案

Jon Crowell 通过将原始数据表复制到 临时 表中展示了另一种解决方案;取消隐藏所有行允许使用原始方法找到最后一行:

Sub FindLastRow2()
' Modified source: https://stackoverflow.com/questions/14200392/finding-the-last-row-of-an-excel-spreadsheet-when-the-last-row-is-hidden
' Thx:  Jon Crowell
  Dim Total_rows_Pick As Long, ws As Worksheet
  Set ws = ThisWorkbook.Worksheets("Pick-ups")
' copy original data to temporary sheet and unhide all rows
  ws.Copy Before:=ws
  With ActiveSheet                  ' << temporary sheet only
    ' [1]turn off autofiltering
      If .AutoFilterMode Then .AutoFilterMode = False
    ' [2] unhide all rows
      .Columns("B:B").EntireRow.Hidden = False
    ' [3] get the last row there
      Total_rows_Pick = .Range("B" & .Rows.Count).End(xlUp).Row
    ' [4] delete the temporary sheet
      Application.DisplayAlerts = False
      .Delete
      Application.DisplayAlerts = True
  End With
  MsgBox Total_rows_Pick
End Sub

【讨论】:

  • @Pherdindy,您能否在我的回答中尝试我的两种方法?如果您将其标记为已接受,以防您找到有用的解决方案,我们将不胜感激。
猜你喜欢
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 2017-12-31
相关资源
最近更新 更多