如何动态引用任何给定表中的最后一个单元格?

时间:2019-02-06 16:51:09

标签: excel vba

我正在尝试创建一个按钮,以将给定的表重置为其。.例如默认大小和格式

我已经花了一些时间来获得 Range.Resize 属性,但是后来发现,在调整大小缩小表之后,需要我清理所有遗留的东西。

...
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)更改为其他表,它仍会清除第一个表下方的区域。

您是否知道以其他方式获取“桌子下方区域的范围”的其他方法?

〜还请,请原谅我的英语不好。。我希望这是可读的并且有道理

2 个答案:

答案 0 :(得分:1)

像这样:

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

答案 1 :(得分:0)

谢谢你的提示!

我发现以下方法可以解决我的问题:

    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