Ir ao conteúdo
  • Cadastre-se

Visual Basic Rodar um código VBA em uma aba específica


Posts recomendados

Fiz um código VBA que funciona do jeito que eu preciso, porém, quando abro outra aba ou até mesmo outra planilha, o código gera um erro, ele só funciona numa aba específica.

O código é basicamente para fazer um PROCV em umas células específicas.

Como mexo com mais de uma planilha preciso que esse código rode somente quando a aba que eu preciso esteja aberta, já tentei usar sheet("DAQ").Selected e sheet("DAQ").Selected, mas dentro do meu código tem um comando para que aquela macro fique sendo executada a cada 1 segundo, pois caso alguém altere algum valor, na hr que roda a macro ele corrige o valor alterado, e como fica rodando ele fica selecionando a aba a cada 1 segundo e se eu abro outra aba volta para aba DAQ e se abro outra planilha da erro.

 

Eu pensei em colocar um If, para que rode somente quando a aba DAQ seja aberta, mas os dois comandos que coloquei não deram certo.

Segue abaixo o meu código

 

Private Sub TestProcv()

Dim i As Integer

FinalRow = Cells(Rows.Count, 1).End(xlUp).Row 'conta da última até a primeira linha preenchida'

For i = 3 To FinalRow 'coluna que vai ser feita a busca'
    
    
    
    Cells(i, 3) = Application.WorksheetFunction.VLookup(Cells(i, 2), Worksheets("tab").Range("A1:E155"), 5, 0) 'procv dentro da coluna 3 em todas as linhas'
    Cells(i, 4) = Application.WorksheetFunction.VLookup(Cells(i, 2), Worksheets("tab").Range("A1:E155"), 3, 0) 'procv dentro da coluna 4 em todas as linhas'
    Cells(i, 5) = Application.WorksheetFunction.VLookup(Cells(i, 2), Worksheets("tab").Range("A1:E155"), 2, 0) 'procv dentro da coluna 5 em todas as linhas'

    Cells(i, 9) = Application.WorksheetFunction.VLookup(Cells(i, 8), Worksheets("Plan1").Range("B73:F672"), 3, 0) 'procv dentro da coluna 3 em todas as linhas'
    Cells(i, 11) = Application.WorksheetFunction.VLookup(Cells(i, 8), Worksheets("Plan1").Range("B73:F672"), 4, 0) 'procv dentro da coluna 4 em todas as linhas'
    Cells(i, 13) = Application.WorksheetFunction.VLookup(Cells(i, 8), Worksheets("Plan1").Range("B73:F672"), 5, 0) 'procv dentro da coluna 5 em todas as linhas'
    
    Cells(3, 6) = FinalRow - 3
    
Next i



Application.OnTime Now + TimeValue("00:00:01"), "TestProcv" 'faz o programa rodar num intervalo de 1 seg'.

End Sub

 

Link para o comentário
Compartilhar em outros sites

Eu tinha pensado numa maneira diferente. Você colocaria sua macro em um módulo, Public ao invés de Private.

 

Então, no evento Workbook_Activate você coloca um gatilho de ativação da macro, e então chama a macro.

 

No evento Workbook_Deactivate você coloca um gatilho de parar a macro.

 

Abaixo os prints dos testes que eu fiz. Aplique na sua planilha conforme sua necessidade:

 

image.png.31db4eda466719418f3c90fc9e2de1e6.png

 

image.png.303942fae7d2964df9c98bbb1c795504.png

 

 

A variável "Atualiza" é o gatilho de execução da macro. Dentro do IF você bota suas linhas de código. Essas que eu coloquei dentro do IF aí é só pra executar meu teste aqui.

 

Qualquer dúvida, só dar o grito.

 

 

Link para o comentário
Compartilhar em outros sites

@Charley Rocha Segue a gambiarra q eu fiz aqui, porém nem rodar rodou.

E segue também onde que o depurador acha o erro quando troca de aba (quando uso o programa antigo), talvez tenha algum comando dentro do procv que possa ajustar para que não ocorra o erro e eu não to sabendo.

 

procv.png

procv1.png

procv3.png

Link para o comentário
Compartilhar em outros sites

Seria bom você postar a mensagem de erro, pra entender melhor que está acontecendo. Mas o problema que você citou a princípio foi resolvido: a macro só roda quando a planilha específica está ativa. Agora, se há problema na macro, é outra coisa que temos que tratar.

 

