Подтвердить что ты не робот

Как я зацикливаю таблицу excel 2010, используя его имя и колонку?

Поскольку Excel 2010 я использую много таблиц в Excel. Например, у меня есть таблица "tabWorkers" с тремя столбцами: "ID", "Имя", "Фамилия".

Я уже выяснил, что я могу ссылаться на таблицу в VBA, используя []. Например:

Dim row As Range
For Each row In [tabWorkers].Rows
    MsgBox (row.Columns(2).Value)
Next

Это даст мне первое имя каждой строки, которая отлично работает.. но я хочу сделать ее более динамичной, используя имя этого столбца, как это:

Dim row As Range
For Each row In [tabWorkers].Rows
    MsgBox (row.Columns("Firstname").Value)
Next

Конечно, я мог бы сделать какой-то поиск, который связывает индекс столбца "2" с var, как FirstnameIndex, но я хочу правильный синтаксис. Я уверен, что это возможно, но просто не документировано (например, с помощью [tabWorkers].Rows)

4b9b3361

Ответ 1

Я не очень хорошо разбираюсь в сокращенном методе обращения к таблицам. Если вы не получите ответа, вы можете найти этот метод longhand, который использует модель ListOject, полезный:

Sub ListTableColumnMembers()
Dim lo As Excel.ListObject
Dim ws As Excel.Worksheet
Dim lr As Excel.ListRow

Set ws = ThisWorkbook.Worksheets(2)
Set lo = ws.ListObjects("tabWorkers")

For Each lr In lo.ListRows
Debug.Print Intersect(lr.Range, lo.ListColumns("FirstName").Range).Value
Next lr
End Sub

Ответ 2

попробуйте следующее:

Dim row as Range
For Each row in [tabWorkers[first name]].Rows
     MsgBox row.Value
Next

Ответ 3

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

Наконец, сегодня пенни упала, и я нашел кое-что, что хотел бы поделиться, чтобы помочь тем, кто следит за тем же вопросом, который меня прослушивал.

Вкратце вопрос: как ссылаться на строки таблицы в vba, используя стандартные имена частей таблицы. Это оказывается довольно легко. Вы можете ссылаться на определенные строки таблицы и вызывать столбцы по их истинному имени без необходимости переопределять любые дополнительные переменные.

Конструкция выглядит так: Range ( "TableName [ColumnName]" ) (RowNumber)

где TableName и ColumnName являются стандартными именами таблиц и столбцов из Excelside, а RowNumber является простым индексом целого числа строк от 1 до диапазона ( "Таблица 1" ). Rows.Count

Для таблицы с двумя столбцами, называемой таблицей 1, с столбцами с именем ID и данными, вы можете прокручивать элементы таблицы, используя эту конструкцию

For Rw = 1 To Range("Table1").Rows.Count
     MsgBox(Range("Table1[ID]")(Rw) & "has value" & Range("Table1[Data]")(Rw)    )
Next Rw

Это приводит к очень похожим конструкциям к тем, которые используются в Excel, и не требует дополнительного именования. И это очень читаемо! После этого вы также можете добавить соответствующие модификаторы диапазона, такие как .Text,.Value,.Formula и т.д. После этого (Rw).

Обратите внимание: если у вас есть таблица с одной строкой (например, для параметров) или хотите обратиться к первой строке таблицы большего размера, вы можете пропустить бит (Rw) и использовать Range напрямую. Таким образом, таблица под названием Params с столбцами Color, Size и Height может быть отнесена к использованию Range ( "Params [Color]" ) или Range ( "Params [Height]" ) и т.д. Вам не нравится?: -)

Это открытие действительно зацепило меня за Таблицы. Теперь они обеспечивают мне очень аккуратную связь между vba и листами в читаемом и совместимом виде.

Спасибо, Microsoft!

Bob JordanB

Ответ 4

Я обычно делаю это так

Dim rng as Range
Set rng = Application.Range("Tablename[Columnname]")

Вам нужно только обратиться к книге, потому что имена таблиц уникальны во всей книге. Но если у вас одинаково названные таблицы в разных открытых книгах, это повлияет на активную книгу, а не на обе или в фоновом режиме. Чтобы предотвратить это, вы должны вызвать объект диапазона фактического листа, в котором находится ваша таблица.

Надеюсь, это покажет, что это можно сделать так, как я описал выше:

Например, у меня есть метод в базе данных Access, который применяет условное форматирование к таблице в документе Excel, который я только что создал и заполнил с помощью CopyFromRecordSet.

Что имеет подпись

Private Function HighlightBlankOrZeroColumn(RangeToFormat As Range, HighlightColor As Long)

и я называю это

HighlightBlankOrZeroColumn ApXL.Range("Table1[" & SoucreRst.Fields(intCount).Name & "]"), BlankOrZeroColor

где ApXL - это New Excel.Application, а SoucreRst - это набор записей ADO.

К этому моменту я уже сделал свой набор Recordset → Range таблицей, вызвав эти два метода:

xlWSh.ListObjects.Add(xlSrcRange, xlWSh.UsedRange, , xlYes).Name = "Table1"
xlWSh.ListObjects("Table1").TableStyle = "TableStyleLight16"

Ответ 5

Более сжатый, проверенный в Excel 2007:

Dim row As Range
For Each row In [tabWorkers].Rows
    MsgBox Intersect (row,[tabWorkers[FirstName]]).Value
Next

Ответ 6

Спасибо Дугу! Это очень помогло. рабочий пример:

Dim row As Range
For Each row In [tabWorkers].Rows
    MsgBox (row.Columns(row.ListObject.ListColumns("Firstname").Index).Value)
Next

Ответ 7

Это мой первый пост. Прошло много времени с вопроса, но я надеюсь, что это поможет.

Основная идея состоит в том, чтобы сохранить кусок кода таким же аккуратным, как и он.

Set selrange = Selection.EntireRow

For Each rrow In selrange.Rows
        selrange.Parent.Parent.Names.Add "rrow", rrow
        name = [table1[name] rrow].Text
        age = [table1[age] rrow].Text
        gender = [table1[gender] rrow].Text
Next
selrange.Parent.Parent.Names("rrow").Delete