Захват изображения внутри этикетки

#excel #vba #userform

#excel #vba #пользовательская форма

Вопрос:

У меня есть пользовательская форма, состоящая из нескольких кнопок, на которых есть изображения. Затем у меня есть три пустых метки, которые я хотел бы, чтобы при нажатии на кнопку / изображение изображение отображалось на первой метке. Затем, если я нажму на другую кнопку / изображение, вторая метка будет изображением и такой же для третьей.

36 кнопок с надписями btn1 через btn36 Три пустых ярлыка с именами capture1 capture2 capture3

Я не уверен, нужно ли мне публиковать какую-либо другую информацию или нет.

Мне нужна помощь в написании кода для этого (VBA)

Ответ №1:

Основы переноса изображения с кнопки на ярлык просты:

 Capture1.Picture = btn1.picture
  

Настоящая головная боль возникает из-за того, что вы не можете назначить один и тот же фрагмент кода нескольким событиям Button.Click в VBA. Не так, как в 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" amp; 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" amp; counter).Picture = Controls(btnName).Picture
    counter = counter   1
End Sub
  

но в итоге вы все равно получите 36 подпрограмм _Click, которые вызывают подпрограмму captureImage.