Tópicos relacionados a códigos VBA, gravação de macros, etc.
  • Avatar do usuário
#65993
Tudo beleza pessoal?

Estou com uma dúvida referente à programação de macros e vou tentar explicar para vocês – vai ser um texto meio extenso.
Eu tenho essas três figuras pretas, na qual pretendo adicionar macros gravadas dentro delas, ou seja, essas figuras pretas serão botões:

Imagem

Agora vou explicar o botão configuração 1. Quando eu clicar no botão configuração 1, ele escreverá o nome de três macros já feitas em determinadas células - que estarão ocultas depois que a planilha inteira estiver pronta - e executará logo em seguida a macro_que_copia_e_cola_nos_botoes:

Imagem

A macro_que_copia_e_cola_nos_botoes copiará o nome das macros que o botão Configuração 1 escreveu e colará dentro dos botões pretos – em atribuir macro quando clicado com o botão direito nos botões pretos - localizados nas células C5; E5 e G5. Assim:
    A macroA é uma macro que escreve “A” dentro da célula C5 e será adicionada dentro do botão que se encontra na célula C5;
      A macroB é uma macro que escreve “B” dentro da célula E5 e será adicionada dentro do botão que se encontra na célula E5;
        A macroC é uma macro que escreve “C” dentro da célula G5 e será adicionada dentro do botão que se encontra na célula G5;

        Dessa forma, basta eu clicar no botão Configuração 1 que as minhas figuras pretas estarão com macros dentro delas, se transformando assim em botões:

        Imagem

        Até então, a minha macro funcionou perfeitamente, como era para ser executada.

        O problema acontece quando eu aperto o botão Configuração 2. Esse botão Configuração 2, escreverá no mesmo campo onde foi escrito a macroA; macroB e macroC outros nomes de macros e executará a macro_que_copia_e_cola_nos_botoes:

        Imagem

        Porém, quando eu clico em qualquer um dos botões pretos, que é pra escrever as letras D, E e F; eles escreverão a letra A, B e C.

        Isso acontece, pois quando foi gravada a macro_que_copia_e_cola_nos_botoes, ela copiou o nome macroA, macroB e macroC ao invés DO CONTEÚDO de dentro da célula.

        Eu queria saber se vocês sabem programar a macro_que_copia_e_cola_nos_botoes de forma que ela copia o conteúdo que estará dentro das células, adicionando-os dentro dos botões pretos, pois, não importará o nome da macro que eu colocar ali, ela estará adicionando nos botões pretos, desde que seja uma macro já existente.

        Isso precisa ser executado dessa forma, pois toda a planilha que eu fiz é com base nesse “jogo” de clicar nos botões configuração 1 e configuração 2 e eles mudarem as macros dos botões pretos, mediante a macro_que_copia_e_cola_nos_botoes.

        PS.: eu também preciso que a macro_que_copia_e_cola_nos_botoes copie o nome das macros não com base na posição das células que elas ocupam (C8, E8 e G8), mas sim, com base na distância que essas células estão da célula macro_que_copia_e_cola_nos_botoes. Isso fará com que uma única referência (célula I8) seja usada para calcular a distância de onde ela deve selecionar e copiar e eu terei um código de macro “genérico”, bastando mudar a referência de onde ele deverá copiar (ou seja, a célula I8), pois pretendo criar vários desses botões macro_que_copia_e_cola_nos_botoes em diferentes regiões da planilha que estou trabalhando, sempre colando independente de onde estiver escrito o nome das macros nos botões pretos.

        Muito obrigado se vocês leram o texto até fim, ficou bem extenso mas quis explicar detalhadamente com imagens para a melhor compreensão. Se vocês tiverem qualquer dúvida, irei responder prontamente!
        #65994
        Sullivan2021 escreveu: 26 Jul 2021 às 12:50 Eu queria saber se vocês sabem programar ... de forma que ... o conteúdo que estará dentro das células, adicionando-os dentro dos botões ...
        Olá, @Sullivan2021 .
        Eu não sei como colocar uma macro dentro de um botão, agora se você quiser atribuir uma macro a um botão, então veja se aproveita o código abaixo.
        Código: Selecionar todos
        Sub AtribuiMacroAoBotão()
         ActiveSheet.Shapes("Botão 1").OnAction = Range("C8").Value
        End Sub
        
        #
        Esse código irá atribuir ao Botão 1 a macro cujo nome esteja em C8.

        Quanto à segunda demanda (PS.: eu também preciso ...) eu não entendi o que você quer.
        Sullivan2021 agradeceu por isso
        #66004
        Obrigado pela resposta e pela atenção @osvaldomp funcionou perfeitamente!
        Quanto a segunda dúvida, eu queria encontrar uma forma de copiar o conteúdo da célula C8 até G8, sem necessariamente escrever (C8:G8) no código da macro; pois quero criar um código que entenda que deve copiar somente a partir da célula C8.
        Então seria algo mais ou menos “copiar 4 células à direita a partir de C8” sem especificar essas células, a única referência é a célula C8. Dessa forma, vai ficar muito mais fácil se eu tiver que executar o mesmo código numa outra parte da planilha e precisar alterar. Digamos que eu queira que o código seja executado na célula H8, bastaria eu abrir o editor da macro e mudar de C8 para H8 sem ter que mudar todas as células que é pra copiar e colar, uma vez que o código entenderia que a partir da célula H8 ele precisa copiar mais 4 células à direita. Facilitaria muito o trabalho de ficar mudando célula por célula na mão no código caso quisesse executar numa outra região da planilha e não correria o risco de errar alguma coisa.
        Ainda, seguindo essa mesma linha de raciocínio, teria também como fazer o código entender que é para copiar "a 5ª célula a direita de C8"? Nesse caso, ele não copiaria tudo o que está a direita de C8, mas a quinta célula à direita de C8
        #66006
        Agora entendi. Seguem alguns exemplos.

        Loop de C8 até F8
        Código: Selecionar todos
        Sub Loop4DireitaDeC8()
         Dim c As Range
          For Each c In Range("C8").Resize(, 4)
           MsgBox c.Address(0, 0) & vbLf & c.Value
          Next c
        End Sub
        #
        Loop à direita em 4 células a partir da célula selecionada; então para fazer o Loop, por exemplo, em C8:F8 selecione C8 e rode o código.
        Código: Selecionar todos
        Sub Loop4DireitaSeleção()
         Dim c As Range
          For Each c In Selection.Resize(, 4)
           MsgBox c.Address(0, 0) & vbLf & c.Value
          Next c
        End Sub
        #
        Indica endereço e conteúdo da quinta célula à direita de C8, ou seja, de H8.
        Código: Selecionar todos
        Sub QuintaDireitaC8()
         MsgBox Range("C8").Offset(, 5).Address(0, 0) & vbLf & Range("C8").Offset(, 5).Value
        End Sub
        #
        Indica endereço e conteúdo da quinta célula à direita da célula selecionada.
        Código: Selecionar todos
        Sub QuintaDireitaSeleção()
         MsgBox Selection.Offset(, 5).Address(0, 0) & vbLf & Selection.Offset(, 5).Value
        End Sub
        #
        Loop à direita em 4 células a partir da célula indicada em A1; então para fazer o Loop em C8:F8, por exemplo, coloque em A1 ~~~> C8.
        Código: Selecionar todos
        Sub Loop4DireitaConformeA1()
         Dim c As Range
          For Each c In Range(Range("A1").Value).Resize(, 4)
           MsgBox c.Address(0, 0) & vbLf & c.Value
          Next c
        End Sub
        JCabral, Sullivan2021, Bikke agradeceu por isso
        #66014
        Boa tarde Osvaldo

        Mais uma vez top essa explicação, mas na Sub Loop4DireitaConformeA1, está dar-me erro..."Run-time error '1004': Method 'Range' of object '_Global' failed".

        O que estarei a fazer de errado?
        #66017
        Salve, Jorge.

        Segue um arquivo com o código instalado.
        Você não está autorizado a ver ou baixar esse anexo.
        JCabral, Bikke agradeceu por isso

        Obrigado pela colaboração :D :D

        Boa tarde Pessoal, Preciso criar uma coluna na mi[…]

        DESCOBRIR TAJA DE JUROS AO DIA

        Boa tarde a todos, Estou com uma relaç&ati[…]

        Configurar impressão

        Tenho um botão na minha planilha Excel de i[…]

        Criar gráfico de Pareto

        Muitoo obrigado, deu certinho!! Vou dar uma estuda[…]

        Planilha Lenta (Fórmula Matricial)

        Caríssimo osvaldomp - 22 Set 2021 à[…]

        Boa Tarde! Prezado Basole - 21 Set 2021 às[…]

        Boa tarde, não estou conseguindo fazer a f&[…]