sql >> データベース >  >> RDS >> Access

VBA錬金術:メソッドをプロパティに変える

    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

    1. postgresql.conf、パラメーターを一度に減らす

    2. MS SQLを使用してすべてのフィールドレコードで使用されている単語の個別のリストを取得するにはどうすればよいですか?

    3. コミットされたトランザクションをロールバックする

    4. SQLite Sum()のしくみ