VBA编码以识别和清除特定表中的数据

时间:2018-04-11 07:23:18

标签: excel excel-vba vba

我是使用VBA的新手,并希望将代码添加到一个按钮,该按钮将识别名为" QA_Activity"的表的大小。单击按钮时清除除标题行之外的所有内容。我希望这会非常简单,但我正在努力确定如何确定每月可能有不同大小的表格。非常感谢提前。

2 个答案:

答案 0 :(得分:1)

表在VBA中称为ListObjects。 ListObject有一个名为.DataBodyRange的属性,它包含标题下的所有内容。那有一个.Clear方法。

我通常使用这种语法来清除ListObject的主体:

def sum_around(matrix, r, c):
    total = 0
    offset = (0, 1, -1)
    indices = ((i, j) for i in offset for j in offset)

    next(indices, None)

    for rec in indices:
        try:
            row = r - 1 + rec[0]
            col = c - 1 + rec[1]
            total += matrix[row][col] if 0 <= row and 0 <= col else 0
        except IndexError:
            continue
    return total

Range("Table1").ListObject.DataBodyRange.Clear 位允许我找到ListObject,即使我不知道它是什么表。这是有效的,因为表格也是命名范围,您可以按名称进行寻址。所以你只需说&#34;转到名为Table1的命名范围,然后找到生活在那里的ListObject&#34;。否则,您需要事先知道ListObject所处的工作表,并使用以下命令:

Range("Table1")

...直到有一天你将表格移到另一张表格并且忘记更新你的代码时,它才能正常工作。

请注意,不保证表格实际上具有.DataBodyRange,因为有人可能已删除标题下的所有行。例如,请参考此表:

enter image description here

DataBodyRange中有多少行?

Worksheets("SomeSheet").Listobjects("Table1").DataBodyRange.Clear

好的,现在我要删除这些行:

enter image description here

...离开这个:

enter image description here

DataBodyRange现在有多少行?

? Range("Table1").ListObject.DataBodyRange.Rows.Count
 3

enter image description here

哎呀...如果它不存在,你就不能引用.DataBodyRange。

为了安全起见,请在尝试引用.DataBodyRange之前粘贴? Range("Table1").ListObject.DataBodyRange.Rows.Count ,然后再引用On Error Resume Next。或者更漂亮的东西。

答案 1 :(得分:-1)

首先,创建一个命名范围。如果需要,您可以使其动态化。在此示例中,命名范围是名称“数据”。

然后从以下VBA代码触发Sub“Test”。

Option Explicit

Sub ClearRange(ByVal rngCell As Range)

    Dim rngRange As Range

    Set rngRange = rngCell.CurrentRegion

    rngRange.Range(rngRange.Parent.Cells(2, 1), rngRange.Parent.Cells(rngRange.Rows.Count, rngRange.Columns.Count)).ClearContents

End Sub

Sub test()

    Dim rngCell As Range

    Set rngCell = ActiveSheet.Range("Data").Cells(1, 1)

    ClearRange rngCell

End Sub

这应该清除除第一行(标题)之外的范围。

重要提示:必须完全填写标题行和范围的第一列(无空单元格)才能使上述内容顺利运行。