Страницы: 1
RSS
VBA Перебор массива с поиском разных значений и выводом в переменную - как эффективнее ?
 
Добрый день,

Имеется таблица с данными по товарам, людям, поставщикам и пр. Некоторые столбцы заполняю данными используя процедуры, написанные на VBA
Но реалии таковы, что иногра в существующую таблицу приходится добавлять новые столбцы.

Посетила мысль, что, если в макросах ссылаться на номера столбцов не прямо (1, 2, 3 и т.д.), а предварительно проводя поиск номера нужного столбца по его названию, то это позволит свободно вставлять столбцы в таблицу и не беспокоиться о том, что в ранее написанном макросе надо изменить в диапазоне столбец 3 на 4, т.к. перед ним вставили еще один.
Для того, чтобы пробежаться по всем столбцам в шапке таблицы (это у меня строка 1) использовался ранее метод .Find и все работало до тех пор, пока не возникла необходимость провести поиск, когда некоторые столбцы скрыты. И оказалось, что Find не работает.

Пробуду перейти на поиск через массив (ниже пример кода с комментарием, что делаю).

Вопрос следующий: мне кажется, я делаю этот поиск в массиве неэффективно. (через множество if).
Наверняка можно оптимизировать мой поиск. Если есть предложения, помогите, пожалуйста.
Код
' определяем массив
    MyArr = Range("A1", Cells.SpecialCells(11)).Value

' происк провожу по 1 строке по всем столбцам (это шапка таблицы с заголовками)
 For lc = 1 To UBound(avArr, 2)
        
'через условие в массиве ищу ячейку, где встречается нужное значение и передаю в переменную номер найденного столбца 
            If MyArr(lr, lc) = "Страна происхождения" Then
' передаю в переменную iCOO номер столбца, где в заголовке "страна происхождения" 
             iCOO = Cells(lr, lc).Column
            End If
            If MyArr(lr, lc) = "Наименование" Then
' передаю в переменную iDescr номер столбца, где в заголовке "Наименование" 
            iDescr = Cells(lr, lc).Column
            End If
            If MyArr(lr, lc) = "Название завода" Then
' передаю в переменную iFactory номер столбца, где в заголовке "Название завода" 
            iFactory = Cells(lr, lc).Column
            End If
  Next lc
 
Код
Select Case MyArr(lr, lc) 
Case "страна происхождения" 
      '..............
Case  "Наименование"
      '..............
'..............
End Select
 
Цитата
all L написал:
Наверняка можно оптимизировать мой поиск.
Наверняка можно. Но не видя примера файла - ни каких предложений.
 
vikttur,Спасио. Попробую с select case.

Прилагаю пример с текущим кодом. Возможно, появятся у кого-нибудь еще предложения по оптимизации
 
all L, но это же только часть какой-то задачи, какова конечная цель? есть мнение, что PQ будет шустрее
Соблюдение правил форума не освобождает от модераторского произвола
 
Ещё как вариант - сперва не глядя собрать всё в коллекцию, затем если нужно то можно из неё брать номер столбца в переменную.
Но если будут повторы или чего-то не будет - то нужно включать обработку ошибок!
Код
Dim col As New Collection
    
' происк провожу по 1 строке по всем столбцам (это шапка таблицы с заголовками)
    lr = 1
    For lc = 1 To UBound(MyArr, 2)
        col.Add lc, MyArr(lr, lc)
    Next

    iDescr = col("Наименование")
    iCOO = col("Страна происхождения")
    iFactory = col("Название завода")
Изменено: Hugo - 02.05.2020 17:29:00
 
Hugo,интересно. Спасибо. Наверное, этого и хотелось: перебрать 1 раз и выбирать нужное. Обработка ошибок на повтор или отсутствие будет.

Спасибо!
Страницы: 1
Наверх