A título de curiosidade: por que você está usando VBA ao invés de simplesmente fazer o PROCV no Excel mesmo?

 

 

Link para o comentário
Compartilhar em outros sites

@Charley Rocha  Essa planilha que eu estou fazendo é para fazer lançamentos de umas medições especiais na empresa que trabalho e tem mais de uma pessoa que mexe nela, se eu deixar o procv na célula pode acontecer de agm apagar e perder os dados que estavam contidos nela. Essa foi uma maneira que achei de não ter como isso acontecer, pois no VBA eu consigo por senha.

Eu tentei proteger as células, mas eu criei uma linha padrão que quando aperta um botão copia uma linha igual embaixo e com as células protegidas ela não puxa os dados. Cada coisa que eu fazia dava um problema e dessa forma funcionou, porém da esse erro louco ae

Segue abaixo o erro.

 

procv3.png

Link para o comentário
Compartilhar em outros sites

O que está acontecendo é que a propriedade "Worksheetfunction" parece não funcionar em um módulo. 

 

Mova a sua macro do módulo para a classe da planilha correspondente (o lugar onde estão os eventos WorkSheet_Activate e Deactivate). Pode mudar o Public para Private novamente.

 

Isso deve resolver.

 

P.S: Pelo que eu entendi, você tem uma macro para copiar uma linha? Bastava colocar um comando para desproteger a planilha, copiar a linha, e proteger novamente.

Link para o comentário
Compartilhar em outros sites

3 minutos atrás, André Weiss disse:

@Charley Rocha uma duvida, aquela parte que ta escrito "Public atualiza As Boolean" ele gera uma nova linha de programação e pede uma End Sub, o que você fez ali para encerrar?

 

Essa é uma declaração de variável, não é uma Sub. Você pode deixar essa linha no módulo do jeito que está.

Link para o comentário
Compartilhar em outros sites

@Charley Rocha Eu coloquei o código dentro da planilha que eu iria trabalhar e apareceu o seguinte erro, parece que ele busca no módulo a programação.

Vou mandar como ficou a programação também.

Private Sub Worksheet_Activate()

atualiza = True
Call TestProcv
End Sub

Public atualiza As Boolean


Private Sub TestProcv()

FinalRow = Cells(Rows.Count, 1).End(xlUp).Row 'conta da última até a primeira linha preenchida'

For i = 3 To FinalRow 'coluna que vai ser feita a busca'
    
    
    
    Cells(i, 3) = Application.WorksheetFunction.VLookup(Cells(i, 2), Worksheets("tab").Range("A1:E155"), 5, 0) 'procv dentro da coluna 3 em todas as linhas'
    Cells(i, 4) = Application.WorksheetFunction.VLookup(Cells(i, 2), Worksheets("tab").Range("A1:E155"), 3, 0) 'procv dentro da coluna 4 em todas as linhas'
    Cells(i, 5) = Application.WorksheetFunction.VLookup(Cells(i, 2), Worksheets("tab").Range("A1:E155"), 2, 0) 'procv dentro da coluna 5 em todas as linhas'

    Cells(i, 9) = Application.WorksheetFunction.VLookup(Cells(i, 8), Worksheets("Plan1").Range("B73:F672"), 3, 0) 'procv dentro da coluna 3 em todas as linhas'
    Cells(i, 11) = Application.WorksheetFunction.VLookup(Cells(i, 8), Worksheets("Plan1").Range("B73:F672"), 4, 0) 'procv dentro da coluna 4 em todas as linhas'
    Cells(i, 13) = Application.WorksheetFunction.VLookup(Cells(i, 8), Worksheets("Plan1").Range("B73:F672"), 5, 0) 'procv dentro da coluna 5 em todas as linhas'
    
    Cells(3, 6) = FinalRow - 3
    
Next i

Application.OnTime Now + TimeValue("00:00:01"), "TestProcv" 'faz o programa rodar num intervalo de 1 seg'.


End Sub


Private Sub Worksheet_Deactivate()
atualiza = False
End Sub

 

 

Sem título.png

image.png

Link para o comentário
Compartilhar em outros sites

@André Weiss

 

Eu fiz uns teste aqui com seu código e constatei o seguinte:

 

1) O erro que você postou é porque a sub tem mesmo que estar em um módulo, porém mesmo colocando em um módulo ela não estava rodando por erro no valor do PROCV (vlookup). Você deve ter feito alguma bagunça com as células referenciadas aí. Tente fazer um VLookUp em uma matriz pequenininha que você verá que roda normal.

 

