Maneira inteligente de conectar várias imagens à macro ao clicar - VAB Excel

0

Eu já fiz essa pergunta antes, mas reconhecidamente de uma maneira terrível, então estou perguntando isso novamente. Então aqui estou eu mais uma vez.

Estou fazendo um programa no VBA Excel - ou melhor, combinando uma certa planilha com ações e partes de código para criar algo que funcione como um programa autônomo. Parte disso envolve a vinculação de várias imagens (dezenas delas) a uma determinada macro, ao clicar.

Eu criei as referidas imagens através do botão "Desenvolvedor" - > "Modo Design". As imagens são nomeadas na moda: Image1, Image2, Image3 ... etc. O que eu quero é, se, por exemplo, eu pressionar Image1, a sub-rotina Action (1), é chamada. Se eu pressionar Image100, eu quero que a sub-rotina Action (100) seja chamada. Portanto, desejo chamar a Sub-rotina de Ação passando um valor de acordo com a imagem clicada, no exemplo que dei a você, de acordo com seu nome.

Com uma pesquisa rápida, a primeira maneira que descobri para fazer esse trabalho foi a seguinte:

Sub Image1_Click()
     Call Action(1)
End Sub

Isso foi para um clique em Image1. Para um clique no Image100, isso seria:

Sub Image100_Click()
     Call Action(100)
End Sub  

A desvantagem de usar apenas desta forma é óbvia: eu precisaria criar tantos manipuladores no clique quanto as imagens que tenho, mesmo que a mesma rotina seja chamada todas as vezes e tudo o que importa para obter o valor a ser passado é o nome da imagem.

Então, dada a ordem óbvia da minha lógica e do que eu quero alcançar, eu gostaria que você me fornecesse uma maneira mais inteligente de criar eventos no clique para todas as minhas imagens, sem ter que usar tanta redundância código e uma lógica obviamente não ótima.

NOTA: Em caso de confusão, a Sub-rotina de Ação é a mesma para todas as imagens. Apenas o valor transmitido é alterado.

    
por Noob Doob 28.04.2014 / 18:52

1 resposta

0

Você pode usar a propriedade Application.Caller e atribuir a macro genérica a todas as imagens e, em seguida, passar o ID da imagem como argumento -

Sub genericpicture_click()

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

End Sub

Aqui está um exemplo usando casos:

  ' 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
    
por 28.04.2014 / 19:26