选择数据透视表DataBodyRange,排除最后一行



下面是一个宏,用于选择数据透视表的DataBodyRange,不包括最后一行(Grand Total行(。

Sub SelectDataBodyRange()
Dim rng As Range
Dim rows, cols As Integer
Set rng = ActiveSheet.PivotTables("PivAuswertung").DataBodyRange
'Now get the number of rows and columns
rows = rng.rows.Count
cols = rng.Columns.Count
'Resize selection, exclude last row
Set rng = rng.Resize(Rowsize:=rows - 1, ColumnSize:=cols)
'Select the new range (with excluded last row)
rng.Select
End Sub

有没有更简单的方法可以排除选择中的最后一行?

可能不是一个更简单的方法,到目前为止看起来不错,但如果列大小不变,可以省略它:rng.Resize(Rowsize:=rows - 1)。因此,您也不需要cols = rng.Columns.Count

如果可能的话,避免使用ActiveSheet,用户点击即可轻松更改。更好地使用ThisWorkbook.Worksheets("NameOfSheet").PivotTables…

Option Explicit
Sub SelectDataBodyRange()
Dim rng As Range
Set rng = ActiveSheet.PivotTables("PivAuswertung").DataBodyRange
'if possible name your sheet and don't use ActiveSheet. Better ThisWorkbook.Worksheets("NameOfSheet").PivotTables…
'Resize selection, exclude last row
Set rng = rng.Resize(RowSize:=rng.rows.Count - 1)
rng.Select
End Sub

或者即使这样也应该工作

Option Explicit
Sub SelectDataBodyRange()
With ActiveSheet.PivotTables("PivAuswertung").DataBodyRange
.Resize(RowSize:=.Rows.Count - 1).Select
End With
End Sub

如果你需要在更多范围的代码中更频繁地这样做,那么我建议使用一个函数:

Option Explicit
Public Function RemoveLastRowsFromRange(ByVal FromRange As Range, Optional ByVal RowCount As Long = 1) As Range
Set RemoveLastRowsFromRange = FromRange.Resize(RowSize:=FromRange.Rows.Count - RowCount)
End Function
Sub SelectDataBodyRange()
'removes 1 rows (1 is default)
RemoveLastRowsFromRange(ActiveSheet.PivotTables("PivAuswertung").DataBodyRange).Select
'removes 5 rows
RemoveLastRowsFromRange(ActiveSheet.PivotTables("PivAuswertung").DataBodyRange, 5).Select
End Sub

还有一点需要注意:如果您声明Dim rows, cols As Integer,那么只有colsInteger,而rowsVariant。在VBA中,您需要为每个变量声明一个类型,或者默认情况下为Variant。此外,Excel中的行数超过了Integer的容纳量,因此必须使用LongDim rows As Long, cols As Long。由于在VBA中使用Integer没有任何好处,我建议始终使用Long

最新更新