2) Realmente o caminho que você está seguindo não é o mais adequado. Ao adequar as células do VLookUp, a macro roda, porém ela fica em Loop infinito porque a macro chama a si mesma a cada 1 segundo. Isso impede que você faça qualquer trabalho no Excel. Ele aparenta estar "travado", mas na verdade está rodando a sua macro em background infinitamente. A maneira mais esperta de alcançar seu objetivo seria como eu comentei acima:

 

       - Use o Procv normalmente na sua planilha.

      - Bloqueie as células com fórmulas.

      - Se você precisar adicionar/copiar/mover linhas, acrescente "NomeDaPlanilha.unprotect" no seu código; faça a modificação, "NomeDaPlanilha.protect".

 

Aconselho fortemente que você siga por esse caminho, porque do jeito que você está fazendo eu não consigo mais te ajudar.

 

Link para o comentário
Compartilhar em outros sites

@Charley Rocha Andei dando umas mexidas aqui no programa e consegui resolver parcialmente.

Unica coisa que não consegui foi fazer o programa rodar no momento que entra na aba que preciso que rode a macro.

Para não gerar mais o erro eu coloquei um código na célula "A1", no caso é o nome do documento "DAQ 00212", nisso coloquei um If para o programa rodar somente se na célula "A1" estiver escrito "DAQ 00212" que no caso aqui é praticamente impossível. Daí eu bloqueei essa célula.

O problema da macro não iniciar quando entro na planilha eu resolvi com um botão, coloquei com o nome de "INICIAR", quando preciso trocar de aba ou abrir outra planilha o programa para de rodar, quando volto na planilha DAQ eu pressiono o botão e o programa já roda de volta.

 

Caso souber como faço pra rodar no momento que abro a planilha me da um toque.

Obrigado pela atenção ae :D

 

image.thumb.png.e879eeea2ceffebe7ee2071838816c93.png

image.thumb.png.ee00113baa8c25968c46777a9f31d2f2.png

Link para o comentário
Compartilhar em outros sites

@Charley Rocha No If ele comanda isso, no caso nesse comando abaixo:

 

If Application.ActiveWorkbook.ActiveSheet.Range("A1").Value = "DAQ 00212" Then

 

Como essa condição só se encontra na planilha que eu coloquei o código "DAQ 00212" na célula "A1" o código só ira rodar lá, quando eu saio da planilha sai dessa condição e o programa para e só volta quando aperto o botão.

 

Eu gostaria que o programa rodasse sem o uso do botão, mas foi só assim que consegui até o momento.

 

Link para o comentário
Compartilhar em outros sites

@Charley Rocha Deixei o programa principal no módulo assim:

 


Private Sub Teste()


FinalRow = Cells(Rows.Count, 1).End(xlUp).Row 'conta da última até a primeira linha preenchida'

If Application.ActiveWorkbook.ActiveSheet.Range("A1").Value = "DAQ 00212" Then

For i = 3 To FinalRow 'coluna que vai ser feita a busca'
    
    
    
    Cells(i, 3) = Application.WorksheetFunction.VLookup(Cells(i, 2), Worksheets("tab").Range("A1:E155"), 5, 0) 'procv dentro da coluna 3 em todas as linhas'
    Cells(i, 4) = Application.WorksheetFunction.VLookup(Cells(i, 2), Worksheets("tab").Range("A1:E155"), 3, 0) 'procv dentro da coluna 4 em todas as linhas'
    Cells(i, 5) = Application.WorksheetFunction.VLookup(Cells(i, 2), Worksheets("tab").Range("A1:E155"), 2, 0) 'procv dentro da coluna 5 em todas as linhas'

    Cells(i, 9) = Application.WorksheetFunction.VLookup(Cells(i, 8), Worksheets("Plan1").Range("B73:F672"), 3, 0) 'procv dentro da coluna 3 em todas as linhas'
    Cells(i, 11) = Application.WorksheetFunction.VLookup(Cells(i, 8), Worksheets("Plan1").Range("B73:F672"), 4, 0) 'procv dentro da coluna 4 em todas as linhas'
    Cells(i, 13) = Application.WorksheetFunction.VLookup(Cells(i, 8), Worksheets("Plan1").Range("B73:F672"), 5, 0) 'procv dentro da coluna 5 em todas as linhas'
    
    Cells(3, 6) = FinalRow - 3
    
