Jednym z najlepszych sposobów na przyspieszenie wykonywania kodu w programie Excel jest wyłączenie aktualizacji ekranu za pomocą Application.ScreenUpdating własność. Możesz zrobić to samo w programie Access, używając Echa aplikacji metoda.
Zauważ, że nazwałem wersję Excela właściwością a wersja Access jako metoda . Oznacza to, że możemy sprawdzić stan malowania ekranu w programie Excel, ale nie możemy tego zrobić w programie Access. Okazuje się, że jest to istotna różnica.
W mojej bibliotece kodu mam kilka funkcji, które tymczasowo wyłączają malowanie ekranu. Technika ta nie jest zwykle używana do zapewnienia takiego wzrostu wydajności, jaki widzimy w programie Excel. Zamiast tego poprawia interfejs, zapobiegając „miganiu formularzy”, które występuje, gdy dokonujemy szybkich zmian w wyglądzie naszych formularzy.
Prosty przypadek użycia
Mam moduł klasy, który zapewnia zaawansowane funkcje do indywidualnej zmiany rozmiaru kontrolek formularza, gdy rozmiar samego formularza jest zmieniany. Kiedy po raz pierwszy tworzyłem ten moduł, efekt wizualny był bardzo niepokojący. Za każdym razem, gdy zmieniano rozmiar formularza, każda pojedyncza kontrolka zmieniałaby rozmiar na ekranie pojedynczo.
Public Sub weForm_Resize()
'... loop through and resize controls based on their Tag property...
End Sub
To było wstrząsające doświadczenie użytkownika. Aby to poprawić, wyłączyłbym aktualizację ekranu, wprowadziłem zmiany, a następnie ponownie włączyłbym aktualizację ekranu na końcu funkcji.
Public Sub weForm_Resize()
Application.Echo False
'... loop through and resize controls based on their Tag property...
Application.Echo True
End Sub
To znacznie poprawiło wrażenia użytkownika. Zacząłem używać tej techniki w całym moim kodzie, który modyfikował interfejs użytkownika. I wtedy zacząłem mieć problemy.
Problem pojawił się, gdy wywołałem kilka funkcji, które wyłączały malowanie ekranu z rzędu. Pierwsza funkcja wyłączyła malowanie ekranu, wprowadziła zmiany, a następnie ponownie włączyła malowanie ekranu. Interfejs sflashowałby swoją aktualizację, a następnie druga funkcja ponownie wyłączyłaby malowanie ekranu, wprowadziłaby zmiany, a na koniec na dobre włączyłaby malowanie ekranu.
Zachowywanie stanu malowania ekranu
Lepszym sposobem radzenia sobie z tą sytuacją byłoby zapisanie stanu malowania ekranu na początku procedury, wyłączenie malowania ekranu, a następnie przywrócenie oryginalnego stanu malowania ekranu zapisanego na początku procedury. W programie Excel było to proste:
Sub ComplexExcelProcess()
Dim SavePaintStatus As Boolean
SavePaintStatus = Application.ScreenUpdating
'...run some complex calculations...
Application.ScreenUpdating = SavePaintStatus
End Sub
Być może zauważyłeś już problem w programie Access. Kod do włączania i wyłączania malowania ekranu w programie Access to metoda, co oznacza, że nie ma możliwości sprawdzenia jego aktualnego stanu. Pisanie kodu, jak w powyższym przykładzie, jest niemożliwe w programie Access.
Jak poradziłem sobie z problemem? Stworzyłem moduł klasy i opakowałem Application.Echo
metoda wewnątrz właściwości klasy. Użyłem wzorca Singleton (nie zdając sobie sprawy, że tak było w tamtym czasie), aby utrzymać ten fragment stanu programu. Nazwałem tę klasę clsApp i utworzył pojedynczą publiczną instancję klasy zadeklarowanej z Nowym słowa kluczowego, aby zawsze było dostępne.
Przykładowy kod
Oto fragment mojej clsApp klasa:
'--== 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
W osobnym standardowym module zadeklarowałem publiczną instancję klasy w następujący sposób:
Public App As New clsApp
Miałem teraz możliwość sprawdzenia stanu malowania ekranu mojej aplikacji. Jedynym wymaganiem było to, że nigdy nie użyję Application.Echo
bezpośrednio w dowolnym moim kodzie. Zawsze używam App.Echo
aby ustawić teraz flagę malowania ekranu.
Przykładowe użycie
To pozwoliło mi zmienić mój kod zmiany rozmiaru na ten, który wygląda bardzo podobnie do mojego przykładu Excela z wcześniejszego:
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