Как динамически ссылаться на самую последнюю ячейку в любой таблице? - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь создать кнопку, которая сбрасывает заданную таблицу в ее ... скажем, размер по умолчанию и форматирование

Я потратил немного, чтобы получить Диапазон.Изменить размер право собственности, но позже выяснилось, что после изменение размера или уменьшение таблицы требует от меня очистки всего, что осталось позади.

...
Sub Bt_clear_tb1()
    'ScreenUpdate
    Application.ScreenUpdating = False
    Application.CutCopyMode = False

    'Resize and cleanup
    With ActiveSheet.ListObjects("Tab1")
        .Resize(.Range.Resize(10))
        .ListColumns(1).DataBodyRange.ClearContents
        .ListColumns(2).DataBodyRange = _ ...
        .ListColumns(3).DataBodyRange = _ ...
    End With

    'Clear the rest | ---► Don't want it to be fixed ◄--- |
        Range("A11", "Q11").Select                   ◄--- |
        Range(Selection, Selection.End(xlDown)).Select ◄--|
        Selection.ClearContents                      ◄--- |

    'ScreenUpdate
     Application.ScreenUpdating = True
End Sub
...

Конечно, я заставил его работать вручную на фиксированных диапазонах, но я не могу найти способ получить целевой диапазон динамически.Поэтому, если бы я когда-нибудь решил переместить или изменить его размер по-другому, мне не пришлось бы каждый раз переписывать код.

Почти думал, что я его получил

как:

wb.ListObjects(1).Range.Cells(.Range.Rows.Count, .Range.Columns.Count).Offset(1,0).Select

Range(Selection, Selection.End(xlToLeft).End(xlDown).Select
Selection.ClearContents

Но это не динамично ... если я изменю ListObjects (1) на другую таблицу, он все равно очищает область ниже первой.

Знаете ли вы какой-либо другой способ каким-либо образом получить 'Range области нижеtable '?

~ также, пожалуйста, извините за мой ужасный английский .. Я надеюсь, что это читабельно и как-то имеет смысл

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Спасибо за подсказку!

Я обнаружил, что следующее решает мою проблему:

    Sub bt_table_1_clean()
    'ScreenUpdate
    Application.ScreenUpdating = False
    Application.CutCopyMode = False

    '@@@ Resize and cleanup
     Const ROWS2KEEP As Long = 20

    With ActiveSheet.ListObjects("Tab1")
        .Resize (.Range.Resize(ROWS2KEEP + 1))
        .ListColumns(1).DataBodyRange.ClearContents
        .ListColumns(2).DataBodyRange = ...
        .ListColumns(3).DataBodyRange = ...
        .Range.Offset(ROWS2KEEP + 1).Resize(ActiveSheet.UsedRange.Rows.Count).ClearContents
    End With        

    'ScreenUpdate
    Application.ScreenUpdating = True
End Sub

Это то, что мне нужно:

.Range.Offset(ROWS2KEEP + 1).Resize(ActiveSheet.UsedRange.Rows.Count).ClearContents

0 голосов
/ 06 февраля 2019

Вроде так:

Sub Bt_clear_tb1()
    Dim lSize As Long
    Const ROWS2KEEP As Long = 10
    'ScreenUpdate
    Application.ScreenUpdating = False
    Application.CutCopyMode = False

    'Resize and cleanup
    With ActiveSheet.ListObjects("Table1")
        lSize = .ListRows.Count
        .Resize (.Range.Resize(ROWS2KEEP))
        .ListColumns(1).DataBodyRange.ClearContents
        .ListColumns(2).DataBodyRange = "_ ..."
        .ListColumns(3).DataBodyRange = "_ ..."
        .Range.Offset(ROWS2KEEP).Resize(lSize - (ROWS2KEEP - 1)).ClearContents
    End With
    'ScreenUpdate
     Application.ScreenUpdating = True
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...