Next i
Application.OnTime Now + TimeValue("00:00:01"), "Teste" 'faz o programa rodar num intervalo de 1 seg'.
End If

E dentro da Plan6 (DAQ) coloquei:

 

Private Sub Worksheet_Activate()

    Call Teste

End Sub

Falta alguma coisa? Pois da esse erro 

 

image.thumb.png.e730400b1dc41d94573ba1a69f89664b.png

adicionado 18 minutos depois

@Charley Rocha Acho que resolvi aqui, coloquei como Public ao invés de Private.

Como eu disse no inicio, sou bem leigo em VBA, tenho noções básicas de programação em C e C++ daí alguma coisa eu até engano na hora de programar.

Agora só não sei o por que de Private não rodar e Public roda de boa

Link para o comentário
Compartilhar em outros sites

47 minutos atrás, André Weiss disse:

@Charley Rocha Deixei o programa principal no módulo assim:

 



Private Sub Teste()


FinalRow = Cells(Rows.Count, 1).End(xlUp).Row 'conta da última até a primeira linha preenchida'

If Application.ActiveWorkbook.ActiveSheet.Range("A1").Value = "DAQ 00212" Then

For i = 3 To FinalRow 'coluna que vai ser feita a busca'
    
    
    
    Cells(i, 3) = Application.WorksheetFunction.VLookup(Cells(i, 2), Worksheets("tab").Range("A1:E155"), 5, 0) 'procv dentro da coluna 3 em todas as linhas'
    Cells(i, 4) = Application.WorksheetFunction.VLookup(Cells(i, 2), Worksheets("tab").Range("A1:E155"), 3, 0) 'procv dentro da coluna 4 em todas as linhas'
    Cells(i, 5) = Application.WorksheetFunction.VLookup(Cells(i, 2), Worksheets("tab").Range("A1:E155"), 2, 0) 'procv dentro da coluna 5 em todas as linhas'

    Cells(i, 9) = Application.WorksheetFunction.VLookup(Cells(i, 8), Worksheets("Plan1").Range("B73:F672"), 3, 0) 'procv dentro da coluna 3 em todas as linhas'
    Cells(i, 11) = Application.WorksheetFunction.VLookup(Cells(i, 8), Worksheets("Plan1").Range("B73:F672"), 4, 0) 'procv dentro da coluna 4 em todas as linhas'
    Cells(i, 13) = Application.WorksheetFunction.VLookup(Cells(i, 8), Worksheets("Plan1").Range("B73:F672"), 5, 0) 'procv dentro da coluna 5 em todas as linhas'
    
    Cells(3, 6) = FinalRow - 3
    
Next i
Application.OnTime Now + TimeValue("00:00:01"), "Teste" 'faz o programa rodar num intervalo de 1 seg'.
End If

E dentro da Plan6 (DAQ) coloquei:

 


Private Sub Worksheet_Activate()

    Call Teste

End Sub

Falta alguma coisa? Pois da esse erro 

 

image.thumb.png.e730400b1dc41d94573ba1a69f89664b.png

adicionado 18 minutos depois

@Charley Rocha Acho que resolvi aqui, coloquei como Public ao invés de Private.

Como eu disse no inicio, sou bem leigo em VBA, tenho noções básicas de programação em C e C++ daí alguma coisa eu até engano na hora de programar.

Agora só não sei o por que de Private não rodar e Public roda de boa

 

'Private' significa que a sua função/variável/sub é "privada", ou seja, só funciona no módulo em que ela está declarada.

 

'Public' significa que é "pública", ou seja, todos os módulos têm acesso a ela.

 

O erro estava acontecendo porque fora do módulo em que foi declarada a sua sub literalmente não existia.

 

Está tudo funcionando perfeitamente então?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Charley Rocha Estou fazendo os lançamentos dos documentos aqui e por enquanto está tudo rodando perfeitamente. Consegui alternar as abas, estou conseguindo alternar planilhas e a macro esta rodando certinho.

A outra macro do botão que copia e cola a linha 3 também não deu problema.

A princípio está tudo certo, caso apareça algum b.o. eu volto aqui.

Se o programa estivesse certo o Private Sub Worksheet_Activate() tinha funcionado desde o princípio.

Muito obrigado pela atenção e pela paciência. Até mais :D

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...