Access
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Access

VBA Alchemy:Biến các phương thức thành thuộc tính

Một trong những cách tốt nhất để tăng tốc độ thực thi mã trong Excel là tắt cập nhật màn hình bằng cách sử dụng Application.ScreenUpdating bất động sản. Bạn có thể làm điều tương tự trong Access bằng cách sử dụng Application.Echo phương pháp.

Lưu ý rằng tôi đã gọi phiên bản Excel là một thuộc tính và phiên bản Access dưới dạng một phương pháp . Điều đó có nghĩa là chúng ta có thể kiểm tra trạng thái vẽ màn hình trong Excel, nhưng chúng ta không thể thực hiện điều đó trong Access. Điều này hóa ra là một sự khác biệt quan trọng.

Tôi có một số chức năng trong thư viện mã của mình tạm thời tắt tính năng vẽ màn hình. Kỹ thuật này thường không được sử dụng để cung cấp loại tăng hiệu suất mà chúng ta thấy trong Excel. Thay vào đó, nó cải thiện giao diện bằng cách ngăn kiểu "nhấp nháy biểu mẫu" xảy ra nếu chúng tôi thực hiện các thay đổi nhanh chóng đối với giao diện biểu mẫu của mình.

Một trường hợp sử dụng đơn giản

Tôi có một mô-đun lớp cung cấp các tính năng nâng cao để thay đổi kích thước riêng các điều khiển biểu mẫu khi chính biểu mẫu được thay đổi kích thước. Khi tôi lần đầu tiên phát triển mô-đun này, hiệu ứng hình ảnh rất đáng lo ngại. Bất cứ khi nào biểu mẫu được thay đổi kích thước, từng điều khiển riêng lẻ sẽ thay đổi kích thước trên màn hình tại một thời điểm.

Public Sub weForm_Resize()
   '... loop through and resize controls based on their Tag property...
End Sub

Đây là một trải nghiệm người dùng chói tai. Để cải thiện nó, tôi sẽ tắt cập nhật màn hình, thực hiện các thay đổi của mình, sau đó bật lại cập nhật màn hình khi kết thúc chức năng.

Public Sub weForm_Resize()
    Application.Echo False
    
    '... loop through and resize controls based on their Tag property...
    
    Application.Echo True
End Sub

Điều này đã cải thiện đáng kể trải nghiệm người dùng. Tôi đã bắt đầu sử dụng kỹ thuật này trong tất cả mã của mình đang sửa đổi giao diện người dùng. Và đó là lúc tôi bắt đầu gặp sự cố.

Vấn đề xảy ra khi tôi gọi nhiều chức năng đã tắt tính năng vẽ tranh màn hình liên tiếp. Chức năng đầu tiên sẽ tắt tính năng vẽ màn hình, thực hiện các thay đổi của nó, sau đó bật lại tính năng vẽ màn hình. Giao diện sẽ cập nhật bản cập nhật của nó, sau đó chức năng thứ hai sẽ tắt tính năng vẽ màn hình một lần nữa, thực hiện các thay đổi và cuối cùng là bật lại tính năng vẽ màn hình.

Duy trì trạng thái vẽ tranh trên màn hình

Cách tốt hơn để xử lý tình huống này là lưu trạng thái vẽ tranh màn hình khi bắt đầu quy trình, tắt tính năng vẽ tranh màn hình, sau đó khôi phục trạng thái vẽ tranh màn hình ban đầu đã lưu ở đầu quy trình. Trong Excel, điều này rất đơn giản:

Sub ComplexExcelProcess()
    Dim SavePaintStatus As Boolean
    SavePaintStatus = Application.ScreenUpdating
    
    '...run some complex calculations...
    
    Application.ScreenUpdating = SavePaintStatus
End Sub

Có lẽ bạn đã phát hiện ra sự cố trong Access. Mã để bật và tắt tính năng vẽ tranh màn hình trong Access là một phương pháp, có nghĩa là không có cách nào để kiểm tra trạng thái hiện tại của nó. Không thể viết mã như ví dụ trên trong Access.

Tôi đã xử lý vấn đề như thế nào? Tôi đã tạo một mô-đun lớp và gói Application.Echo phương thức bên trong thuộc tính lớp. Tôi đã sử dụng mô hình Singleton (mà không nhận ra đó là những gì vào thời điểm đó) để duy trì trạng thái chương trình này. Tôi đã đặt tên cho lớp này là clsApp và tạo một phiên bản công khai duy nhất của lớp được khai báo với Mới từ khóa để nó luôn có sẵn.

Mã mẫu

Đây là đoạn trích từ clsApp của tôi lớp:

'--== 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

Trong một mô-đun tiêu chuẩn riêng biệt, tôi đã khai báo một phiên bản công khai của lớp như sau:

Public App As New clsApp

Bây giờ tôi đã có một cách để kiểm tra trạng thái của bức tranh màn hình ứng dụng của tôi. Yêu cầu duy nhất là tôi sẽ không bao giờ sử dụng Application.Echo trực tiếp trong bất kỳ mã nào của tôi. Tôi luôn sử dụng App.Echo để đặt cờ vẽ màn hình ngay bây giờ.

Cách sử dụng mẫu

Điều này cho phép tôi thay đổi mã thay đổi kích thước của mình thành mã này, trông rất giống với ví dụ Excel của tôi trước đó:

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách cải thiện độ chính xác của cơ sở dữ liệu

  2. Cách kiểm tra xem người dùng có nhấp vào [Hủy] trên InputBox trong VBA hay không

  3. Tham gia cùng tôi vào Thứ Ba, ngày 9 tháng 4 để biết Tin tức mới nhất về Microsoft Access

  4. Cách thay đổi màu nền của biểu mẫu trong Access 2016

  5. Quyền truy cập ODBC từ Windows Server Core