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

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

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

sofi

Всем доброго время дня и веселых выходных!
Уважаемые форумчане, как известно, для того, чтобы экран не моргал
и при выполнении макроса побыстрее все шевелилось, надо отключать обновление экрана!
В VBA это делается, просто и бесхитростно, через:

Application.ScreenUpdating = True/False  'включаем/выключаем обновление экрана

На официальном сайте нарыл в Help, что, якобы, это в OOCalc звучит, как:

 'Выключение экрана  
 Dim myDoc As Object
 myDoc = ThisComponent
 myDoc.lockControllers()
 myDoc.addActionLock()

 'Включение экрана
 myDoc = ThisComponent
 myDoc.removeActionLock()
 myDoc.unlockControllers()

Однако, эффект, мягко говоря, не тот!
Дергается все равно, хотя и не так сильно, как без этого кода.
Может кто-нибудь знает, как сделать все красиво?! :roll:
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

rami

Цитата: sofi от 13 сентября 2014, 05:08Дергается все равно, хотя и не так сильно, как без этого кода.
lockControllers() — Предотвращает некоторые обновления отображения, но не все, например, выбор ячейки(select) или перемещение выделения(с помощью диспетчера) отображаются на экране.
addActionLock() — Временно блокирует документ от взаимодействия с пользователем и автоматического обновления ячеек. Блокировка объекта позволяет предотвратить внутренние обновления объекта, в то время как Вы быстро изменяете несколько частей объектов, которые могли бы временно сделать недействительными друг друга.
Цитата: sofi от 13 сентября 2014, 05:08Может кто-нибудь знает, как сделать все красиво?! :roll:
Можно скрыть лист с расчётами. Вообще нужно смотреть что "дёргается" и действовать соответственно.

sofi

Самое главное "дергание", от которого
хотелось бы избавиться, это при формировании
довольно большой таблицы циклом Do While!
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

Hasim

Цитата: sofi от 14 сентября 2014, 11:27при формировании
довольно большой таблицы циклом Do While
А код какой?

sofi

В кратце, так:

Set c = Sheets(3).Range("a39") 'начальная ячейка для заполнения месяцев

'заполнение Таблицы
Do While DateSerial(Year(d), Month(d), 1) <= d1

   c = d
 
   'форматы и ФОРМУЛЫ столбцов ОПЛАТА и ДОЛГ
   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 = DateAdd("m", 1, d) 'заполнение месяцев, интервалы заполнения "m" месяц, "d" день, "yyyy" год
   Set c = c(2)
   If Month(d) = 1 Then
     If Not d > d1 Then
        Set c = c(2)
     End If
   End If

   If Month(d) = 1 Then ' заполнение лет
     If Not d > d1 Then
        Set c = c(2)
     End If
   End If

Loop

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

Hasim

Это код на VBA для Excel. Зачем он нам нужен?

У вас плохо работает код для Calc.
Его покажите, чтобы можно было бы просто вставить и посмотреть, что там не так.

И лучше не вкратце, а подробно.

sofi

#6
Изначально программа была написана на VBA,
я ее адаптирую под OOCalc, т.к. все переписывать
нет не сил не желания!
Соответственно втыкаем в модули:
"Option VBASupport 1"
и где не работает, там адаптируем или переписываем!
В рассматриваемом случае, код работает, без ошибок,
единственно "дергается"!
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

Hasim

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

sofi

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

Hasim

У вас нет того же на калковском бейсике?
Вы хотите, чтобы кто-то переписал  VBA на него и проверил, а дергается ли на чистом калке?
Тогда выложите весь файл с кодом.
Может быть, кто-то и перепишет и проверит на чистом калковском бейсике.
Тогда и будет предмет для обсуждения.

rami

Цитата: sofi от 14 сентября 2014, 12:44Не я такой, жизнь такая!!!! :'(
Жизнь, она коварна, поймает таких как вы и заставляет "автоматизировать бардак"
Цитата: sofi от 14 сентября 2014, 12:44Делать то, что скажите?!
Если у вас нет выбора, то это значит, что выбор сделан и сомнения — это пустая трата сил и времени. Продолжайте работать с рабочим документом(в формате Excel или полу-Excel), создайте новый переходной документ. Если не хотите выкладывать весь документ с данными на форуме, разбейте его на подзадачи, замените данные, посмотрим, что можно сделать

sofi

#11
Вырезал из программы, основной кусок!
Формирует помесячно таблицу между двумя датами, с точностью до одного дня.
Вот она и дергается, когда заполняется данными
(прим: не только месяцами и днями!!!!).
Т.е. когда на формирование каждой строки цикла
уходит больше времени, по сравнению с пустой таблицей.

ЦитироватьВы хотите, чтобы кто-то переписал  VBA на него и проверил, а дергается ли на чистом калке?
Если я правильно понял руководство по OOCalc, то переписывать ничего не надо.
Достаточно вставить, где необходимо, в код на VBA, код на "кальке".
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

Hasim

Ошибки устраните.

sofi

#13
Загружаю прямо с форума, у меня ошибок не выдает!
Установлен OOCalc 4.1.1,
на 4.1.0 проверил, тоже нет ошибки.
А вот на 3.1.0 есть!!!

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

Hasim

Зачем эти строки в коде:
Set c = c(2)

c(2) - что это, и где задается?