Страницы: 1
RSS
Как по очереди обратиться к ячейкам диапазона
 
Всем ку
Код
Sub main()
    
    Dim data_table As Variant
    Dim item As Variant
    
    data_table = Range("name_table").Columns(2)

    For Each item In data_table
        If item <> Empty Then
            Debug.Print item
        End If
    Next item

End Sub

В этом варианте получается что item это string. Ни узнать адрес, ни смещение не работает

Код
Sub main()
    
    Dim data_table As Range
    Dim item As Variant

    
    Set data_table = Range("name_table").Columns(2)
    
    For Each item In ThisWorkbook.Worksheets("Лист11").Range(data_table.Address)
        If item <> Empty Then
            Debug.Print item
        End If
    Next item

End Sub

Как сделать вариант выше, только читабельней? К тому же, может есть вариант сделать перебор быстрее, позиций больше 20к?
 
название темы:
как по очереди обратиться  к ячейкам диапазона

ответ:
Код
Sub main()
  Dim rg As Range
  For Each rg In Range("name_table").Columns(2).Cells
    If Not IsEmpty(rg) Then
      Debug.Print rg & "  r=" & rg.Row & "  c=" & rg.Column
    End If
  Next
End Sub

решение очень сильно зависит от задачи, которую вы решаете
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
так можно.
Код
   Dim data_table As Variant
    Dim item As Variant
    data_table = Range("name_table").Columns(1)
    With Range("name_table").Columns(1)
        Row = .Cells(1, 1).Row
        Col = .Cells(1, 1).Column
    End With

    For Each item In data_table
        If item <> Empty Then
            Debug.Print item, Row, Col
        End If
        Row = Row + 1
    Next item
 
Переведите в умную таблицу, её в массив и его уже перебирайте.
 
Sniaper, вместо For Each - 2 цикла - по столбцам и строкам каждой области диапазона
Запоминаем номер строки и столбца первой ячейки каждой области, в цикле, когда нашли нужное, вычислили номера строку/столбец как смещение от первой

vikttur, Как в цикле по элементам массива из диапазона узнать адрес любой ячейки исходного диапазона

UPD
Sniaper,Что-то похожее на мой вариант показал doober
У Ігор Гончаренко поячеечный перебор, от которого вы (как я понял) ушли из-за медлительности

Цитата
Иван Манченко: Переведите в умную таблицу, её в массив и его уже перебирайте
ваш совет вообще непонятно что (простите)
Изменено: Jack Famous - 16.02.2022 16:51:35
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Хочется массив -
Код
Sub main()
    Dim data_table As Variant
    Dim item As Variant
  
    data_table = Range("name_table").Columns(2)
    Set Cell = Range("name_table").Columns(2).Cells(1)
    i = 0
    For Each item In data_table
        If item <> Empty Then
            Debug.Print item, Cell.Offset(i).Address
        End If
    i = i + 1
    Next item
End Sub


Даже если массив двумерный, то от первой ячейки из порядкового номера и исходя из размерности массива рассчитать индекс ячейки не проблема.
По вопросам из тем форума, личку не читаю.
 
господа, возможно мое название темы так же далеко от реального, как все предложенные варианты от того, что нужен автору
может услышим от него хоть что-то в ответ
а то название поменялось, он может тему свою вообще не узнать и не найти))
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
БМВ: рассчитать индекс ячейки
только надо помнить, что порядок For Each разный для диапазона и массива
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Ігор Гончаренко, doober, Jack Famous, БМВ, Большое спасибо за ответ. Подходят все варианты.

пс Сегодня сделал выгрузку из БД, массив стал больше 1,5 раза... Придется видимо отказываться от For Each, Exel просто виснет минут на 5-7
Изменено: Sniaper - 17.02.2022 10:04:32
 
Цитата
Sniaper: Придется видимо отказываться от For Each
For Each это тип цикла, а отказаться вам придёться от перебора ЯЧЕЕК [как элементов диапазона] в пользу перебора ЗНАЧЕНИЙ из диапазона [как элементов двумерного массива, полученного из этого диапазона]
    Тип цикла при этом не скажется как-то на скорости, но For Next в данном случае [нужно определять положение элемента в исходном диапазоне] будет гораздо удобнее

Тема про "как обратиться" — и вам показали. Теперь создавайте новую и выкладывайте, что нужно НА САМОМ ДЕЛЕ  :)
Изменено: Jack Famous - 17.02.2022 10:14:12
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх