Тема: оптимизация цикла

Привет! Кто? скажет как оптимизировать цикл For i = 1 To 100 000 Next. ;) Т.е. что я хочу: я имею в руках прайс лист в экселе, в котором до ста тысяч наименований!!! Мой макрос ищет совпадение перебором диапозона моей переменой с ячейкой, которая может находится как в начале листа, так и в его конце....
как разбить диапозон [1; 100000] на кусочки то в начале - то в конце....

Re: оптимизация цикла

может есть возможность напрямую использовать стандартную команду "найти"?

Re: оптимизация цикла

искать вручную по сто значений, которые определеным образом надо упорядочить, рассчитать - сложно, даже вернее долго....

Re: оптимизация цикла

> Dolgy44
Разбей массив значений на 10(100) частей и запусти одновременно 10(100) экземпляров программы поиска.

Re: оптимизация цикла

Application.WorksheetFunction.Match([i]значение[/i],[i]просматриваемый_массив[/i],0)

Re: оптимизация цикла

LeonidSN, я дилетант в языках... Каким образом запустить десяток процедур(функций), как я понимаю параллельно, если vb читает код построчно(последовательно)???????

Re: оптимизация цикла

> Dolgy44
Вы знаете, это все таки полушутливое предложение.
А если серьезно, то есть различие между работой кода написанного на VB и на VBA. Код на VBA работает именно так, как вы сказали - интерпретатор читает и выполняет его построчно.
Код на VB предварительно компилируется и в результате этой процедуры образуется т.н. исполняемый файл с расширением .exe или .dll.
Вот эти файлы-программы никто не мешает запускать одновременно. Правда понятие "одновременная работа" здесь тоже несколько условное, поскольку параллельную работу программ регулирует операционная система, выделяя каждой из них кванты времени работы процессора. Ну это мы уже залезаем в дебри, вы все это прочитаете в книжках.
А для оптимизации процесса обработки больших массивов информации не существует легких решений. Обычно для ускорения этой обработки массив предварительно сортируют. Алгоритмы и коды на VB можно посмотреть, например, в книге Рода Стивенса "VB Готовые алгоритмы". Или поискать эти материалы в Сети, например
http://algolist.manual.ru/sort/index.php.
Успехов!

Re: оптимизация цикла

Для оптимизации может стоит отказаться от цикла и заменить его либо поиском по совету VH, либо найти информацию по работе с Excel  с помощью SQL запросов.
Вот ссылка для начала http://www.sql.ru/forum/actualthread.aspx?tid=623080

Re: оптимизация цикла

> Dolgy44
искать вручную по сто значений, которые определеным образом надо упорядочить, рассчитать — сложно, даже вернее долго....
Не понял, почему Вы завели речь о ручном поиске.
Если задача состоит в том, чтобы для массива наименований, состоящего например из 100 позиций, выбрать соответствующие свойства (или по какому-то свойству выбрать наименования), я бы создал макрос целиком в VBA Excel следующим образом:
- в цикле ПК читает текст в исходном массиве,
- при помощи нижеследующей функции, читает адрес соответствующей ячейки:
Function findTextRowCol(text$, textRow As Long, textCol As Long)
        Range("A1").Select
    'поиск ячейки с указанным текстом
        Cells.Find(What:=text, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
            :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            False, SearchFormat:=False).Activate
    'чтение результата
        textRow = ActiveCell.row
        textCol = ActiveCell.Column
End Function
И далее производится выборка других данных этой строки или этого столбца и записывается либо на другой лист этой же книги, либо в другую книгу, либо в другое приложение...
Если полученные данные необходимо использовать в другом приложении (например, в VBA AutoCAD), там создаете макрос, который читает созданный массив и выполняет расчеты и построения или другие действия.
Внимание: на моем ПК некоторые функции Excel, при обращении к ним из AutoCAD не работают (в частности, Cells.Find). Если же на Вашем эта функция работает из AutoCAD, работа упрощается.

Re: оптимизация цикла

Dolgy44 пишет:

Мой макрос ищет совпадение перебором диапозона моей переменой с ячейкой, которая может находится как в начале листа, так и в его конце....
как разбить диапозон [1; 100000] на кусочки то в начале — то в конце....

Я думаю, что здесь удобно из искомого диапазона ячеек получить строковый массив, и в нем методом полного перебора осуществлять поиск. Это будет самый простой и быстрый способ, если данные в листе Excel заранее не упорядочены.