我正在尝试使用 VBA 代码获取 Excel 中表格第二列的单元格范围,并在每次用户窗体初始化时表中存在新条目时自动更新此范围。起初我认为这很容易,但现在我完全迷失了,不知道如何让我的代码工作。我可能缺少一些东西。
我在这个论坛上搜索了一下,发现了两种可能的解决方案,第一个是:
Sub test()
Dim table As ListObject
Set table = ActiveSheet.ListObjects("Table1")
Debug.Print table.ListColumns(2).Range.Rows.Count
End Sub
Run Code Online (Sandbox Code Playgroud)
这段代码有点作用。Table1每次我运行它时,它都会成功识别所有新行。问题是它标识了整个表,我只想获取单个列的范围。无论我做什么,变量table总是获得整个表的范围。
我发现了第二种方法如下:
Sub test()
Dim tbl as ListObject
Dim rng as Range
Set tbl = ActiveSheet.ListObjects("Table1")
Set rng = tbl.ListColumns(2).DataBodyRange
End Sub
Run Code Online (Sandbox Code Playgroud)
这段代码也有点工作,但前提是表只有一行数据。如果我的表只有一行数据,则变量rng可以毫无问题地识别表和行。但是,变量的值是单元格的值(例如“示例文本”),而不是单元格范围。如果我尝试添加更多行,则变量rng仍为空。
我真的很感激任何对此的指导。我还应该提到,即使在主动使用不同的工作表(例如C3:C5. 当输入更多数据以获得更新的范围时,例如C3:C80. 我也不想选择范围,只是获取该信息并将其用于其他目的。
您的代码已返回指定列的所有数据。您可以通过添加到您的 Sub(在 后面Set rng = ...)来看到这一点,并在立即窗口中查看输出
Sub test()
Dim tbl as ListObject
Dim rng as Range
Set tbl = ActiveSheet.ListObjects("Table1")
Set rng = tbl.ListColumns(2).DataBodyRange
Debug.Print rng.Address
Dim cl As Range
For Each cl In rng
Debug.Print cl.Address, cl.Value
Next
End Sub
Run Code Online (Sandbox Code Playgroud)
至于你的第二个问题,改变
Set tbl = ActiveSheet.ListObjects("Table1")
Run Code Online (Sandbox Code Playgroud)
到
Set tbl = ActiveWorkbook.Worksheets("NameOfTableSheet").ListObjects("Table1")
Run Code Online (Sandbox Code Playgroud)
您可能还想指定特定的工作簿。
Set tbl = Workbooks("NameOfWorkbook").Worksheets("NameOfTableSheet").ListObjects("Table1")
Run Code Online (Sandbox Code Playgroud)