Оптимизация кода
Доброго дня всем. Скажите, пожалуйста, как можно этот код оптимизировать?
Код:
Do While Cells(i, Ncolumn2).Value <> Empty 'поставил на "Обозначение" т.к. обрывался на пустой ячейке |
1. « = True» можно убрать.
2. Вместо кучи вызовов «Cells(i, ncolumn).Value» завести строковую переменную, куда один раз запрашивать данное значение. 3. Вместо кучи вызовов «Cells(i, ncolumn + 1)» завести объектную переменную, которую и использовать далее в коде. То есть, как-то так: Скрытый текст
Код:
Option Explicit По остальному — надо видеть алгоритм. |
Iska, добрый день) интересует не скорость работы, а запись, что б удобно было править, визуально было понятно. С этой горкой не удобно работать.
|
blackeangel,
Как вариант, можно завести отдельную процедуру Sub ProcessRow(i, ncolumn, ncolumn2, ...) с номерами строки и столбцов в качестве параметров. В цикле останется Код:
Do While Cells(i, Ncolumn2).Value <> Empty Код:
Sub ProcessRow(i, ncolumn, ncolumn2, ...) ЗЫ Оптимизации в сообщении Iska - это не только оптимизация по скорости, но и минимизация ошибок из-за опечаток + более легко читаемый код (особенно если переменным присвоить более соответствующие роли имена). |
iglezz, да, с Exit Sub — хороший вариант. Будет чуть помедленнее, зато нагляднее.
blackeangel, тут ещё такое дело… Где-то Вы пользуете регулярки посредством RegExp, где-то пользуете оператор Like… С этим действительно тяжело работать. Желательно стараться использовать какой-то единый подход. |
Iska, всё сначало было на like, но не давало нужного результата, поэтому было принято решение добавить там где необходимо regexp. Конечно, можно отказаться от like и использовать regexp, но кода от этого увеличится только.
iglezz, вот да, выход из while нужно, и очевидно пропущен. Код:
Do While Cells(i, Ncolumn2).Value <> Empty |
blackeangel, а) с goto лучше вообще не связываться, б) если будет goto — никаких вложенных else уже не нужно.
|
Iska, не будет это да. Но почему лучше не связываться?
|
Цитата:
В данном случае goto не имеет смысла в виду вложенности if, которую было бы правильнее переписать в "стековую" процедуру: ни if, ни goto были бы ненужны, а скорость работы и наглядность возросли в разы. |
greg zakharov, например?
|
Например, выделяем паттерн проверки ячейки в отдельную процедуру, рядом создаём пул шаблонов проверки, а также шаблон стека; далее - цикл в пять-семь строк кода. И всё.
|
greg zakharov, :o :wacko:
|
blackeangel, просто внимательней посмотрите на код: в операторе ветвления повторяются RegExp.Test и Cells(...).Value Like, значит выносим их "за скобки", то есть создаем процедуру проверки шаблона. Что здесь сложного? А далее, как было сказано ранее. В итоге у вас должно получиться нечто вроде (псевдокод):
Код:
Do While Cells(...).Value |
Время: 01:27. |
Время: 01:27.
© OSzone.net 2001-