Excelでコードの実行を高速化する最良の方法の1つは、 Application.ScreenUpdatingを使用して画面の更新をオフにすることです。 財産。 Application.Echo を使用して、Accessでも同じことができます。 メソッド。
Excelバージョンをプロパティと呼んでいることに注意してください。 およびメソッドとしてのAccessバージョン 。つまり、Excelでスクリーンペイントのステータスを確認することはできますが、Accessでは確認できません。これは重要な違いであることがわかりました。
コードライブラリには、スクリーンペイントを一時的にオフにする関数がいくつかあります。この手法は、Excelで見られるようなパフォーマンスの向上を提供するために一般的に使用されることはありません。代わりに、フォームの外観を急激に変更した場合に発生する「フォームの点滅」のタイプを防ぐことで、インターフェイスを改善します。
フォーム自体のサイズが変更されたときにフォームコントロールのサイズを個別に変更するための高度な機能を提供するクラスモジュールがあります。私がこのモジュールを最初に開発したとき、視覚効果は非常に不安でした。フォームのサイズが変更されるたびに、個々のコントロールは画面上で一度に1つずつサイズ変更されます。
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
これにより、ユーザーエクスペリエンスが大幅に向上しました。私は、ユーザーインターフェイスを変更していたすべてのコードでこの手法を使い始めました。そして、それは私が問題にぶつかり始めたときです。
問題は、スクリーンペイントを連続してオフにする複数の関数を呼び出すときに発生しました。最初の関数は、スクリーンペインティングをオフにして変更を加えてから、スクリーンペインティングを再びオンにします。インターフェイスは更新をフラッシュし、2番目の関数はスクリーンペイントを再びオフにして変更を加え、最後にスクリーンペイントを完全にオンに戻します。
この状況に対処するためのより良い方法は、ルーチンの開始時にスクリーンペイントのステータスを保存し、スクリーンペイントをオフにしてから、ルーチンの開始時に保存された元のスクリーンペイントのステータスを復元することです。 Excelでは、これは簡単でした:
Sub ComplexExcelProcess()
Dim SavePaintStatus As Boolean
SavePaintStatus = Application.ScreenUpdating
'...run some complex calculations...
Application.ScreenUpdating = SavePaintStatus
End Sub
おそらく、Accessですでに問題を発見しているでしょう。 Accessでスクリーンペイントのオンとオフを切り替えるコードはメソッドです。つまり、現在のステータスを確認する方法はありません。上記の例のようなコードをAccessで書くことは不可能です。
どのように問題を処理しましたか?クラスモジュールを作成し、Application.Echo
をラップしました クラスプロパティ内のメソッド。このプログラムの状態を維持するために、シングルトンパターンを使用しました(当時はそれが何であったかはわかりませんでした)。このクラスにclsAppという名前を付けました Newで宣言されたクラスの単一のパブリックインスタンスを作成しました 常に利用できるようにキーワード。
これが私の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