Excel ссылается на ячейки таблицы по имени столбца вместо смещения

#excel #vba

Вопрос:

Пожалуйста, рассмотрите приведенный ниже код, он повторяет столбец «Страна» таблицы и меняет позиции ячейки 2 на «Изменено»справа. Мне нужно прекратить использовать смещение и обратиться к двум столбцам справа от названия заголовка «Капитал». Как это сделать?

Любая помощь будет очень признательна!

 For each lookupcell in lookupsheet.Range("A1:A10")

For Each updatecell in updatesheet.Listobjects(1).Listcolumns("Country").databodyRange

if updatecell.offset(0,2).value= lookupcell.Value 'Need to change this line, remove offset and use column name instead

if updatecell.offset(0,3).value= lookupcell.offset(0,2).Value 'Need to change this line, remove offset from Cell1 and use column name instead

Then.....

Next updatecell

Next lookupcell`
 

Комментарии:

1. Почему ты зацикливаешься? Почему бы просто не ActiveSheet.ListObjects(1).ListColumns("Capital").DataBodyRange.Value = "Changed" сделать это ?

2. Это все твой код? Если есть больше логики, пожалуйста, обновите свой вопрос, чтобы включить его

3. Привет, Джос, На самом деле я использую databodyrange «Страна» для обновления многих столбцов таблицы и с разными значениями, получаемыми из отдельного файла, в настоящее время используя смещение, но я боюсь, что расположение столбцов может измениться, поэтому пытаюсь ссылаться на имена столбцов

4. Мой код действительно ссылается на столбец по имени.

5. Привет, Джос, Спасибо за ответ и извините, если мой вопрос недостаточно ясен, но мне нужно указать столбец «Столица» при повторении столбца «Страна» databodyrange, потому что для обновления требуется несколько столбцов.

Ответ №1:

 With ActiveSheet.ListObjects(1)
    For i = 1 To .DataBodyRange.Rows.Count
        If [Your Test] Then
            .ListColumns("Capital").DataBodyRange(i).Value = "Changed"
        End If
    Next i
End With
 

Измените [Свой тест] по мере необходимости, например:

 With ActiveSheet.ListObjects(1)
    For i = 1 To .DataBodyRange.Rows.Count
        If .ListColumns("Country").DataBodyRange(i).Value = "A" Then
            .ListColumns("Capital").DataBodyRange(i).Value = "Changed"
        End If
    Next i
End With
 

Комментарии:

1. Спасибо, это решило проблему. Иногда итерация проходит через отфильтрованный диапазон, так что в таком случае, как поместить индекс в специальные ячейки? Диапазон данных. Специальные ячейки(xlCellTypeVisible)

2. Вместо того, чтобы пытаться определить, фильтруется ли данная строка или нет, предпочтительнее добавить в цикл новое условие, эквивалентное условию, которое используется для фильтра.