Страницы: 1
RSS
нумерация строк в DataBodyRange. Помогите с ликбезом
 
Добрый день!

В цикле For Each oRow in oTab.DataBodyRange.Rows первое значение oRow.Row = 2.
Вопрос: почему не 1?
При этом, если взять таблицу oTab например такого типа
Заголовок
1
2
...
то значение DataBodyRange.Cells(oRow.Row,1) будет 2, а не 1. Почему пропускается первая строка?

Спасибо
 
Это номер строки на листе.

Вы получаете объект диапазон, у этого диапазона есть свойство .Row.
Изменено: МатросНаЗебре - 06.06.2022 12:30:35
 
syt navy, здравствуйте
DataBodyRange — это область без заголовков и итогов, подробнее: The VBA Guide To ListObject Excel Tables
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Диапазон DataBodyRange. По идее я должен получить строку 1 этого диапазона. Если я получаю номер строки листа, то почему при попытке прочитать значение на этой строке я уже перехожу на следующую строку диапазона?
Т.е. если я какой-то переменной Р присвою значение DataBodyRange.Rows.Row, а потом попытаюсь считать значение из ячейки DataBodyrange.Cells(Р,col), то я получу значение уже нижеследующей ячейки...
 
Занесем в ячейки A1:C3 "умную" таблицу с заголовками. Выполняем скрипт:

Код
Sub Test()
  Dim oTab, oRow
  Set oTab = ActiveSheet.ListObjects(1)
  Debug.Print oTab.DataBodyRange.Address
  For Each oRow In oTab.DataBodyRange.Rows
    Debug.Print oRow.Address
  Next oRow
End Sub

Результат:
$A$2:$C$3
$A$2:$C$2
$A$3:$C$3

Всё соответствует ожиданиям.
В конструкции
Range.Cells(row, column)
указывается не абсолютный номер строки или столбца, а номер строки внутри диапазона Range. Поэтому в нашем примере
Код
oTab.DataBodyRange.Cells(2, 1) 

будет указывать на вторую строку диапазона oTab.DataBodyRange, то есть, на ячейку A3.
Изменено: sokol92 - 06.06.2022 13:25:57
Владимир
 
Эта конструкция из #4 работать не будет. Вот Вы удивитесь, если добавите несколько строк перед умной таблицей.

Если хотите перебрать строки умной таблицы, то Ваш код примет вид:
Код
For P=1 to oTab.DataBodyRange.Rows.Count
    Debug.Print DataBodyrange.Cells(Р,col)
Next
Изменено: МатросНаЗебре - 06.06.2022 13:44:01
 
МатросНаЗебре, да, похоже только так и стоит обращаться. For Еach как-то некорректно работает.  
 
Цикл For Each работает корректно. Если Вы хотите, к примеру, прочитать в цикле значение ячейки из второго столбца таблицы, то в примере из #5 замените строку 6 на
Код
Debug.Print oRow.Cells(1, 2).Value
Изменено: sokol92 - 06.06.2022 15:32:50
Владимир
 
sokol92, посмотрите пример
 
Код
Private Sub CommandButton1_Click()
  Dim oRow
  For Each oRow In ActiveSheet.ListObjects(1).DataBodyRange.Rows
    oRow.Cells(2) = oRow.Cells(1)
  Next
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Игорь, спасибо!
Владимир
 
Ігор Гончаренко, понял, спасибо
Страницы: 1
Наверх