Tópicos relacionados a códigos VBA, gravação de macros, etc.
Por Sullivan2021
#67429
Boa tarde, tudo bem com vocês?
Estou com uma dúvida até que simples relativo a macro, vou explicar para vocês.

Eu criei uma macro, chamada Macro_1 que tem como função copiar o conteúdo de duas determinadas células, e então colar dentro de dois determinados objetos:


Imagem

A Macro_1 funcionou perfeitamente, sem erros, executando tudo o que eu mencionei aqui em cima. Porém, quando eu mudo o nome da célula F4 de AAA para CCC e da célula H4 de BBB para DDD a macro não funcionou. Esses nomes CCC e DDD também são macros já existentes, porém, com outra uma função diferente das macros AAA e BBB.
Então, fui ver o código que estava na Macro_1 e identifiquei o erro:


Imagem

Repare que no código da Macro_1, quando foi programado para copiar o conteúdo da célula F4 e da célula H4, o código da macro copiou exatamente o que estava escrito naquelas células, naquele determinado momento que foi programado, ou seja, “AAA” e “BBB”. O correto, seria copiar o que está no interior da célula, sem especificar o que está escrito nelas, pois assim, se eu quiser mudar o conteúdo das células F4 e H4 para CCC e DDD – ou qualquer outro nome de macro já existente nessa planilha - a Macro_1 entenderá que só precisa copiar o conteúdo dentro das células F4 e H4 e colar no Botão 1 e no Botão 2.
Será que vocês podem me ajudar a mudar o código da Macro_1, naqueles trechos marcados em vermelhos, de forma que ela copie que o conteúdo do interior, sem especificar no código o nome de qualquer macro que eu colocar nos botões F4 e H4?
Se ficou alguma dúvida do que escrevi, irei responder nos comentários.

Agradeço a atenção!!
Por osvaldomp
#67432
Olá, @Sullivan2021 .

Experimente:
Código: Selecionar todos
Sub teste()
 ActiveSheet.Shapes("Botão 1").OnAction = [F4]
 ActiveSheet.Shapes("Botão 2").OnAction = [H4]
End Sub
#
obs. deve funcionar corretamente, mas caso os nomes dos botões não sejam reconhecidos então altere para Button 1 e Button 2.
Sullivan2021 agradeceu por isso
Por Sullivan2021
#67438
Funcionou corretamente @osvaldomp , porém, mexendo aqui na minha planilha percebi que preciso de mais uma dica. O código que você passou é:

ActiveSheet.Shapes("Botão 1").OnAction = [F4]

Esse código funcionou perfeitamente, porém, no segundo código eu queria mudar a referência. De [H4] eu queria que a partir daí o código entendesse que é para pegar o próximo conteúdo escrito à direita da célula F4. Pensei em fazer isso com Selection.End(xlToRight).Select

Seria algo mais ou menos assim:
ActiveSheet.Shapes("Botão 1").OnAction = [F4]
ActiveSheet.Shapes("Botão 1").OnAction = [F4. Selection.End(xlToRight).Select] >>> isso que eu escrevi está errado, mas é algo mais ou menos desse jeito

Isso tudo, pois facilitará muito ter uma só referência (nesse caso F4). Eu irei mudar esse código de lugar na planilha e são várias sequências tipos:
ActiveSheet.Shapes("Botão 1").OnAction = [F4]
ActiveSheet.Shapes("Botão 1").OnAction = [G4]
ActiveSheet.Shapes("Botão 1").OnAction = [H4]
ActiveSheet.Shapes("Botão 1").OnAction = [I4]

... mais um monte

