Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
  • Avatar do usuário
Por Sullivan2021
Posts
#69587
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?
Avatar do usuário
Por PHSabater
Posts Avatar
#69590
É possível sim, tem que ver como está fazendo a criação via código.
Consegue disponibilizar o exemplo?
Por Sullivan2021
Posts
#69599
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**").
Avatar do usuário
Por PHSabater
Posts Avatar
#69602
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
Por osvaldomp
#69603
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
Por Sullivan2021
Posts
#69604
@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.
Por Sullivan2021
Posts
#69605
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!!
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord