获取表列的范围(或值)Excel VBA

Ale*_*der 5 excel vba

我正在尝试使用 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. 我也不想选择范围,只是获取该信息并将其用于其他目的。

chr*_*sen 8

您的代码已返回指定列的所有数据。您可以通过添加到您的 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)