Página 1 de 1

VBA e objetos

Enviado: 11 Mar 2022 às 14:40
por Sullivan2021
Boa tarde, estou com uma dúvida relacionado a programação do VBA. Eu criei um botão que quando é clicado, ele tampa determinada célula com um objeto, que no meu caso é um retângulo. Toda vez que ele tampa essa determinada célula com esse objeto, ele está criando um objeto novo. Por exemplo, eu clico no botão e ele cola um retângulo preto na célula A2. Até aí beleza, está funcionando exatamente como pretendido.

Porém, quero criar um outro botão que apagará o retângulo da célula A2. O problema é que cada vez que eu clico para gerar o objeto que irá tampar a célula A2, o Excel cria o retângulo com um nome diferente, por exemplo “Retângulo 1”. Na segunda vez que eu clicar no botão, ele irá criar um objeto com o nome “Retângulo 2” e assim por diante.

Eu preciso de uma fórmula que irá apagar os objetos ("Retângulo " & i + 1), porém não estou conseguindo realizar isso. Ou seja, essa fórmula apagará todos os objetos que tem o nome “Retângulo *mais o número do objeto*“. Será que vocês conseguem me ajudar nisso?

Re: VBA e objetos

Enviado: 11 Mar 2022 às 15:04
por PHSabater
É possível sim, tem que ver como está fazendo a criação via código.
Consegue disponibilizar o exemplo?

Re: VBA e objetos

Enviado: 11 Mar 2022 às 18:40
por Sullivan2021
O código que eu vou disponibilizar abaixo foi um usuário aqui do fórum que me forneceu e é usado para uma função similar. Vou colar o código abaixo e te explicar:

Range("A5").Select
Selection.End(xlToRight).Select
Dim c As Range, i As Long
For Each c In Range("A5:F5").SpecialCells(2)
ActiveSheet.Shapes("AAA " & i + 1).OnAction = c.Value: i = i + 1
Next c


Nesse código, eu tenho o nome de 6 macros que estão nas células de A5 até F5. O código pega esses nomes, seguindo a ordem de A5 até F5 e cola nos botões AAA 1, AAA 2, AAA 3, AAA 4, AAA 5 e AAA 6 - que estão em outra região da planilha - e são objetos nomeados "AAA" com algum número.
Agora, a função que eu preciso executar e que eu tive como base o código acima deverá funcionar de maneira similar, porém, ela só apagará os objetos que estarão nomeados com "Retângulo **número**". Vai seguir a lógica apenas da parte ("AAA " & i + 1), porém, para apagar agora os objetos nomeados "Retângulo **número**"


O código acima eu postei aqui mais para contextualizar e para mostrar qual foi a base para a lógica que quero programar. O código que eu quero programar não vai pegar nomes de macros em células e nem colar em objetos, só vai seguir a lógica de apagar os objetos tendo como base o nome do objeto (Retângulo) mais o número, que poderá ser qualquer número já que o Excel fica sempre criando novos números quando eu crio novos objetos para tampar a célula A2.

Basicamente o Excel estará apagando todos os objetos nomeados "Retângulo". Digamos que eu tenha os objetos "Retângulo 3", "Retângulo 2701" e "Retângulo 350". Quando o código for executado, ele deve apagar esses três objetos nomeados ("Retângulo **mais o número do objeto**").

Re: VBA e objetos

Enviado: 11 Mar 2022 às 19:28
por PHSabater
A rotina abaixo vai varrer sua planilha ativa e procurar pelos shapes, depois mostra o endereço da célula onde contém as formas.
Com o retorno do endereço pode manipular como quiser.

Sub verifica_se_existe_imagem_na_panilha_II()
Dim Shp As Shape, vArea As Range
For Each Shp In ActiveSheet.Shapes
If vArea Is Nothing Then
Set vArea = Shp.TopLeftCell
Else
Set vArea = Union(vArea, Shp.TopLeftCell)
End If
Next Shp
MsgBox "Há imagems shapes(autoformas) nas células : [ " & vArea.Address(0, 0) & " ]", _
vbInformation, "Saberexcel - site das macros"
End Sub

Re: VBA e objetos

Enviado: 11 Mar 2022 às 19:44
por osvaldomp
Código: Selecionar todos
Sub DeletaRetângulos()
 Dim sh As Shape
  For Each sh In ActiveSheet.Shapes
   If sh.Name Like "Re*" Then sh.Delete
  Next sh
End Sub

Re: VBA e objetos

Enviado: 11 Mar 2022 às 20:14
por Sullivan2021
@PHSabater obrigado pela contribuição, mas acabou não dando certo. O objetivo é só apagar todos os objetos nomeados "Retângulos **mais o número**".
Na minha planilha eu não tenho apenas os Retângulos como objetos, tenho muitos outros e o seu método iria também contar eles e retornar em msgbox, quando é apenas os objetos que são nomeados "Retângulos" que precisam ser apagados.
Eu encontrei agora um vídeo no youtube chamado "How To Delete Objects From Excel Sheet? Remove Image From Excel Using VBA Macros" feito pelo canal TechSolutions que sintetiza exatamente o que procuro, porém, não consegui adaptar a macro deles para o meu caso. No vídeo, é postado a seguinte macro, que apaga todas as imagens contidas na planilha:

Sub DeletePicturesInActiveWorkbook()
For Each ws In ActiveWorkbook.Worksheets
For Each pic In ws.Pictures
pic.Delete
Next pic
Next ws
End Sub

É exatamente isso o que eu quero fazer, porém, focado somente nos objetos que possuem "Retângulo" em seus nomes no meu caso. Eu postei aquele exemplo do post #69599 só como uma forma de sintetizar e explicar oq pretendo fazer, mas acho que acabou ficando um pouco confuso.

Re: VBA e objetos

Enviado: 11 Mar 2022 às 20:32
por Sullivan2021
EDIT: deu certo @osvaldomp . Funcionou seu código, muito show!!
Muito obrigado pela atenção e contribuição de @PHSabater e @osvaldomp, vcs me ajudaram bastante!! Muito legal essa comunidade!!