[英]SpecialCells(xlCellTypeVisible) choose the whole worksheet
很抱歉,這個問題不清楚。 這是來自Error的示例, 當我使用AutoFilter的SpecialCells來獲取VBA中的可見單元格時更改了代碼:
Sub Sample():
ActiveSheet.AutoFilterMode = False
Dim rRange As Range
Dim Rnge As Range
Dim last_Row As Integer
Set rRange = Sheets("Sheet1").Range("A1:F6")
'~~> Filter,
With rRange
.AutoFilter Field:=1, Criteria1:="=1"
End With
last_Row = Workbooks("Book1").Sheets("Sheet1").Range("A1048576").End(xlUp).Row
'~~> Offset(to exclude headers)
Set Rnge = Range("A2:A" & last_Row).SpecialCells(xlCellTypeVisible)
Debug.Print Rnge.Address
Debug.Print last_Row
End Sub
樣本數據:
Number1 Number2 Number3 Number4 Number5 Number6
1 1 1 1 1 1
2 2 2 2 2 2
3 3 3 3 3 3
4 4 4 4 4 4
5 5 5 5 5 5
如果我將條件設置為2,則debug.print將給我row3。 但是,如果我將條件設置為1。它將返回$ 1:$ 2,$ 7:$ 1048576 2.發生了什么?
這是在單個第一行上嘗試.SpecialCells(xlCellTypeVisible)
時的已知問題.SpecialCells(xlCellTypeVisible)
last_row為2時,您的范圍是Range("A2:A2")
)。 如果從單行過濾的數據中設置.SpecialCells(xlCellTypeVisible,則它包括過濾范圍之外的數據范圍;如果在過濾前設置了last_row ,則假設您要啟動的數據多於一行,則將獲得正確的結果用。
last_Row = Sheets("Sheet1").Range("A" & rows.count).End(xlUp).Row
Set rRange = Sheets("Sheet1").Range("A1:F" & last_Row)
'~~> Filter,
With rRange
.AutoFilter Field:=1, Criteria1:="=1"
End With
我更喜歡嚴格地在要過濾的范圍內工作,並使用工作表函數.Subtotal
來確定是否有任何要處理的單元格。
Sub Sample2()
ActiveSheet.AutoFilterMode = False
With Sheets("Sheet1").Cells(1, 1).CurrentRegion
.AutoFilter
.AutoFilter Field:=1, Criteria1:="=1"
With .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count)
If Application.Subtotal(103, .Columns(1)) Then
Debug.Print .Columns(1).SpecialCells(xlCellTypeVisible).Address(0, 0)
Debug.Print .SpecialCells(xlCellTypeVisible).Rows.Count
Else
Debug.Print "no cells were found"
End If
End With
End With
End Sub
.CurrentRegion
返回包含A1的日期塊或日期島,直到遇到完全空白的行或列。 這與選擇A1並點擊Ctrl + A相同 。 通過嚴格地在CurrentRegion的范圍內工作(請記住在偏移時調整大小),可以避免范圍引用可能溢出到工作表的其余部分,在這些地方可見行將是工作表單元格的其余部分。
上面有一個知識庫白皮書,但很遺憾,我找不到它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.