Получить используемый диапазон в столбце таблицы ListObject

Я использую этот код, чтобы получить используемый диапазон в столбце таблицы Listobject, но мне было интересно, есть ли лучший способ сделать это с помощью Listobjects, поскольку этот код подвержен ошибкам.

Dim Lastrow As Integer
Dim rng as Range

Lastrow = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
Set rng = Range("B12:B" & Lastrow)
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
0
1 458
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Таким образом, вы избежите каких-либо ошибок, потому что ваши ошибки исходят из ActiveSheet, которые могут отличаться, если пользователь взаимодействует:

Dim Lastrow As Long 'don't use Integer is a Long cut to the integer
Dim rng As Range

With ThisWorkbook.Sheets("MySheet") 'Change MySheet to your working sheet name
    Lastrow = .Cells(.Rows.Count, 2).End(xlUp).Row
    Set rng = .Range("B12:B" & Lastrow)
End With

Таким образом, все ваши данные будут поступать из листа MySheet как LastRow, так и rng. Вы можете заметить, что я использую точку перед Cells, Rows.count и Range. Это означает, что он ссылается на лист в строке: With ThisWorkbook.Sheets("MySheet")

Ответ принят как подходящий

Следующее выберет диапазон ваших данных в столбце таблицы 2.

Dim tbl as ListObject
Dim rng as Range

set tbl = ActiveSheet.ListObjects("YourTableName")

set rng = tbl.ListColumns(2).DataBodyRange

Существует очень подробное руководство о том, как выбрать различные части ListObject здесь.

╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║                                      Selecting Areas Of A Table With VBA                                     ║
╠══════════════════════════════════════╦═══════════════════════════════════════════════════════════════════════╣
║                Select                ║                               VBA Coding                              ║
╠══════════════════════════════════════╬═══════════════════════════════════════════════════════════════════════╣
║ Entire Table                         ║ ActiveSheet.ListObjects("Table1").Range.Select                        ║
╠══════════════════════════════════════╬═══════════════════════════════════════════════════════════════════════╣
║ Table Header Row                     ║ ActiveSheet.ListObjects("Table1").HeaderRowRange.Select               ║
╠══════════════════════════════════════╬═══════════════════════════════════════════════════════════════════════╣
║ Table Data                           ║ ActiveSheet.ListObjects("Table1").DataBodyRange.Select                ║
╠══════════════════════════════════════╬═══════════════════════════════════════════════════════════════════════╣
║ Third Column                         ║ ActiveSheet.ListObjects("Table1").ListColumns(3).Range.Select         ║
╠══════════════════════════════════════╬═══════════════════════════════════════════════════════════════════════╣
║ Third Column (Data Only)             ║ ActiveSheet.ListObjects("Table1").ListColumns(3).DataBodyRange.Select ║
╠══════════════════════════════════════╬═══════════════════════════════════════════════════════════════════════╣
║ Select Row 4 of Table Data           ║ ActiveSheet.ListObjects("Table1").ListRows(4).Range.Select            ║
╠══════════════════════════════════════╬═══════════════════════════════════════════════════════════════════════╣
║ Select 3rd Heading                   ║ ActiveSheet.ListObjects("Table1").HeaderRowRange(3).Select            ║
╠══════════════════════════════════════╬═══════════════════════════════════════════════════════════════════════╣
║ Select Data point in Row 3, Column 2 ║ ActiveSheet.ListObjects("Table1").DataBodyRange(3,                    ║
║                                      ║   2).Select                                                           ║
╠══════════════════════════════════════╬═══════════════════════════════════════════════════════════════════════╣
║ Subtotals                            ║ ActiveSheet.ListObjects("Table1").TotalsRowRange.Select               ║
║                                      ║                                                                       ║
╚══════════════════════════════════════╩═══════════════════════════════════════════════════════════════════════╝

Том, я думаю, что это выбирает даже пустые ячейки в столбце 2 таблицы?

JoaMika 13.06.2019 22:12

Я пытаюсь передать ваш ответ в список со списком пользовательской формы, но, похоже, не работает

JoaMika 13.06.2019 22:13

@JoannaMikalai Да, подойдет - как и у вас выше. Если вам нужны непустые ячейки, вы можете попробовать использовать set rng = tbl.ListColumns(2).DataBodyRange.SpecialCells(xlCellTypeCons‌​tants), что в зависимости от ваших данных может опустить пустые ячейки. Как вы передаете это ComboBox.List? Это может быть связано с тем, что вы передаете ему объект диапазона. Попробуйте вместо этого использовать ComboBox.List = rng.Value2

Tom 17.06.2019 10:43
Sub F()
    Dim tbl As ListObject
    Dim col As ListColumn
    Set tbl = ActiveSheet.ListObjects("Table1")
    Set col = tbl.ListColumns(2)
End Sub

Я использую это:

Dim lastrow as Long, tbl As ListObject
With Sheets("Sheet1")
    Set tbl = .ListObjects("MyTable")
    With tbl
        'Siddharth Rout, Feb 2018
        'http://www.siddharthrout.com/index.php/2018/02/10/find-last-row-and-last-column/
        'https://stackoverflow.com/questions/11169445/error-in-finding-last-used-cell-in-vba
        lastrow = .ListColumns(1).Range.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
        .DataBodyRange(lastrow, 1).Resize(1, 3) = Array(Date, "some text", "some text")
    End With
    Set tbl = Nothing
End With

Другие вопросы по теме