Я использую этот код, чтобы получить используемый диапазон в столбце таблицы 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)
Таким образом, вы избежите каких-либо ошибок, потому что ваши ошибки исходят из 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 ║
║ ║ ║
╚══════════════════════════════════════╩═══════════════════════════════════════════════════════════════════════╝
Я пытаюсь передать ваш ответ в список со списком пользовательской формы, но, похоже, не работает
@JoannaMikalai Да, подойдет - как и у вас выше. Если вам нужны непустые ячейки, вы можете попробовать использовать set rng = tbl.ListColumns(2).DataBodyRange.SpecialCells(xlCellTypeConstants)
, что в зависимости от ваших данных может опустить пустые ячейки. Как вы передаете это ComboBox.List
? Это может быть связано с тем, что вы передаете ему объект диапазона. Попробуйте вместо этого использовать ComboBox.List = rng.Value2
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
Том, я думаю, что это выбирает даже пустые ячейки в столбце 2 таблицы?