Notifications
Clear all

Duplicar Toggle Button

11 Posts
2 Usuários
0 Reactions
2,292 Visualizações
(@jorudess)
Posts: 53
Trusted Member
Topic starter
 

Eu tenho um toggle button (togglebutton1) já configurado e eu quero usar este mesmo botão em outros locais da mesma aba e também em abas diferentes. Porém, quando eu copio e colo esse botão em outro ponto, ele altera o nome (a cópia é renomada automaticamente para togglebutton 2), consequentemente perde todo o código que estava inserido no togglebutton1.

Como eu faço para utilizar o mesmo togglebutton em diversos pontos da minha planilha? (tanto na mesma aba quanto em abas diferentes).

Código do meu togglebutton. Enquanto ele está ativo (value = true), eu posso clicar em qualquer célula e colar a formatação

If togglebutton1.value = true then
'   Desabilita a atualização de tela
    Application.ScreenUpdating = False

'   Copia a formatação da celula
    Sheets("Apoio").Range("F1").Copy
    Selection.PasteSpecial xlPasteFormats
    
'   Atualiza os calculos da aba ativa
    ActiveSheet.Calculate
    
'   Habilita a atualização de tela
    Application.ScreenUpdating = True
End If

Percebi que o excel não permite que botões utilizem o mesmo nome, então eu pensei em uma solução mas não consegui executar:

1 - Criar uma macro em um módulo que será utilizada por todos os botões. Porém, se cada botão vai ter um nome diferente como eu faço para que uma única macro identifique o nome de cada botão, para depois verificar o "value" de cada um deles?

Ex: Quando o togglebutton1 chamar a macro... ela deverá ajustar o código para "If togglebutton1.value". Já quando o togglebutton2 chamar esta mesma macro... ela deverá ajustar o código para "If togglebutton2.value".

Além disso, essa solução de criar uma macro não é a mais efetiva porque toda vez que eu criar uma cópia deste togglebutton, eu terei que entrar no código deste botão e chamar a macro novamente =/

 
Postado : 10/08/2017 3:42 pm
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

Jorudess,

Bom dia!

Basta você criar uma rotina única, tipó essa:

Sub Botões()
    '   Desabilita a atualização de tela
        Application.ScreenUpdating = False

    '   Copia a formatação da celula
        Sheets("Apoio").Range("F1").Copy
        Selection.PasteSpecial xlPasteFormats
       
    '   Atualiza os calculos da aba ativa
        ActiveSheet.Calculate
       
    '   Habilita a atualização de tela
        Application.ScreenUpdating = True
End Sub

e Depois, em cada um dos botões, fazer a chamada para a rotina criada, tipo:

Private Sub ToggleButton2_Click()
    Call Botões
End Sub

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 11/08/2017 7:19 am
(@jorudess)
Posts: 53
Trusted Member
Topic starter
 

Wagner,

Bom dia!

Ontem eu passei o dia todo lendo fóruns pra tentar resolver esse problema que na hora de postar a duvida aqui a cabeça já tava saturada e não expliquei direito. Na verdade minha situação é um pouco mais complicada, eu acho... Mas agora vou colar meus códigos reais e você vai entender:

Eu tenho um conjunto de 6 togglebuttons (BtnAzulEscuro, BtnAzulClaro, BtnAmarelo, BtnVermelho, BtnCinza e BtnLimpar). Eu controlo eles usando o evento Worksheet_SelectionChange, para que toda vez que um deles estiver selecionado (value = true), copie a formatação de uma célula específica e cole nas células onde eu clicar.

Exemplo BtnAzulEscuro (o código dos outros botões é igual, só muda a célula de onde a formatação é copiada).

Private Sub Worksheet_SelectionChange(ByVal Target As Range)


If BtnAzulEscuro.Value = True Then

'   Desabilita a atualização de tela
    Application.ScreenUpdating = False

    Sheets("Apoio").Range("E1").Copy
    Selection.PasteSpecial xlPasteFormats

'   Atualiza os calculos da aba ativa
    ActiveSheet.Calculate

'   Habilita a atualização de tela
    Application.ScreenUpdating = True
