Я задавал этот вопрос раньше, но по общему признанию ужасным образом, поэтому я спрашиваю это снова. Вот и я снова.

Я делаю программу в VBA Excel - или лучше, комбинируя определенный рабочий лист с действиями и частями кода, чтобы создать что-то, что работает как отдельная программа. Часть этого включает в себя привязку нескольких изображений (десятки из них) к определенному макросу по щелчку.

Я создал указанные изображения с помощью кнопки "Разработчик" -> "Режим разработки". Изображения называются так: Image1, Image2, Image3 ... и т.д. Что мне нужно, если, например, я нажимаю Image1, вызывается подпрограмма Action(1). Если я нажму Image100, я хочу вызвать подпрограмму Action(100). Поэтому я хочу вызвать подпрограмму Action, передавая значение, в соответствии с которым щелкается изображение, в приведенном мной примере, в соответствии с его именем.

При быстром поиске первым способом, который я нашел, чтобы сделать эту работу, был следующий:

Sub Image1_Click()
     Call Action(1)
End Sub

Это было для клика на Image1. Для клика на Image100 это будет:

Sub Image100_Click()
     Call Action(100)
End Sub  

Недостаток использования только этого способа очевиден: мне нужно создать столько обработчиков нажатий, сколько у меня есть изображений, хотя каждый раз вызывается одна и та же процедура, и все, что важно для получения передаваемого значения, - это изображение название.

Итак, учитывая очевидный порядок моей логики и того, чего я хочу достичь, я хотел бы, чтобы вы предоставили мне более умный способ создания событий нажатия для всех моих изображений без необходимости использовать слишком много избыточного кода и явно неоптимальная логика.

ПРИМЕЧАНИЕ. В случае путаницы подпрограмма «Действие» одинакова для всех изображений. Изменяется только переданное значение.

1 ответ1

0

Вы можете использовать приложение.Свойство Caller и назначьте универсальный макрос всем изображениям, а затем передайте идентификатор изображения в качестве аргумента -

Sub genericpicture_click()

Dim pic As String
pic = Application.Caller
MsgBox (pic)

End Sub

Вот пример использования случаев:

  ' Procedure to display which button was pressed.
      Sub WhichButton()

         ' Assign the calling object to a variable.
         ButtonName = Application.Caller

         ' Display the name of the button that was clicked.
         Select Case ButtonName

            ' NOTE: When you type the name of the button, note that
            ' Visual Basic is case and space sensitive when comparing                                                
            ' strings. For example, "Button 6" and "button6" are not the 
            ' same.
            Case "Button 6"
            MsgBox Application.Caller & "  was Clicked"

            Case "Button 7"
            MsgBox Application.Caller & " was clicked."

            Case "Button 8"
            MsgBox Application.Caller & " was clicked."

         End Select

      End Sub

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .