The okk
Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору griin Код: Конкатенация (&) - довольно тормознутая операция. Лучше вместо этого пиши: Код:. Эффект будет тот же (обращение к k-й строке 1-го столбца), но работать будет быстрее. Код: "=ДАТА(ГОД(Y" & k & "), МЕСЯЦ(Y" & k & "), ДЕНЬ(A8))" | Эта запись мне тоже не нравится. Я так понял, тут есть цикл со счетчиком k, поэтому четыре конкатенации в данном случае - явный перебор. Есть же замечательный стиль ссылок R1C1 (альтернатива А1). Его и надо использовать. Тогда получится: Код: "=ДАТА(ГОД(RC25); МЕСЯЦ(RC25); ДЕНЬ(R8C1))" | RC25 расшифровывается, как: ячейка в том же ряду, в 25-м по счету столбце (Y). Стиль ссылок R1C1 на самом деле довольно прост: R (Row, Ряд/Строка). Число после этой буквы соответствует номеру строки (абсолютная ссылка). Например, R1 - ссылка на первую строку. Если число после R стоит в квадратных скобках ([ ]), это смещение по строкам относительно текущей ячейки (относительная ссылка). Например, R[-1] - ссылка на строку, стоящую над текущей ячейкой. C (Column, Столбец/Колонка) Действуют те же правила, что и для R. - Ну и, соответственно, исправляем левую часть:
Вместо Код: ставим Код: - В итоге имеем:
Код: Cells(k,1).FormulaR1C1Local="=ДАТА(ГОД(RC25); МЕСЯЦ(RC25); ДЕНЬ(R8C1))" | - Теперь доводим до ума сам код - избавимся от цикла.
Код: меняем на: Код: Range(Cells(k1,1),Cells(k2,1)) | , где k1 - это начальное значение счетчика k, указанное в твоем цикле; k2 - соответственно, конечное значение счетчика. Сама запись Range(Cells(k1,1),Cells(k2,1)) возвращает диапазон ячеек от ячейки Cells(k1,1) до Cells(k2,1). В итоге весь цикл записывается в одно действие: Код: Range(Cells(k1,1),Cells(k2,1)).FormulaR1C1Local="=ДАТА(ГОД(RC25); МЕСЯЦ(RC25); ДЕНЬ(R8C1))" | Что в переводе на нормальный язык значит: Всем ячейкам в первом столбце в диапазоне от k1-й строки до k2-й присвоить формулу. - Если будут тормоза, можно ускорить выполнение кода, отключив обновление экрана и калькуляцию формул на время заполнения диапазона формулами.:
Код: '...в приложении With Application '...отключаем обновление экрана .ScreenUpdating = False '...и устанавливаем пересчет формул вручную .Calculation = xlCalculationManual End With 'заполняем диапазон формулами Range(Cells(k1,1),Cells(k2,1)).FormulaR1C1Local="=ДАТА(ГОД(RC25); МЕСЯЦ(RC25); ДЕНЬ(R8C1))" 'в приложении... With Application '...включаем обновление экрана... .ScreenUpdating = True '...и устанавливаем автоматический пересчет формул .Calculation = xlCalculationAutomatic End With | И не забывай, что если пишешь формулу на русском, то ставится не , а ;. Добавлено: Anton T Цитирую оттуда: Цитата: данная программа «просматривает» построчно все записи на рабочем листе Excel. Для тех строк, для которых заданное условие поиска не соблюдено, изменяется высота строки, которая задается равной нулю. В результате на экране остаются только те строки, которые удовлетворяют заданному критерию. Таким «оригинальным» путем, фактически без установки фильтра, пользователь получает возможность видеть на экране только те строки, которые он ищет. | Честно говоря, меня выделенный фрагмент описания немного шокировал. Либо я неправильно понял, либо... Из написанного я делаю вывод, что это проход в цикле по строкам (а во внутреннем цикле еще и по столбцам?!), да не просто проход, а с самописным(!) текстовым поиском и присваиванием значений числовым свойствам (вместо элементарного изменения логического свойства видимости на False). Я, конечно, проверю, что занимает меньше времени - скрыть строку или приравнять значение её высоты к нулю, но, честно говоря, сомневаюсь, что результат будет в пользу второго варианта. Кроме того, при таком подходе скрытые ячейки все еще остаются видимыми со всеми вытекающими последствиями. | Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 09:50 08-02-2007 | Исправлено: The okk, 13:17 08-02-2007 |
|