Ao invés de mudar um por um, eu pensei em ter uma única referência que eu pudesse mudar substituindo, por exemplo:
ActiveSheet.Shapes("Botão 1").OnAction = [F4]
ActiveSheet.Shapes("Botão 1").OnAction = [F4. Selection.End(xlToRight).Select]
ActiveSheet.Shapes("Botão 1").OnAction = [F4. Selection.End(xlToRight).Select. Selection.End(xlToRight).Select]
ActiveSheet.Shapes("Botão 1").OnAction = [F4. Selection.End(xlToRight).Select. Selection.End(xlToRight).Select).Select. Selection.End(xlToRight).Select]

Se seguir esse modelo de cima e eu precisar colocar esse mesmo código rodando num outro lugar da planilha, basta eu selecionar o código inteiro e mudar a célula F4 para outra a célula que irei trabalhar, por exemplo de F4 para W55. Aí o código muda tudo de uma vez. Se tiver alguma dúvida do que escrevi, eu respondo aqui.
Por osvaldomp
#67441
Sullivan2021 escreveu: 11 Out 2021 às 20:31 ... e são várias sequências tipos: ... mais um monte
Você está tentando atribuir múltiplas macros a um único botão, é isso ?

Sugestão, por ora deixe de lado as tentativas de elaborar códigos e informe com exatidão o seu objetivo final.
Sullivan2021 agradeceu por isso
Por Sullivan2021
#67447
Escrevi um pouco rápido e ficou confusa a explicação @osvaldomp . Nesse trecho que vou colar abaixo, eu acabei escrevendo errado, não é para o mesmo botão, e sim para vários botões.

Está errado:
ActiveSheet.Shapes("Botão 1").OnAction = [F4]
ActiveSheet.Shapes("Botão 1").OnAction = [G4]
ActiveSheet.Shapes("Botão 1").OnAction = [H4]
ActiveSheet.Shapes("Botão 1").OnAction = [I4]

O correto é:
ActiveSheet.Shapes("Botão 1").OnAction = [F4]
ActiveSheet.Shapes("Botão 2").OnAction = [H4]
ActiveSheet.Shapes("Botão 3").OnAction = [J4]
ActiveSheet.Shapes("Botão 4").OnAction = [L4]
Agora, o que eu quero mudar são essas partes em vermelho.

Uma forma que seria muito mais rápido para eu elaborar a planilha, seria se exatamente no trecho em vermelho, eu usasse uma célula como referência para tudo, ou seja, F4. Veja outro exemplo abaixo:

Imagem

