#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.