Един от най-добрите начини за ускоряване на изпълнението на кода в Excel е да изключите актуализирането на екрана с помощта на Application.ScreenUpdating Имот. Можете да направите същото в Access, като използвате Application.Echo метод.
Забележете, че посочих версията на Excel като свойство и версията на Access като метод . Това означава, че можем да проверим състоянието на рисуването на екрана в Excel, но не можем да направим това в Access. Това се оказва важна разлика.
Имам няколко функции в моята библиотека с кодове, които временно изключват рисуването на екрана. Техниката обикновено не се използва за осигуряване на вид повишаване на производителността, което виждаме в Excel. Вместо това подобрява интерфейса, като предотвратява типа „мигане на формуляра“, което се случва, ако правим бързи промени във външния вид на нашите формуляри.
Прост случай на използване
Имам модул за клас, който предоставя разширени функции за индивидуално преоразмеряване на контролите на формуляра, когато самият формуляр се преоразмерява. Когато за първи път разработвах този модул, визуалният ефект беше много обезпокоителен. Всеки път, когато формата се преоразмерява, всяка отделна контрола ще преоразмерява на екрана една по една.
Public Sub weForm_Resize()
'... loop through and resize controls based on their Tag property...
End Sub
Това беше разтърсващо потребителско изживяване. За да го подобря, бих изключал актуализирането на екрана, бих направил своите промени, след което бих включил отново актуализирането на екрана в края на функцията.
Public Sub weForm_Resize()
Application.Echo False
'... loop through and resize controls based on their Tag property...
Application.Echo True
End Sub
Това значително подобри потребителското изживяване. Започнах да използвам тази техника в целия си код, който променяше потребителския интерфейс. И тогава започнах да срещам проблеми.
Проблемът дойде, когато извиках множество функции, които изключваха рисуването на екрана подред. Първата функция ще изключи рисуването на екрана, ще направи своите промени, след което ще включи отново рисуването на екрана. Интерфейсът ще мига с актуализацията си, след което втората функция ще изключи отново рисуването на екрана, ще направи своите промени и накрая ще включи отново рисуването на екрана завинаги.
Запазване на състоянието на рисуване на екран
По-добрият начин за справяне с тази ситуация би бил да запазите състоянието на рисуване на екрана в началото на рутината, да изключите рисуването на екрана, след което да възстановите първоначалното състояние на рисуване на екрана, запазено в началото на рутината. В Excel това беше просто:
Sub ComplexExcelProcess()
Dim SavePaintStatus As Boolean
SavePaintStatus = Application.ScreenUpdating
'...run some complex calculations...
Application.ScreenUpdating = SavePaintStatus
End Sub
Може би вече сте забелязали проблема в Access. Кодът за включване и изключване на рисуването на екрана в Access е метод, което означава, че няма начин да се провери текущото му състояние. Писането на код като примера по-горе е невъзможно в Access.
Как се справих с проблема? Създадох модул за клас и обвих Application.Echo
метод вътре в свойство на клас. Използвах модела Singleton (без да осъзнавам, че това беше по онова време), за да поддържам тази част от състоянието на програмата. Нарекох този клас clsApp и създаде един публичен екземпляр на класа, деклариран с Нов ключова дума, така че винаги да е налична.
Примерен код
Ето откъс от моето clsApp клас:
'--== clsApp class module ==--
Option Explicit
Option Compare Database
Private m_bEcho As Boolean
Private Sub Class_Initialize()
Application.Echo True
m_bEcho = True
End Sub
Public Property Get Echo() As Boolean
Echo = m_bEcho
End Property
Public Property Let Echo(ByVal bEcho As Boolean)
Application.Echo bEcho
m_bEcho = bEcho
End Property
В отделен стандартен модул декларирах публичен екземпляр на класа така:
Public App As New clsApp
Сега имах начин да проверя състоянието на рисуването на екрана на моето приложение. Единственото изискване беше никога да не използвам Application.Echo
директно във всеки от моя код. Винаги използвам App.Echo
за да зададете флага за рисуване на екрана сега.
Примерно използване
Това ми позволи да променя кода си за преоразмеряване към този, който прилича много на моя пример в Excel от по-рано:
Public Sub weForm_Resize()
Dim SaveEcho As Boolean
SaveEcho = App.Echo 'Save the current screen painting state
App.Echo = False
'... loop through and resize controls based on their Tag property...
App.Echo = SaveEcho 'Restore the screen painting state
End Sub