End If


End Sub

Agora, em cada um dos togglebuttons (evento click) eu tenho um código para que apenas 1 deles fique selecionado (evitar que 2 fiquem selecionados ao mesmo tempo)

Exemplo BtnAzulEscuro

Private Sub BtnAzulEscuro_Click()


    BtnAzulEscuro.BackColor = RGB(0, 132, 231)


    If BtnAzulEscuro.Value = True Then
        BtnAzulClaro.Value = False
        BtnAmarelo.Value = False
        BtnVermelho.Value = False
        BtnCinza.Value = False
        BtnLimpar.Value = False
    End If


End Sub

O que eu quero é copiar todos esses 6 botões e usá-los em várias outras linhas da mesma aba e também em abas diferentes, mas na hora que eu copio, por exemplo, o BtnAzulEscuro e colo em outro ponto da mesma aba, a cópia é renomeada automaticamente para Togglebutton1 e obviamente perde toda a funcionalidade.

Para eu fazer ele funcionar tenho que renomear elepara BtnAzulEscuro2 (fazer o mesmo com as cópias dos outros botões), alterar o código do Worksheet_SelectionChange para:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)


If BtnAzulEscuro.Value = True Or BtnAzulEscuro2.Value = True Then

'   Desabilita a atualização de tela
    Application.ScreenUpdating = False

    Sheets("Apoio").Range("E1").Copy
    Selection.PasteSpecial xlPasteFormats

'   Atualiza os calculos da aba ativa
    ActiveSheet.Calculate

'   Habilita a atualização de tela
    Application.ScreenUpdating = True
End If


End Sub

E alterar o código do BtnAzulEscuro2_Click para:

Private Sub BtnAzulEscuro2_Click()


    BtnAzulEscuro2.BackColor = RGB(0, 132, 231)


    If BtnAzulEscuro2.Value = True Then
        BtnAzulClaro2.Value = False
        BtnAmarelo2.Value = False
        BtnVermelho2.Value = False
        BtnCinza2.Value = False
        BtnLimpar2.Value = False
    End If


End Sub

Só que eu vou ter que copiar esse botão muitas e muitas vezes na minha planilha então alterar tudo manualmente é inviável! As soluções que imaginei foram:

1 - Como todos os botões tem uma backcolor específica, fazer com que o evento Worksheet_SelectionChange identifique os botões pela cor e não pelo nome. O código ficaria algo assim:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)


If "Qualquer toggle button com o backcolor X" = True Then

'   Desabilita a atualização de tela
    Application.ScreenUpdating = False

    Sheets("Apoio").Range("E1").Copy
    Selection.PasteSpecial xlPasteFormats

'   Atualiza os calculos da aba ativa
    ActiveSheet.Calculate

'   Habilita a atualização de tela
    Application.ScreenUpdating = True
End If


End Sub

* O mesmo serve para identificar os botões com nome que comecem com uma palavra específica, desta forma eu renomearia os botões para BtnAzulEscuro1, BtnAzulescuro2, BtnAzulEscuro3, etc. e faria o evento identificar botões que comecem com a palavra "BtnAzulEscuro". Mas lógico que identificar pela cor é mais fácil porque eu não vou precisar perder tempo renomeando os botões.

2 - Solução parecida com a primeira. Criar uma variável que armazene o nome de todos os botões com a backcolor específica e usar essa variável no evento Worksheet_SelectionChange, mas não sei se uma variável pode armazenar vários valores diferentes e se o evento vai conseguir "ler" todos esses nomes diferentes.

3 - Desistir dos togglebuttons e usar Formas (Shapes), já que estas podem permanecer com o mesmo nome e posso copiar livremente. Mas eu fiz um teste aqui, configurei um retângulo como botão, só que eu quero que ele fique com a aparência de um togglebutton (indique quando estiver selecionado/ligado), então eu criei um código que, quando eu clicar a primeira vez no Shape, ele assume um efeito 3D simulando um botão pressionado/ligado, etc e tal. Funciona, mas quando eu copio esta Forma/Shape e colo em outra célula, o efeito 3D só atua sobre o primeiro botão e não sobre a cópia....

Eu vou deixar um anexo com exemplo aqui para facilitar no entendimento.

 
Postado : 11/08/2017 9:20 am
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

Jorudess,

Acho que entendi...

Como estou meio sem tempo de desenvolver tudo, vou te dar uma ideia de como fazer o que pretende. Veja, crie uma rotina (como essa abaixo) para que você possa chamar uma rotina só ao clicar em qualquer um dos botões (os que existam e os que você venha a inserir através das cópias;

Sub BotãoClicado(Nome_do_Botão As String)
    Select Case Nome_do_Botão
    Case "BtnVermelho"
        BtnVermelho.BackColor = RGB(247, 92, 74)
        BtnVermelho.Value = True
        BtnAzulEscuro.Value = False
        BtnAmarelo.Value = False
        BtnAzulClaro.Value = False
        BtnCinza.Value = False
        BtnLimpar.Value = False
    Case "BtnCinza"
        BtnCinza.BackColor = RGB(166, 166, 166)
        BtnCinza.Value = True
        BtnAzulEscuro.Value = False
        BtnAmarelo.Value = False
        BtnVermelho.Value = False
        BtnAzulClaro.Value = False
        BtnLimpar.Value = False
    'INSERIR OS OUTROS CASES
    End Select

Observe que no evento clic de cada botão você deve passar, como parâmetro para a rotina acima criada, o nome do botão. Dessa forma:

    Call BotãoClicado(BtnVermelho.Name)

Dessa forma, você pode fazer o que quiser com os botões sem ter que reescrever código para os mesmos e pode também fazer uma outra rotina para chamar pelo evento Worksheet_SelectionChange da planilha, obviamente, passando os parâmetros necessários.

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 11/08/2017 12:44 pm
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

Só complementando: você pode passar como parâmetro toda e qualquer propriedade dos botões, como a cor, por exemplo.

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 11/08/2017 2:03 pm
(@jorudess)
Posts: 53
Trusted Member
Topic starter
 

Entendi...

Eu tô implementando seu código aqui pra ver se dá certo...

Valeu pela atenção, cara... muito obrigado mesmo...

 
Postado : 11/08/2017 2:09 pm
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

De nada.

Por favor, vote positivamente clicando na mãozinha existente ao lado da ferramenta CITAR.

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 11/08/2017 2:32 pm
(@jorudess)
Posts: 53
Trusted Member
Topic starter
 

Não consegui fazer funcionar.

Dá erro na Sub BotaoClicado informando O objeto é obrigatório.

Se você puder enviar um arquivo com exemplo eu agradeço.

 
Postado : 11/08/2017 4:30 pm
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

Posta aí o código que você fez. Qual é a linha que tá parando e dando erro?

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 11/08/2017 5:26 pm
(@jorudess)
Posts: 53
Trusted Member
Topic starter
 

Meu código tá assim, igual ao seu:

   
Sub BotãoClicado(Cor_do_Botão As String)
    
Select Case Cor_do_Botão
 
Case "BtnAzulEscuro"
            BtnAzulClaro.Value = False
            BtnAmarelo.Value = False
            BtnVermelho.Value = False
            BtnCinza.Value = False
            BtnLimpar.Value = False
End Select

Ele dá erro nessas linhas BtnXXXXXXX.value = True. Só funciona se eu colocar ActiveSheet.BtnXXXXXXXXX.value = true, mas aí não funciona para os botões copiados...

 
Postado : 11/08/2017 5:53 pm
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

Jorudess,

Acho que na pressa cometi um erro passando como parâmetro apenas o nome do botão. Melhor passar o próprio controle pois aí você tem todas as propriedades dentro da rotina BotãoClicado.

Agora, tive um pouco mais de tempo e fiz um exemplo mais bem elaborado para você e que está funcionando perfeitamente bem. O exemplo eu fiz com botões de comando normais (ActiveX). Todavia, funcionará do mesmo jeito com Toggle Button.

Analise e estude o exemplo anexo que creio que dará para você resolver o seu problema.

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 12/08/2017 11:11 am