0

ユーザーが目的のレコードを簡単に見つけられるように、グラフィカルなナビゲーション システムを作成しました。現在、これを複数のフォームで使用していますが、別のフォームで使用する予定であるため、VBA コードをコピーして貼り付けるのではなく、コードをクラスに標準化したいと考えています。このようにして、すべてのフォームで同じ変更を行うのではなく、1 か所でコードを改善できます。

これが現在の仕組みです:

Dim v As New clsNav
Set v.button1 = Me.button1
Set v.button2 = Me.button2
v.init

そして、v.init では、クリックなどのすべてのイベントを設定したいと考えています。したがって、ユーザーが button1 をクリックすると、指定されたメソッドが実行されます。

どうやってやるの?

4

2 に答える 2

1

ボタンクリックのイベントは次のようになります

Private Sub Button1_Click()
    ' Your code
End Sub

そして、それらはそれぞれのフォームの背後にあるコード内にあります。コードを再利用できるようにするには、別のモジュールにサブルーチンを記述し、それをイベントで呼び出します。

Private Sub Button1_Click()
    call MySub()
End Sub

' This is in a module
Private Sub MySub()
    ' Your code
End Sub

これは、実行する必要があるコードがそのフォームに固有のコントロールを使用しない限り機能します。そのようなコードを書く必要がある場合は、コントロールをサブルーチンで呼び出すのではなく、サブルーチンに渡すだけです。Name

例。ボタンをクリックすると、TextBox が今日の日付で更新されるとしましょう。テキストボックスには、フォームごとに異なる名前が付けられています。 txtDate1何度Form1txtDate2Form2それで、それがどのように見えるかは

'Form 1 Button
Private Sub Button1_Click()
    call MySub(txtDate1)
End Sub

'Form 2 Button
Private Sub Button2_Click()
    call MySub(txtDate2)
End Sub

' This is in a module
Private Sub MySub(t as TextBox) 
    t.Text = Date()
End Sub

実行時にこれを実行しようとしている場合

VBAを使用してExcelで実行時に作成されたコントロールにイベントを追加する方法

開始するのに適した場所のようです。これが努力に値する状況を想像することはできません。

于 2013-06-21T07:12:27.827 に答える
0

私が使用する frmCtrl と呼ばれるジェネリック クラスがあります。これには、対応するイベント (クリック、dbl-click など) と共に、さまざまなコントロール タイプに対して設定された WithEvents ポインターがあります。次に、そのクラスにオブジェクトを「設定」する関数があるため、コントロールを渡すと、関数はそれを正しい型のオブジェクト ポインターに割り当てます。このルーチンには、どのオブジェクトに対してどの関数を呼び出すかのパラメーターも含まれているため、イベントへの応答方法を認識しています。

したがって、動的に追加されたコントロールを使用するフォームを作成するときは、コントロールごとにこれらのオブジェクトの 1 つを作成し、フォーム内のコードを呼び出すように設定するだけです。フォーム内のコードは frmCtrl オブジェクトだけの引数を取るため、どのコントロールがコードを起動したかを簡単に確認して、そこから移動できます。私は Visio で作業しているので、モジュールと関数名で関数を呼び出すこともできるので、クラスでもそれを処理できます。ただし、Access を使用してそのような呼び出しを行う方法を検討する必要があります。

このアプローチは、コントロールが VBIDE 経由で追加された場合に使用できますが、ここで他の回答のメソッドを使用できる場合は、このクラスを設定する価値がない場合があります。

于 2013-06-21T19:00:03.313 に答える