En af de bedste måder at fremskynde kodeudførelsen i Excel er at deaktivere skærmopdatering ved hjælp af Application.ScreenUpdating ejendom. Du kan gøre det samme i Access ved at bruge Application.Echo metode.
Bemærk, at jeg omtalte Excel-versionen som en ejendom og Access-versionen som en metode . Det betyder, at vi kan tjekke status for skærmmaling i Excel, men det kan vi ikke gøre i Access. Dette viser sig at være en vigtig forskel.
Jeg har flere funktioner i mit kodebibliotek, der midlertidigt slår skærmmaling fra. Teknikken bruges generelt ikke til at give den slags præstationsboost, vi ser i Excel. I stedet forbedrer det grænsefladen ved at forhindre den type "formularblinkning", der opstår, hvis vi foretager hurtige ændringer i udseendet af vores formularer.
En simpel brugssag
Jeg har et klassemodul, der giver avancerede funktioner til individuel ændring af størrelsen på formularkontrolelementer, når selve formularen ændres. Da jeg først udviklede dette modul, var den visuelle effekt meget foruroligende. Hver gang formularen blev ændret, ændrede hver enkelt kontrol størrelse på skærmen én ad gangen.
Public Sub weForm_Resize()
'... loop through and resize controls based on their Tag property...
End Sub
Dette var en rystende brugeroplevelse. For at forbedre det, ville jeg slå skærmopdatering fra, foretage mine ændringer og derefter slå skærmopdatering til igen i slutningen af funktionen.
Public Sub weForm_Resize()
Application.Echo False
'... loop through and resize controls based on their Tag property...
Application.Echo True
End Sub
Dette forbedrede brugeroplevelsen væsentligt. Jeg begyndte at bruge denne teknik i al min kode, der ændrede brugergrænsefladen. Og det var da, jeg begyndte at løbe ind i problemer.
Problemet kom, da jeg ringede til flere funktioner, der deaktiverede skærmmaling i træk. Den første funktion ville slå skærmmaling fra, foretage ændringer og derefter slå skærmmaling til igen. Grænsefladen vil blinke sin opdatering, derefter vil den anden funktion slå skærmmaling fra igen, foretage sine ændringer og til sidst slå skærmmaling til igen for altid.
Bevarelse af skærmmalingstilstand
Den bedre måde at håndtere denne situation på ville være at gemme skærmmaleriets status i begyndelsen af rutinen, slå skærmmaling fra og derefter gendanne den originale skærmmalingsstatus, der blev gemt i begyndelsen af rutinen. I Excel var dette ligetil:
Sub ComplexExcelProcess()
Dim SavePaintStatus As Boolean
SavePaintStatus = Application.ScreenUpdating
'...run some complex calculations...
Application.ScreenUpdating = SavePaintStatus
End Sub
Måske har du allerede opdaget problemet i Access. Koden til at slå skærmmaling til og fra i Access er en metode, hvilket betyder, at der ikke er nogen måde at kontrollere dens aktuelle status. Det er umuligt at skrive kode som eksemplet ovenfor i Access.
Hvordan håndterede jeg problemet? Jeg oprettede et klassemodul og indpakkede Application.Echo
metode inde i en klasseegenskab. Jeg brugte Singleton-mønsteret (uden at være klar over, at det var, hvad det var på det tidspunkt) til at opretholde dette stykke programtilstand. Jeg gav denne klasse navnet clsApp og oprettede en enkelt offentlig forekomst af klassen erklæret med Ny søgeord, så det altid er tilgængeligt.
Eksempelkode
Her er et uddrag fra min clsApp klasse:
'--== 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
I et separat standardmodul erklærede jeg en offentlig forekomst af klassen sådan:
Public App As New clsApp
Jeg havde nu en måde at kontrollere status for min ansøgnings skærmmaling. Det eneste krav var, at jeg aldrig ville bruge Application.Echo
direkte i nogen af mine koder. Jeg bruger altid App.Echo
for at indstille flaget for skærmmaleri nu.
Eksempel på brug
Dette gjorde det muligt for mig at ændre min størrelseskode til denne, som ligner mit Excel-eksempel fra tidligere:
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