我是使用VBA的新手,并希望将代码添加到一个按钮,该按钮将识别名为" QA_Activity"的表的大小。单击按钮时清除除标题行之外的所有内容。我希望这会非常简单,但我正在努力确定如何确定每月可能有不同大小的表格。非常感谢提前。
答案 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,因为有人可能已删除标题下的所有行。例如,请参考此表:
DataBodyRange中有多少行?
Worksheets("SomeSheet").Listobjects("Table1").DataBodyRange.Clear
好的,现在我要删除这些行:
...离开这个:
DataBodyRange现在有多少行?
? Range("Table1").ListObject.DataBodyRange.Rows.Count
3
哎呀...如果它不存在,你就不能引用.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
这应该清除除第一行(标题)之外的范围。
重要提示:必须完全填写标题行和范围的第一列(无空单元格)才能使上述内容顺利运行。