ikki, спасибо за объяснеие. Теперь буду сводить операции с ячейками к минимуму. Однако, оптимизации действительно нет предела. :-)
Казанский, спасибо за такой вариант. Открыл для себя функцию Evaluate. Уже использовал, но не для замены цикла.
Господа, может еще подскажете с таким вопросом.
В коде выше используется запись в ячейку пустого множества ("" или Empty). Однако, при дальнейшей работе с этой ячейкой она воспринимается формулой моды, например, как 0, вместо пустой ячейки. Мода пустые ячейки пропускает, а такие нет и выдает результат 0, если таких пустых много. Вопрос, как сделать, чтобы ячейка была действительно пустой?
Как вариант Range.Clear так делает, однако я не знаю как применить Clear к ячейке, записанной в массив, например, как в коде ikki.
Спасибо всем огромное, за такие оперативные советы.
ikki, ваш способ оказался идеальным. Сократил время с 40 (!) мин до 3-4 секунд. Было бы здорово, если б вы вкратце объяснили почему так получилось, а то понимания у меня нет.
Scripter, wowick, в связи с вышесказанным не вижу смысла оптимизировать логическое условие или отключать обновление экрана, это дает не такие впечатляющие результаты.
Я рад, что присоединился к такому замечательному сообществу.
Доброго времени суток! Одним из действий нужного мне макроса есть удаление всех значений цены, которые отличаются от моды более чем на 20%. Цены расположены в произвольном кол-ве столбцов. Один столбец - один продукт. В данном случае 13 столбцов по 2000 строк. Для этого написал такой цикл:
Код
For m = 26 To qcol
For i = 2 To qrow
If Sheets("Лист1").Cells(i, m).Value * 0.8 > Sheets("Лист2").Cells(2, m).Value Or Sheets("Лист1").Cells(i, m).Value * 1.2 < Sheets("Лист2").Cells(2, m).Value Then Sheets("Лист1").Cells(i, m).Value = ""
Next i
Next m
qcol - переменная с номером последнего столбца qrow - переменная с номером последней строки. В ячейках на Лист2 записаны значения моды для этого продукта, разные для каждого столбца.
Цикл рабочий, однако очень долго выполняется. Посоветуйте, пожалуйста, как можно добиться такого же результата, но быстрее. Прошу объяснять как для тупых, т.к. это мой первый макрос и с VBA я пока не сильно знаком. Заранее спасибо.