Страницы: 1
RSS
Как получить список строк(записей) таблицы по критерию используя VBA?
 
Как получить список строк(записей) таблицы по критерию  используя VBA?
Мне необходимо:
 п.1. получить все строки у которых поле "Выбор" = "Да";
 п.2. выполнить "For Each ... Next …" для всех выбранных записей(строк) в п.1 с получением данных из всех столбцов.
 
Доброе время суток.
Вариант.
Код
Public Sub ScanRowWithYes()
    Dim pLo As ListObject, selectData As Variant
    Dim rowCollection As New Collection
    Dim i As Long, nextRow As ListRow
    Set pLo = ActiveSheet.ListObjects(1)
    selectData = pLo.ListColumns("Выбор").DataBodyRange.Value
    For i = 1 To UBound(selectData)
        If selectData(i, 1) = "Да" Then rowCollection.Add pLo.ListRows(i)
    Next
    For Each nextRow In rowCollection
        selectData = nextRow.Range.Value
        Debug.Print selectData(1, 1) & "; " & selectData(1, 2) & "; " & selectData(1, 3) & "; " & selectData(1, 4)
    Next
End Sub

P. S. Только не совсем понятно - зачем был выбран столь непроизводительный вариант двойного обхода (даже с учётом фильтрации).
Изменено: Андрей VG - 05.08.2020 21:44:15
 
Чуть производительнее собирать в коллекцию только номера строк исходного массива, он ведь ещё живой.
И затем перебирая for each эти номера можно брать данные сразу из исходного объекта.
 
А запрос производительнее не будет?
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
А запрос производительнее не будет?
Тестировать надо. Так не скажу, что быстрее. По идее, нужно же получить время загрузки, фильтрации и вывода на лист, а тогда зачем коллекция - двух массивов будет достаточно. Если просто получить номера строк, где Да, то опять же коллекция ListRow ни к чему. Бестолковая, в смысле навязываемого подхода, задача.
 
Доброе утро!
Вот ЗДЕСЬ только вчера всплыла тема аж от 2012 года "Универсальная функция Сцепить, Быстрая UDF для сцепки любых данных по 3 критериям"  
Попробовал, функция ZVI отлично справляется с этой задачей
Изменено: msi2102 - 06.08.2020 07:35:27
 
Цитата
Андрей VG написал:
P. S. Только не совсем понятно - зачем был выбран столь непроизводительный вариант двойного обхода (даже с учётом фильтрации).
Как на ваш взгляд эффективнее?
Цель:
 - пользователь устанавливает в поле "Выбор" = "Да";
 - код перебирает записи(строки) в которых поле "Выбор" = "Да";
 -  - код получает значение из любого столбца перебираемых записей(строк).

Переделал так.
Код
Public Sub ScanRowWithYes()
    Dim tbl As ListObject
    Dim row As ListRow
    Dim result As Variant
    
    Set tbl = ActiveSheet.ListObjects("Таблица1")
    
        For Each row In tbl.ListRows
              result = row.Range.Value2
              If (result(1, 1) = "Да") Then
                Debug.Print result(1, 1) & " ; " & result(1, 2) & " ; " & result(1, 3) & " ; " & result(1, 4)
              End If
        Next
    End Sub

Пойдёт?
Страницы: 1
Наверх