Salah satu cara terbaik untuk mempercepat eksekusi kode di Excel adalah dengan mematikan pembaruan layar menggunakan Application.ScreenUpdating Properti. Anda dapat melakukan hal yang sama di Access dengan menggunakan Application.Echo metode.
Perhatikan bahwa saya menyebut versi Excel sebagai properti dan versi Access sebagai metode . Itu berarti kita bisa memeriksa status lukisan layar di Excel, tapi kita tidak bisa melakukannya di Access. Ini ternyata menjadi perbedaan penting.
Saya memiliki beberapa fungsi di perpustakaan kode saya yang untuk sementara mematikan lukisan layar. Teknik ini umumnya tidak digunakan untuk memberikan semacam peningkatan kinerja yang kita lihat di Excel. Sebaliknya, ini meningkatkan antarmuka dengan mencegah jenis "flashing formulir" yang terjadi jika kita membuat perubahan cepat pada tampilan formulir kita.
Kasus penggunaan sederhana
Saya memiliki modul kelas yang menyediakan fitur-fitur canggih untuk mengubah ukuran kontrol formulir secara individual ketika formulir itu sendiri diubah ukurannya. Ketika saya pertama kali mengembangkan modul ini, efek visualnya sangat mengganggu. Setiap kali formulir diubah ukurannya, setiap kontrol individu akan mengubah ukuran di layar satu per satu.
Public Sub weForm_Resize()
'... loop through and resize controls based on their Tag property...
End Sub
Ini adalah pengalaman pengguna yang mengejutkan. Untuk memperbaikinya, saya akan mematikan pembaruan layar, membuat perubahan, lalu menghidupkan kembali pembaruan layar di akhir fungsi.
Public Sub weForm_Resize()
Application.Echo False
'... loop through and resize controls based on their Tag property...
Application.Echo True
End Sub
Ini meningkatkan pengalaman pengguna secara substansial. Saya mulai menggunakan teknik ini di semua kode saya yang memodifikasi antarmuka pengguna. Dan saat itulah saya mulai mengalami masalah.
Masalahnya muncul ketika saya akan memanggil beberapa fungsi yang mematikan lukisan layar berturut-turut. Fungsi pertama akan mematikan lukisan layar, membuat perubahan, lalu menghidupkan kembali lukisan layar. Antarmuka akan mem-flash pembaruannya, kemudian fungsi kedua akan mematikan lukisan layar lagi, membuat perubahan, dan akhirnya menghidupkan kembali lukisan layar untuk selamanya.
Menjaga status lukisan layar
Cara yang lebih baik untuk menangani situasi ini adalah dengan menyimpan status pengecatan layar di awal rutinitas, mematikan pengecatan layar, lalu mengembalikan status pengecatan layar asli yang disimpan di awal rutinitas. Di Excel, ini sangat mudah:
Sub ComplexExcelProcess()
Dim SavePaintStatus As Boolean
SavePaintStatus = Application.ScreenUpdating
'...run some complex calculations...
Application.ScreenUpdating = SavePaintStatus
End Sub
Mungkin Anda sudah melihat masalah di Access. Kode untuk menghidupkan dan mematikan lukisan layar di Access adalah metode, yang berarti tidak ada cara untuk memeriksa statusnya saat ini. Menulis kode seperti contoh di atas tidak mungkin dilakukan di Access.
Bagaimana saya menangani masalah tersebut? Saya membuat modul kelas dan membungkus Application.Echo
metode di dalam properti kelas. Saya menggunakan pola Singleton (tanpa menyadarinya saat itu) untuk mempertahankan status program ini. Saya menamai kelas ini clsApp dan membuat satu instance publik dari kelas yang dideklarasikan dengan Baru kata kunci agar selalu tersedia.
Contoh kode
Berikut adalah kutipan dari clsApp saya kelas:
'--== 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
Dalam modul standar terpisah, saya mendeklarasikan instance publik dari kelas seperti ini:
Public App As New clsApp
Saya sekarang memiliki cara untuk memeriksa status lukisan layar aplikasi saya. Satu-satunya persyaratan adalah saya tidak akan pernah menggunakan Application.Echo
langsung di salah satu kode saya. Saya selalu menggunakan App.Echo
untuk mengatur bendera lukisan layar sekarang.
Contoh penggunaan
Ini memungkinkan saya untuk mengubah kode pengubahan ukuran menjadi ini, yang sangat mirip dengan contoh Excel saya sebelumnya:
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