Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2011, 12:19   #1
Richard123
Пользователь
 
Регистрация: 17.01.2011
Сообщений: 26
По умолчанию Цикл с формулой тормозит

Добрый день!

Решаю следующую задачу:

есть первая колонка с датой (ДД, ММ, ГГГГ, ЧЧ,ММ,СС,), значения которой нужно перевести в вид W xx Y xx (W - просто буква означающую "неделю", xx - номер (вычисляется), Y - год, хх - вычисляется.

Нашел 2 решения:

1. Просто (макрорекодер)

Код:

    With Range("C2")
        .FormulaR1C1 = _
        "=IF(RC[-2]>0,""W""&WEEKNUM(RC[-2],2)&"" Y""&(YEAR(RC[-2])-2000),"""")"
        .Copy
    End With
    Range("B2").End(xlDown).Offset(0, 1).Range("A1").Select
    Range(Selection, Selection.End(xlUp)).Select
    ActiveSheet.Paste
2. Цикл
Код:

                     For RowVar = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1
                        If Cells(RowVar, 1) <> 0 Then Cells(RowVar, 2).FormulaR1C1 = _
                           "=IF(RC[-2]>0,""W""&WEEKNUM(RC[-2],2)&"" Y""&(YEAR(RC[-2])-2000),"""")"

                     Next

Второй вариант предпочтительнее, как с точки зрения логики, так и процесса.

Проблема в том, что я не могу понять почему второй вариант протекает целые минуты (очень долго), когда первый (не смотря на свою топорность) делает это мгновенно?

Подскажите пожалуйста =)

Последний раз редактировалось Richard123; 03.03.2011 в 12:43.
Richard123 вне форума Ответить с цитированием
Старый 03.03.2011, 12:41   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

предполагаю из-за количества прорисовок экрана
поставте перед циклом
Application.ScreenUpdating = False
после
Application.ScreenUpdating = True
это подтвердит или опровергнет мои педположения.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 03.03.2011, 12:52   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
Второй вариант предпочтительнее, как с точки зрения логики, так и процесса.
Предпочтительнее третий вариант)
а выглядеть он будет так:
1) в переменную RA типа RANGE заносим в цикле все ячейки из первого столбца, в которых есть дата
2) в диапазон на 2 столбца правее - RA.offset(,2) - одной строкой кода записывается формула:
RA.offset(,2).FormulaR1C1 = "=IF(RC[-2]>0,""W""&WEEKNUM(RC[-2],2)&"" Y""&(YEAR(RC[-2])-2000),"""")"

PS: Вообще, есть более быстрые и оптимальные варианты решения.
Но, не увидев вашего файла, сложно что-либо посоветовать
EducatedFool вне форума Ответить с цитированием
Старый 03.03.2011, 15:54   #4
Richard123
Пользователь
 
Регистрация: 17.01.2011
Сообщений: 26
По умолчанию

Файл этой задачи там очень простой:
Есть 1 столбец ("A:A") в котором есть даты.

Выглядит он так:
Код:
Дата
27.09.2010 10:07:49
27.09.2010 10:15:45
27.09.2010 11:12:36
27.09.2010 11:16:45
27.09.2010 11:17:49
27.09.2010 11:44:22
10.10.2010 11:56:42
10.10.2010 11:58:53
10.10.2010 11:59:09
10.10.2010 11:59:59
10.10.2010 12:00:24
10.10.2010 12:06:45
Только строк порядка 50 000...


Можете показать как должен выглядеть код?
Richard123 вне форума Ответить с цитированием
Старый 03.03.2011, 16:10   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

А мы сейчас должны гадать, в каком формате даты находятся в ячейке - вдруг они так как текст сохранены?

Есть ли среди дат пустые ячейки?

Я же написал:
Цитата:
Но, не увидев вашего файла, сложно что-либо посоветовать
Неужто сложно выложить пример на 100-200 строк?
EducatedFool вне форума Ответить с цитированием
Старый 03.03.2011, 16:18   #6
Richard123
Пользователь
 
Регистрация: 17.01.2011
Сообщений: 26
По умолчанию

Извиняюсь, вот файл.
Вложения
Тип файла: rar Книга1.rar (6.1 Кб, 9 просмотров)
Richard123 вне форума Ответить с цитированием
Старый 03.03.2011, 16:27   #7
MCH
Форумчанин
 
Регистрация: 21.11.2010
Сообщений: 326
По умолчанию

может так подойдет (одной строчкой):
Код:
    Range(Cells(2, 3), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 3)).FormulaR1C1 = _
        "=IF(RC[-2]>0,""W""&WEEKNUM(RC[-2],2)&"" Y""&YEAR(RC[-2])-2000,"""")"
Вложения
Тип файла: rar week.rar (7.7 Кб, 13 просмотров)
MCH вне форума Ответить с цитированием
Старый 04.03.2011, 09:53   #8
Richard123
Пользователь
 
Регистрация: 17.01.2011
Сообщений: 26
По умолчанию

Спасибо всем большое!

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

Уважаемый MCH, не могли бы оказать такую любезность как описать работу кода. Я понимаю что скорее всего вопрос может быть глупым, но в голове пока ещё не сложилось четкое понимание "составного" диапазона ( когда Range состоит из Cells с Row.Count).
Richard123 вне форума Ответить с цитированием
Старый 04.03.2011, 11:19   #9
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Range Вы можете описать как (НачальнаяЯчейка, [КонечнаяЯчейка]), где начальная и конечная ячейки любые синтаксически корректные ссылки на ячейки. если конечная ячейка пропущена значит указан диапазон состоящий из одной ячейки.
в качестве первого параметра еще может выступать строка, описывающая диапазон, например "А3" ячейка А3, "С2:Е100" диапазон, "1:10" 10 первых строк.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 04.03.2011, 16:53   #10
Richard123
Пользователь
 
Регистрация: 17.01.2011
Сообщений: 26
По умолчанию

Благодарю Вас, за разъяснения. Теперь стало более понятно.
Richard123 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл по времени - Как сделать так чтобы цикл выполнялся к примеру 10 секунд ? Anarki Общие вопросы C/C++ 3 13.11.2009 19:23
Компутер тормозит :( Utkin Компьютерное железо 9 24.10.2009 13:54
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34