2

画像のあるボタンで構成される userForm があります。次に、ボタン/画像をクリックすると最初のラベルに画像が表示される3つの空白のラベルがあります。次に、別のボタン/画像をクリックすると、2番目のラベルが画像になり、3番目のラベルも同じになります。

btn1 から btn36 までのラベルが付いた 36 個のボタン capture1 capture2 capture3 という名前の 3 つの空白ラベル

他の情報を投稿する必要があるかどうかはわかりません。

このコード (VBA) を書くのに助けが必要です

4

1 に答える 1

3

ボタンからラベルに画像を取得する基本は簡単です。

Capture1.Picture = btn1.picture

本当の頭痛の種は、VBA の複数の Button.Click イベントに同じコードのチャンクを割り当てることができないという事実にあります。構文が次のような VB とは異なります。

Sub MyRoutine(sender, <args>) Handles Button1.Click, Button2.Click...

VBA では、基本的に 36 の異なる _Click ルーチン (ボタンごとに 1 つ) が必要です。モジュール レベル カウンターを設定して、参照するラベルを追跡します。

Dim counter As Integer

Private Sub UserForm_Activate()
    counter = 1
End Sub

Private Sub btn1_Click()
   If counter > 3 Then
      counter = 1
    End If
    Controls("capture" & counter).Picture = btn1.Picture
    counter = counter + 1
End Sub

各ルーチンのボタンの名前を除いて、これと同じ 36 個のルーチンが必要です。幸いなことに、ほとんどの場合、カット アンド ペーストで行うことができます。

このようにすると、数行のコードを節約できます。

Private Sub btn1_Click()
   Call CaptureImage(btn1.Name)
End Sub

Private Sub btn2_Click()
   Call CaptureImage(btn2.Name)
End Sub
.
.
.
Private Sub CaptureImage(ByVal btnName As String)
    If counter > 3 Then
      counter = 1
    End If
    Controls("capture" & counter).Picture = Controls(btnName).Picture
    counter = counter + 1
End Sub

ただし、CaptureImage サブルーチンを呼び出す 36 個の _Click ルーチンが残ることになります。

于 2011-04-08T15:50:37.117 に答える