Выберите сводную таблицу DataBodyRange, исключите последнюю строку - PullRequest
0 голосов
/ 26 февраля 2020

Ниже приведен макрос, который я использую для выбора 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

Существует ли более простой способ исключить последний ряд в выборе?

1 Ответ

1 голос
/ 26 февраля 2020

Вероятно, это не совсем простой способ, пока выглядит хорошо, но вы можете опустить размер столбца, если он не изменится: 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

Если вам нужно делать это чаще в вашем коде на большем количестве диапазонов, тогда я предлагаю использовать функцию для it:

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 only cols, это Integer, но rows это Variant. В VBA вам нужно объявить тип для каждой переменной или это Variant по умолчанию. Кроме того, в Excel больше строк, чем умещается в Integer, поэтому вы должны использовать Long вместо: Dim rows As Long, cols As Long. Поскольку нет никакой пользы от использования Integer вообще в VBA, я рекомендую всегда использовать Long вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...