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
#49551
Boa noite, pessoal.

Essa macro insere um "X" na planilha a partir de um duplo clique:
Código: Selecionar todos
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Column <> 2 Then Exit Sub
        If Target.Value = "" Then
            Target.Value = "X"
        Else: Target.Value = ""
        End If
    Application.SendKeys "{ESCAPE}"
End Sub
Como faço para inserir/desinserir um "X" maiúsculo através de um duplo clique somente na área da tabela "TB_Divisao"?
Lembrando que a tabela "TB_Divisao" pode mudar de posição na planilha.

Segue planilha para testes.
Você não está autorizado a ver ou baixar esse anexo.
#49556
Boa noite Sandro,

Veja se a planilha anexa te atende.

Já que está programando em eventos, seria legal dar uma lida no post abaixo, que traz algumas boas práticas que evitam alguns erros frequentes.
http://gurudoexcel.com/forum/viewtopic. ... 015#p40015

Caso tenha alguma questão sobre esta planilha, ou algo do tópico acima, fique a vontade pra perguntar.

Jimmy San Juan
Você não está autorizado a ver ou baixar esse anexo.
Editado pela última vez por Jimmy em 26 Out 2019 às 09:34, em um total de 1 vez.
#49596
Boa noite, Jimmy.

A macro atendeu muito bem... mas aproveitando o ensejo o que eu deveria alterar na caro para que ela se restringisse aàs colunas da tabela referentes aos usuários somente?
Acredito que seria alterando o RngAlvo na linha:
Código: Selecionar todos
Set RngAlvo = ActiveSheet.ListObjects("TB_Divisao").DataBodyRange /code]

Seria fazendo uma espécie de Array entre as Coluna Usuário 1 - Usuário 7?
Array (Listcolumns("      ????
Serviria para evitar erro caso eu dê um duplo clique por exemplo na coluna [Tabela] da TB_Divisão... queria restringir a macro às colunas de Usuários.

Muito obrigado pela ajuda até aqui.
#49605
Bom dia Sandro,

Neste seu último arquivo anexado, notei que você colocou a macro de evento DoubleClick na Pasta_de_trabalho, ao invés de colocar na planilha onde está a tabela.

Para que funcione na Pasta de trabalho você deve alterar a primeira linha de
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
para
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

Note que há um parâmetro a mais na Sub, uma vez que as macros colocadas na Pasta_de_trabalho atuam sobre todas as planilhas, logo, ao ser executada é interessante saber qual foi a planilha que a chamou.

Quando coloca a macro em uma planilha específica, ela só vai funcionar para aquela planilha, dessa forma, é desnecessário o sistema informar em qual planilha está rodando.

No nosso caso, a tabela está em uma única planilha (nem poderia ser diferente uma vez que o Excel não aceitaria duas tabelas com o mesmo nome, mesmo em planilhas diferentes), assim, a macro poderia ter sua atuação limitada à aquela planilha, pois caso contrário, será acionada a cada duplo clique dado em qualquer planilha, o que é um desperdício de processamento. É claro que a macro é tão simples que a carga de CPU dada por execuções desnecessárias é imperceptível, mas trata-se de uma boa prática de programação.

Agora vou ver a questão da faixa de atuação da macro na tabela.

Se esta mensagem colabora para a solução do problema, peço que dê um Like, clicando no botão com o "positivo", acima e a direita.

Jimmy San Juan
#49606
Sandro,

Complementando o que mencionei na minha primeira mensagem de hoje, alterei a macro mas a deixei como um evento da planilha e não da pasta de trabalho.
Acabei não te perguntado se havia motivos para você a ter movido para a pasta de trabalho. Há?

Você tem razão, a atuação nesse caso foi na variável RngAlvo. Fiz passo a passo, e 3 linhas pra ficar mais claro, e também porque não gosto de linhas grandes de de difícil compreensão.

Ficou assim:
Código: Selecionar todos
    Set RngAlvo = ActiveSheet.ListObjects("TB_Divisao").DataBodyRange 'Aponta para a área da tabela
    TotCol = RngAlvo.Columns.Count      'Quantidade de colunas do corpo da tabela
    Set RngAlvo = RngAlvo.Offset(, 1).Resize(, TotCol - 2)  
O comando Set RngAlvo = ActiveSheet.ListObjects("TB_Divisao").DataBodyRange aponta para a área da tabela, que inclui a primeira e última colunas, o que não se quer. É necessário deslocar isso uma coluna pra direita. Esse é o trabalho do .Offset(, 1). Isso faz com que a primeira coluna passe a ser "M" e não mais "L", que é o que queremos. Como o primeiro parâmetro foi omitido (note que logo após o abre parenteses já aparece uma vírgula), não houve deslocamento de linhas.

Com o offset, a última coluna que era "T" passou a ser a "U", sendo que gostaríamos que fosse a "S". Então diminuímos o tamanho da Range em duas colunas. Para fazer isso, a quantidade total de colunas foi previamente obtido pela linha
TotCol = RngAlvo.Columns.Count 'Quantidade de colunas do corpo da tabela
O responsável por diminuir a quantidade de colunar é o .Resize(, TotCol - 2).
Novamente, a quantidade de linhas foi omitida, e por consequência não é alterado.

Se esta mensagem colabora para a solução do problema, peço que dê um Like, clicando no botão com o "positivo", acima e a direita.

Jimmy San Juan
Você não está autorizado a ver ou baixar esse anexo.
#49608
Nessa última planilha que te mandei já está corrigido.
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