Temos 4 macros diferentes (AAA, BBB, HHH e TTT) e elas serão adicionadas, respectivamente nos botões 1, 2, 3, 4 através da macro_1.
Ou seja, ao invés de eu usar como referência as células [H4], [J4], [L4] para colar as macros BBB, HHH e TTT nos botões 2, 3 e 4, eu usaria a célula F4 para tudo. Uma das formas que eu achei de eu fazer isso é usar o Selection.End(xlToRight. Repare que se eu estiver fazendo um código que começa selecionado na célula F4 e logo em seguida adicionar Selection.End(xlToRight no código da macro, eu vou estar na célula H4. É exatamente isso eu quero fazer, pois, eu estaria na célula H4, sem mencionar H4. Por exemplo:

Não quero fazer isso:
ActiveSheet.Shapes("Botão 1").OnAction = [F4]
ActiveSheet.Shapes("Botão 2").OnAction = [H4]

Quero fazer isso:
ActiveSheet.Shapes("Botão 1").OnAction = [F4]
ActiveSheet.Shapes("Botão 2").OnAction = [F4. Selection.End(xlToRight]

>> é isso oq eu quero fazer, porém, está errado. Eu não to conseguindo fazer que seja selecionado a célula H4 dessa forma. Eu não quero colocar [H4], mas sim que o código entenda que deve pegar a próxima célula preenchida à direita de F4, que é a célula H4.

Referenciando assim as células, seria muito mais fácil para mim trabalhar na planilha, o problema, é que isso aqui está incorreto: [F4. Selection.End(xlToRight].
Editado pela última vez por Sullivan2021 em 12 Out 2021 às 14:44, em um total de 2 vezes.
Por osvaldomp
#67448
O código abaixo faz o que você quer e funciona para qualquer quantidade de macros/botões. Por exemplo, irá funcionar se você tiver 50 macros cujos nomes estejam na linha 4 e 50 botões numerados de 1 a 50.
Código: Selecionar todos
Sub Macro_1()
 Dim c As Range, i As Long
  For Each c In Range("F4", Cells(4, Columns.Count).End(1)).SpecialCells(2)
   ActiveSheet.Shapes("Botão " & i + 1).OnAction = c.Value: i = i + 1
  Next c
End Sub
#
Reforçando o que comentei na mensagem anterior, tendo em vista que o que você está tentando fazer não é usual em Excel (elaborar múltiplas macros associadas a múltiplos botões), se você nos informar qual é o sue objetivo final, talvez haja uma solução diferente, menos trabalhosa e tecnicamente mais adequada ao seu caso, pois geralmente uma única macro faz todo o trabalho necessário.
Sullivan2021 agradeceu por isso
Por Sullivan2021
#67450
No final, eu não ficaria alterando a macro_1 sempre que eu quisesse mudar a referência de F4 para F9, basta eu abrir um userform para a macro_1 e adicionar essas duas alterações:
Imagem

@osvaldomp
Por osvaldomp
#67451
Informe se você testou o código que passei no post #67448 e se ele atendeu ao que você descreveu no post #67447.
Sullivan2021 agradeceu por isso
Por Sullivan2021
#67452
osvaldomp escreveu: 12 Out 2021 às 16:42Informe se você testou o código que passei no post #67448 e se ele atendeu ao que você descreveu no post #67447.
Funcionou perfeitamente!! Eu realizei três testes aqui, os três executaram a função de forma correta, estarei realizando mais testes. Muito obrigado!! Isso vai facilitar muito a elaboração da planilha que estou fazendo

Edit: o código funcionou corretamente, teria como no código especificar que ele só deve executar da célula F4 até a célula L11? Se puder limitar as células em que o código atua, eu ainda posso escrever nessa mesma linha nas células que não abrange o código da macro

@osvaldomp
Por osvaldomp
#67453
Sullivan2021 escreveu: 12 Out 2021 às 17:29
... teria como no código especificar que ele só deve executar da célula F4 até a célula L11?
Substitua esta linha
For Each c In Range("F4", Cells(4, Columns.Count).End(1)).SpecialCells(2)


por esta
For Each c In Range("F4:L11").SpecialCells(2)

Se puder limitar as células em que o código atua, eu ainda posso escrever nessa mesma linha nas células que não abrange o código da macro
No intervalo F4:L11 você quer que algumas células sejam atribuídas às macros e outras células não, é isso? Se sim, qual o critério para dizer ao código "essa célula sim" ou "essa célula não" ?
Sullivan2021 agradeceu por isso
Por Sullivan2021
#67454
No intervalo F4:L11 você quer que algumas células sejam atribuídas às macros e outras células não, é isso? Se sim, qual o critério para dizer ao código "essa célula sim" ou "essa célula não" ?
O que está contido no intervalo eu não vou escrever nada que não seja o nome das macros, fora do intervalo sim. A primeira fórmula que você me passou For Each c In Range("F4:L11").SpecialCells(2) fez exatamente oq eu precisava

Muito obrigado pela atenção e por responder as minhas dúvidas, você me ajudou bastante! @osvaldomp
osvaldomp agradeceu por isso

Sugestão de solução, qq coisa[…]

Aqui está uma amostra, a ideia era bloquear[…]

Comentários nos códigos. Qualquer co[…]

Não ficou claro como vc quer realmente calc[…]

Botões

É possível, mas é sempre bom […]

Inicia uma nova mensagem e faz o upload da sua pla[…]

Tem. Facilita se vc deixa-las todas em uma mesma p[…]

Saldos

Me parece q vc teria de resolver essa inconsist&ec[…]