下面是一个宏,用于选择数据透视表的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
,那么只有cols
是Integer
,而rows
是Variant
。在VBA中,您需要为每个变量声明一个类型,或者默认情况下为Variant
。此外,Excel中的行数超过了Integer
的容纳量,因此必须使用Long
:Dim rows As Long, cols As Long
。由于在VBA中使用Integer
没有任何好处,我建议始终使用Long
。