powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Варианты перебора строк
16 сообщений из 16, страница 1 из 1
Варианты перебора строк
    #39381254
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Макрос обращается к таблице как ListObject на листе. Делает перебор по строкам для определенной колонки. Учитывая, что таблица (левая верхняя ячейка) может размещаться не обязательно в первой строке и в первом столбце. Во вложенном файле представил два варианта перебора.

Какой вариант перебора наиболее оптимальный? Есть что не учел?
...
Рейтинг: 0 / 0
Варианты перебора строк
    #39381272
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ferzmikk, первый вариант лучше. Переменная ИндексКолонкаМесяц для этой цели не нужна, к столбцу можно обращаться по имени (собственно, Вы это и делаете для получения значения переменной)
Код: vbnet
1.
2.
3.
4.
5.
'Первый вариант
Dim Строка As Range
For Each Строка In Таблица.ListColumns("Месяц").DataBodyRange.Rows
   'Строка.Value
Next Строка

Кстати, зачем Вы делаете перебор ячеек ? Если нужны значения ячеек, лучше делать перебор массива значений этого столбца, например:
Код: vbnet
1.
2.
3.
4.
5.
6.
Dim x
For Each x In Таблица.ListColumns("Месяц").DataBodyRange.Value
  If Not IsDate(x) Then
    'действия по коррекции даты
  End If
Next
...
Рейтинг: 0 / 0
Варианты перебора строк
    #39381278
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне больше нравится первый вариант. Только не понимаю, зачем нужна отдельная переменная под индекс колонки - какое-то масло масляное получается, можно же к колонке обращаться непосредственно по её имени. Ну и итерацию лучше бы по .Cells вести, наверное, а не по .Rows.
...
Рейтинг: 0 / 0
Варианты перебора строк
    #39381374
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если мне нужно сделать перебор строк не в одной колонке, а несколько. Как тут быть? С помощью следующих свойств?
Код: vbnet
1.
2.
Таблица.ListRows
Таблица.Range


Для данного случая оптимально подойдет второй вариант (из вложенного)?
...
Рейтинг: 0 / 0
Варианты перебора строк
    #39381413
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkА если мне нужно сделать перебор строк не в одной колонке, а несколько. Как тут быть?
Тогда делаешь итерацию по
Код: vbnet
1.
For Each Строка In Таблица.DataBodyRange.Rows

и Строка.Value2 у тебя будет Array(1,N).
...
Рейтинг: 0 / 0
Варианты перебора строк
    #39381438
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaferzmikkА если мне нужно сделать перебор строк не в одной колонке, а несколько. Как тут быть?
Тогда делаешь итерацию по
Код: vbnet
1.
For Each Строка In Таблица.DataBodyRange.Rows

и Строка.Value2 у тебя будет Array(1,N).
В общем получается так
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Set ТекущийЛист = ThisWorkbook.Sheets("Таблица")

Dim Таблица As ListObject
Set Таблица = ТекущийЛист.ListObjects(1)

Dim Строка As Range
For Each Строка In Таблица.DataBodyRange.Rows
    if Not IsDate (Строка.Value2(1, Таблица.ListColumns("Месяц").Index) Then 
    '...
    End if   
Next Строка
...
Рейтинг: 0 / 0
Варианты перебора строк
    #39381460
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверно зту запись
Код: vbnet
1.
2.
3.
4.
5.
For Each Строка In Таблица.DataBodyRange.Rows
    if Not IsDate (Строка.Value2(1, Таблица.ListColumns("Месяц").Index) Then 
    '...
    End if   
Next Строка

было бы правильнее написать следующим образом
Код: vbnet
1.
2.
3.
4.
5.
6.
ИндексКолонкаМесяц =  Таблица.ListColumns("Месяц").Index
For Each Строка In Таблица.DataBodyRange.Rows
    if Not IsDate (Строка.Value2(1,ИндексКолонкаМесяц) Then 
    '...
    End if   
Next Строка

Чтобы каждый раз в цикле не приходилось определять индекс, а затолкать в переменную. Учитывая, что в таблице 50 000 строк.
...
Рейтинг: 0 / 0
Варианты перебора строк
    #39381498
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как присвоить значение в соответсвующей строке и колонке таблицы?
Код: vbnet
1.
2.
3.
For Each Строка In Таблица.DataBodyRange.Rows
     'Строка
Next Строка
...
Рейтинг: 0 / 0
Варианты перебора строк
    #39381547
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
For Each Строка In Таблица.DataBodyRange.Rows
     If Строка.Cells(1, 1) = "Задача5" Then
          Строка.Cells(1, 2) = Строка.Cells(1, 2) + 10
     End If
Next Строка
...
Рейтинг: 0 / 0
Варианты перебора строк
    #39381548
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И научитесь уже подглядывать в Locals Window...
...
Рейтинг: 0 / 0
Варианты перебора строк
    #39381651
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!
...
Рейтинг: 0 / 0
Варианты перебора строк
    #39383160
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот еще. В окне Watches пытаюсь в объекте Строка найти свойство, которое отображает номер строки в таблице, а не номер расположения строки на листе. По скриншоту видно, что нужно возвратить 1. Есть подобное свойство? Или DataBodyRange не позволяет это и нужно обходить: ставить счетчик при переборе строк?
...
Рейтинг: 0 / 0
Варианты перебора строк
    #39383191
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выделив строку как самостоятельный объект, Вы потеряли её связь с таблицей. Строка не знает, где она расположена В ТАБЛИЦЕ. Она вообще не знает, что есть какая-то там таблица. Посмотрите ради любопытства (и не в Watches, а там, где я указал), кто для объекта Строка является Parent...

Так что если необходим номер строки именно в таблице - делайте не For Each итерацию, а
Код: vbnet
1.
For i = 0 To Таблица.DataBodyRange.Rows.Count - 1
...
Рейтинг: 0 / 0
Варианты перебора строк
    #39383271
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

Спасибо! Понял
...
Рейтинг: 0 / 0
Варианты перебора строк
    #39383939
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaПосмотрите ради любопытства (и не в Watches, а там, где я указал), кто для объекта Строка является Parent...
Лист1
...
Рейтинг: 0 / 0
Варианты перебора строк
    #39383959
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот и я о чём...
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Варианты перебора строк
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]