Отключение обновления экрана

Автор sofi, 13 сентября 2014, 06:08

0 Пользователи и 1 гость просматривают эту тему.

sofi

Set c = c(2)
Означает сдвиг на одну ячейку вниз в том же столбце,
относительно заданной ранее в переменной - "с".

Можно написать иначе:
Set c = c.Offset(1, 0)
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

Hasim

#16
Ничего не дергается, особенно, если очистку поставить после отключения обновления экрана:
Application.ScreenUpdating = False ' отключаем обновление экрана
Range(Cells(7, 1), Cells(Rows.Count, 8)).Clear ' очистка



Цитата: sofi от 14 сентября 2014, 22:18
Можно написать иначе:
Set c = c.Offset(1, 0)
Нужно.

sofi

#17
ЦитироватьНужно.
А почему нужно?
Для улучшения читабельности кода?

Так, все-таки, уважаемые спецы, как теоритически,
в "кальке", реализуется "борьба с дерганием" или отключение обновления экрана, на
примере приведенного мною файла?
Или это невозможно в принципе?  
Мне, на будущее, интересно!
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

JohnSUN

В принципе - возможно. И даже реализуемо. Достаточно использовать многократно описанный метод доступа к данным листа.
Суть метода заключается в том, что время обращения к отдельной ячейке листа почти такое же, как обращение к данным целого диапазона ячеек.
Поэтому принято все необходимые вычисления проводить в памяти, формировать результат в виде структуры "массив массивов" и одним оператором setDataArray вписывать в нужное место листа. Лист при этом тоже мигнёт, но сделает это один раз и почти незаметно.
В данном конкретном случае достаточно расшифровать смысл строк
c.Offset(, 2).FormulaR1C1 = "=ROUND(RC[1]/day(date(year(RC[-2]);month(RC[-2])+1;1)-1);2)"
c.Offset(, 2).Value = c.Offset(, 2).Value

в виде
"Разделить значение из ячеек колонки D на количество дней в месяце и вставить результат в ячейку C" (кстати, формула стала бы намного короче с функцией DAYSINMONTH)
После такой расшифровки задача становится простой и понятной, код на бэйсике пишется и отлаживается в течении 10-15 минут... и экран перестаёт мигать
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

sofi

Спасибо за "наколку" с
ЦитироватьDAYSINMONTH
, просто этой функции нет в Excel.
Будем знать и применять!

Что касается, обработки в массиве.
Все верно, давно хотел все "запихнуть в массив" для обработки, но необходимости не было.
Работала себе и работало. Но это в Excel!

А в "кальке" это неподъемная задача, для меня,
я скорее "лопну и всех забрызгаю"! ???
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

rami

Цитата: Hasim от 14 сентября 2014, 21:45Нужно
Обязательно нужно! Это нужно не вам, а всем. Когда макрос доходит до этой переменной, он ищет её по всем модулям, у вас он её где-то находит, а у нас её нигде нет, поэтому пишет "переменная не определена"
Цитата: sofi от 15 сентября 2014, 13:35Так, все-таки, уважаемые спецы, как теоритически,
в "кальке", реализуется "борьба с дерганием" или отключение обновления экрана, на примере приведенного мною файла?
"Борьба с дерганием" в данном случае(вы не поверите) заключается не в отключении экрана, а в полном переписывании макросов. Мне кажется, что эти макросы писали диверсанты :o Например макрос "Function CountDaysMonth(date_start As Date, date_end As Date, month_val As Date)" пробегает количество циклов равное количеству месяцев умноженное на количество дней между датами(это примерно десять тысяч циклов). Если написать нормальный макрос, то и экран отключать не нужно будет.

sofi

#21
Rami, да, как же не определена переменная, если код с нее начинается:
Цитировать
Dim c As Range
Set c = Sheets(3).Range("a39") 'начальная ячейка для заполнения месяцев

У меня вообще неопределенных переменных не бывает, поскольку везде
автоматически ставится Option Explicit!

в
ЦитироватьSet c = c(2) или Set c = c.Offset(1, 0)
она просто переопределяется!

Насчет CountDaysMonth, чтобы Вы предложили?
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

rami

Цитата: sofi от 15 сентября 2014, 14:43Rami, да, как же не определена переменная, если код с нее начинается:
Calc зря ругаться не будет.
Цитата: sofi от 15 сентября 2014, 14:43Насчет CountDaysMonth, чтобы Вы предложили?
Выкинуть и забыть как страшный сон. Я без него сделал и без отключения экрана, правда ещё не закончил.

sofi

Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

JohnSUN

Цитата: rami от 15 сентября 2014, 15:54
Выкинуть и забыть как страшный сон.
Или сохранить и поместить в музей с табличкой "Так делать нельзя!"... За одну только строчку
If CountDaysMonth = 0 Then CountDaysMonth = 0
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Hasim

Цитата: sofi от 15 сентября 2014, 14:43в
Цитата:
Set c = c(2) или Set c = c.Offset(1, 0)
она просто переопределяется!
Вы слишком много читали про С++.
Ничего здесь не переопределяется.

Здесь ошибки Бейсика:
1. с(2) - элемент МАССИВА с номером 2, который нигде не определен
2. совпадение имени ПЕРЕМЕННОЙ с и имени МАССИВА с()

sofi

#26
Hasim, я не знаю, что по этому поводу написано в С++,
но в VBA это означает, присвоение объектной переменной "с" адреса ячейки,
расположенной ниже на одну ячейку в том же столбце,
относительно последнего адреса записанного в переменную "с".

Вставьте, временно, выше Set c = c(2) или Set c = c.Offset(1, 0)
c(2).Select
и проверьте через F8 в VBA.

P.S.
А вообще, мне очень импонирует, отношение к теме Rami:
ЦитироватьЯ без него сделал и без отключения экрана, правда ещё не закончил.
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

Hasim

Цитата: sofi от 15 сентября 2014, 20:11Вставьте, временно, выше Set c = c(2) или Set c = c.Offset(1, 0)
c(2).Select
и проверьте через F8 в VBA.
Мы не про VBA говорим, а про Калковский Бейсик.
А в нем этот фокус не проходит.

kompilainenn

а вот давайте прекратим срач, а? чо бы вам не вернуться в конструктивное русло?
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

Helen

Абсолютно согласна с Вами, kompilainenn.
Пару сообщений потёрла, чтобы у участников пропало желание продолжать обмениваться колкостями.