Notifications
Clear all

Memorizar o endereço da celula ativa.

15 Posts
4 Usuários
0 Reactions
4,568 Visualizações
(@renatoddd)
Posts: 70
Trusted Member
Topic starter
 

Amigos, bom dia.

Preciso rodar uma macro. Ela já funciona mas, ao final de sua execução, quero fazer uma melhoria.

Ao executar, alguma celula estará ativa.
Quero memorizar este endereço de celula, executar o código e, ao final, selecionar novamente a célula que estava ativa no momento do acinamento da macro.

Não tenho a menor ideia de como se faz isso.

Exemplo:
A célula A57 está selecionada.
Vou executar a macro. (parte do código, faz com que outras células sejam selecionadas durante a execução).
Ao final, quero selecionar a célula A57.
Obs. a célula ativa no momento do acinamento da Macro, pode ser qualquer uma). Não é uma constante.

Alguém sabe como fazer isto ?
Muito obrigado por sua ajuda.

 
Postado : 25/09/2014 6:52 am
(@gtsalikis)
Posts: 2373
Noble Member
 

seria isso:

Sub teste()

Dim celula_ativa As Range

Set celula_ativa = ActiveCell

'seu código

celula_ativa.Select

End Sub

Lembre-se de AGRADECER aos que te ajudaram, e de marcar o tópico como [Resolvido]
Gente que cuida de gente.

Gilmar

 
Postado : 25/09/2014 7:05 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Pelo que entendi, você já tem uma rotina em execução, o ideal seria ter postado a mesma para uma analise melhor, mas veja se é isto:

Sub RetornarParaCelulaAtiva()

    Dim sCelAtiva
    
    'Armazena o Endereço da celula Ativa no momento
    'da execução da rotina
    sCelAtiva = ActiveCell.Address(0, 0)
    
        'Executa outras ações
        'Aqui entra suas instruções
         Range("B20").Select
    
    'Volta a Celula que estava ativa qdo a rotina foi executada
    Range(sCelAtiva).Activate

End Sub

[]s

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 25/09/2014 7:07 am
(@renatoddd)
Posts: 70
Trusted Member
Topic starter
 

mauro, bom dia.

Rapaz, seu código é ótimo mas, não expliquei de forma correta.

Estou na aba "Plan1", que é uma banco de dados com a relação de funcionários.
Vou rodar um código que pega o cargo do funcionário da linha ativa,
Vai para "Plan2" e lista na Plan2, todos os funcionários cadastrados na Plan1, que tem o mesmo cargo.
"Agora vem o que eu preciso"
Na Plan2, coloquei um botão de VOLTAR para Plan1.
Quando eu apertar este botão, quero voltar para Plan1 e selecionar a célula que estava selecionada quando rodei a macro.

Então, quando faço o caminho de ida, salvo o o endereço da celula ativa na variável.
Quando faço o caminho de volta, onde devo inserir o código "Range(sCelAtiva).Activate" ?

Muito obrigado !

Pelo que entendi, você já tem uma rotina em execução, o ideal seria ter postado a mesma para uma analise melhor, mas veja se é isto:

Sub RetornarParaCelulaAtiva()

    Dim sCelAtiva
    
    'Armazena o Endereço da celula Ativa no momento
    'da execução da rotina
    sCelAtiva = ActiveCell.Address(0, 0)
    
        'Executa outras ações
        'Aqui entra suas instruções
         Range("B20").Select
    
    'Volta a Celula que estava ativa qdo a rotina foi executada
    Range(sCelAtiva).Activate

End Sub

[]s

 
Postado : 25/09/2014 7:24 am
(@renatoddd)
Posts: 70
Trusted Member
Topic starter
 

Oi, me virando aqui, eu quase consegui que quero fazer.

Preciso apenas do seguinte:
Esta na Plan2
Ao clicar num botão, ele pega o valor da range("k5"), vai para Plan1 e seleciona a célula cujo valor esta range("k5") lá da Plan2.

Como pegar o valor digitado em K5, por ex: em K5, está digitado "D6". Então, ele lê o conteudo de K5, que no caso é "D6" e seleciona acélula D6.
Em K5, vai estar digitado o endereço da celula que deve ser selecionada.

=D
meu caro, veja se consegue isto por favor. Vai ficar ótimo.
Muito obrigado mesmo.
:D

Pelo que entendi, você já tem uma rotina em execução, o ideal seria ter postado a mesma para uma analise melhor, mas veja se é isto:

Sub RetornarParaCelulaAtiva()

    Dim sCelAtiva
    
    'Armazena o Endereço da celula Ativa no momento
    'da execução da rotina
    sCelAtiva = ActiveCell.Address(0, 0)
    
        'Executa outras ações
        'Aqui entra suas instruções
         Range("B20").Select
    
    'Volta a Celula que estava ativa qdo a rotina foi executada
    Range(sCelAtiva).Activate

End Sub

[]s

 
Postado : 25/09/2014 7:38 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Renato, estou confuso, antes de continuar preciso entender o que pretende, estou me baseando somente em suposição :

No primeiro Post você pretendia :
1) Armazenar em uma Variável a Celula Ativa
2) Selecionar uma outra celula;
3) Apos Retornar a Celula que ficou armazenada na Variável.

Ok,. até ai, tanto a rotina que postei quanto ao do colega gtsalikis realizam este procedimento uma vez que esteja realizando alteração na propria aba.

Agora é que você complicou :
Estou na aba "Plan1", que é uma banco de dados com a relação de funcionários.
Vou rodar um código que pega o cargo do funcionário da linha ativa :

Você não havia comentado Cargo e sim Endereço da celula que é executado pela linha abaixo.
sCelAtiva = ActiveCell.Address(0, 0)

Vai para "Plan2" e lista na Plan2, todos os funcionários cadastrados na Plan1, que tem o mesmo cargo.
Não compreendi a questão de listar na Plan2 todos os funcionários cadastrados na Plan1, que tem o mesmo cargo.

"Agora vem o que eu preciso"
Na Plan2, coloquei um botão de VOLTAR para Plan1.
Quando eu apertar este botão, quero voltar para Plan1 e selecionar a célula que estava selecionada quando rodei a macro.

Nesta parte, como você saiu da Plan1 para a Plan2 sem ter efetuado nenhuma alteração na Plan1, ao retornar para Plan1 a Celula que vai estar selecionada é a celula que estava ativa quando saiu da mesma, não sendo necessário armazenarmos esta Variável.

Agora aqui você complicou mais ainda:
Esta na Plan2
Ao clicar num botão, ele pega o valor da range("k5"), vai para Plan1 e seleciona a célula cujo valor esta range("k5") lá da Plan2.

Como vai para Plan1 e seleciona o Valor que está em K5 se acima quer que vá para Plan1 e selecione a celula que estava ativa ?

Como pegar o valor digitado em K5, por ex: em K5, está digitado "D6". Então, ele lê o conteudo de K5, que no caso é "D6" e seleciona a célula D6.
Em K5, vai estar digitado o endereço da celula que deve ser selecionada.

Nesta parte vejo que não precisa mais da Variavel da celula que estava ativa na Plan1 uma vez que quer que vá para o endereço armazenado na celula da Plan2 - K5 = (D6), ficou estranho.

De qualquer forma para captar o valor em "K5" (D6) e utilizar este valor como referencia de Range pode utilizar as seguintes instruções:

Dim sRg_Plan2
Sheets("Plan2").Activate

sRg_Plan2 = Range("K5").Value

        With Sheets("Plan1")
            .Activate
            Range(sRg_Plan2).Activate
        End With

Como pode ver sua explicação está um pouco confusa, lembre-se de que você sabe o que quer e nós temos de procurar entender pois não lidamos com o aplicativo que está criando.

[]s

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 25/09/2014 12:45 pm
(@edcronos)
Posts: 1006
Noble Member
 

colocar confuso nisso deu até nó no raciocínio
o ideal seria postar um planilha de exemplo com alguns dados e explicar melhor oq vc quer fazer

os métodos de endereços :

    Np = ActiveSheet.Name    'memoriza o nome da planilha atual

    Colu = Selection.Column    'memoriza coluna selecionada
    Lini = Selection.Row          'memoriza linha selecionada

    ca = ActiveCell.Column    'memoriza coluna da celula ativa
    cl = ActiveCell.Row          'memoriza linha da celula ativa
    cd = ActiveCell.Address    'memoriza edereço completo da celula ativa

se vc quer marcar uma celula e a planilha atual para voltar para ela pode fazer assim

Sub exemp()
Np = ActiveSheet.Name 'memoriza nome da plan (aba) ativa
cd = ActiveCell.Address 'memoriza endereço da celula ativa

'resto da macro

Sheets(Np).Activate   'volta para a planilha que estava
Range(cd).Activate    'seleciona a celula

End Sub

para selecionar a mesma linha da célula ativa na outra plan :
cl = ActiveCell.Row 'memoriza linha da celula ativa

sheets("nomeplan").cells(cl,"B").Select 'seleciona a coluna "B" e a linha da celula ativa "cl"

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 25/09/2014 4:08 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Se vc evitar usar o .Select e o .Activate, para trocar planilha ou para selecionar endereços, a célula ativa nunca mudará e vc a manterá ativa ao final do processo...

Vai por mim, é o melhor a fazer!

FF

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 26/09/2014 1:32 pm
(@renatoddd)
Posts: 70
Trusted Member
Topic starter
 

Mauro, obrigado pelo empenho meu amigo.

Então, vou explicar o que preciso desde o zero.

Há um arquivo com duas Abas, vou chamar de Plan1 e Plan2.

Na plan1, há 1000 funcionários, cada um com seu cargo, salário, área, etc....
Quero fazer o seguinte:
1 - Vou escolher um funcionário. Como ? Bem, selecionando a celula onde esta seu nome.
Imagine que na linha 57, esta o funcionário de nome Marcelo, que é Analista Contábil.
Então, eu seleciono uma celula qualquer na linha 57. (por exemplo, selecionei a célula B57.
2 - Executar a macro.
3 - A macro pula da coluna ativa, para a coluna CARGO.
4 - Checa que cargo é este. (da celula ativa), (guarde o nome desde cargo numa variável. Neste exemplo, "Analista Contábil".
5 - Seleciona a Plan2
6 - Lista em Plan2, todos os funcionários, que tenham o cargo "checado". Neste caso, apenas quem for "Analista Contábil".
7 - Volte para Plan1, e selecione a mesma célula que estava celecionada, quando executei a macro. No caso, B57

Com as dicas que vocês me passaram, pegando um pouco de cada, eu cosegui fazer o que preciso. Esta tudo funcionando.
Só tive que dar umas "marretadas". No fundo, sei que há uma forma adequada de fazer o que preciso. Sei que vcs fariam de uma forma mais eficiente.
Mas, no fim, deu certo. Cheguei ao resultado e lhes sou muito grato pela ajuda.

Um grande abraço meu caro, valeu mesmo.

Renato, estou confuso, antes de continuar preciso entender o que pretende, estou me baseando somente em suposição :

No primeiro Post você pretendia :
1) Armazenar em uma Variável a Celula Ativa
2) Selecionar uma outra celula;
3) Apos Retornar a Celula que ficou armazenada na Variável.

Ok,. até ai, tanto a rotina que postei quanto ao do colega gtsalikis realizam este procedimento uma vez que esteja realizando alteração na propria aba.

Agora é que você complicou :
Estou na aba "Plan1", que é uma banco de dados com a relação de funcionários.
Vou rodar um código que pega o cargo do funcionário da linha ativa :

Você não havia comentado Cargo e sim Endereço da celula que é executado pela linha abaixo.
sCelAtiva = ActiveCell.Address(0, 0)

Vai para "Plan2" e lista na Plan2, todos os funcionários cadastrados na Plan1, que tem o mesmo cargo.
Não compreendi a questão de listar na Plan2 todos os funcionários cadastrados na Plan1, que tem o mesmo cargo.

"Agora vem o que eu preciso"
Na Plan2, coloquei um botão de VOLTAR para Plan1.
Quando eu apertar este botão, quero voltar para Plan1 e selecionar a célula que estava selecionada quando rodei a macro.

Nesta parte, como você saiu da Plan1 para a Plan2 sem ter efetuado nenhuma alteração na Plan1, ao retornar para Plan1 a Celula que vai estar selecionada é a celula que estava ativa quando saiu da mesma, não sendo necessário armazenarmos esta Variável.

Agora aqui você complicou mais ainda:
Esta na Plan2
Ao clicar num botão, ele pega o valor da range("k5"), vai para Plan1 e seleciona a célula cujo valor esta range("k5") lá da Plan2.

Como vai para Plan1 e seleciona o Valor que está em K5 se acima quer que vá para Plan1 e selecione a celula que estava ativa ?

Como pegar o valor digitado em K5, por ex: em K5, está digitado "D6". Então, ele lê o conteudo de K5, que no caso é "D6" e seleciona a célula D6.
Em K5, vai estar digitado o endereço da celula que deve ser selecionada.

Nesta parte vejo que não precisa mais da Variavel da celula que estava ativa na Plan1 uma vez que quer que vá para o endereço armazenado na celula da Plan2 - K5 = (D6), ficou estranho.

De qualquer forma para captar o valor em "K5" (D6) e utilizar este valor como referencia de Range pode utilizar as seguintes instruções:

Dim sRg_Plan2
Sheets("Plan2").Activate

sRg_Plan2 = Range("K5").Value

        With Sheets("Plan1")
            .Activate
            Range(sRg_Plan2).Activate
        End With

Como pode ver sua explicação está um pouco confusa, lembre-se de que você sabe o que quer e nós temos de procurar entender pois não lidamos com o aplicativo que está criando.

[]s

 
Postado : 30/09/2014 2:12 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Aqui que é o confuso pra mim:
1 - Vou escolher um funcionário. Como ? Bem, selecionando a celula onde esta seu nome.
Imagine que na linha 57, esta o funcionário de nome Marcelo, que é Analista Contábil.
Então, eu seleciono uma celula qualquer na linha 57. (por exemplo, selecionei a célula B57.
2 - Executar a macro.
3 - A macro pula da coluna ativa, para a coluna CARGO.
4 - Checa que cargo é este. (da celula ativa), (guarde o nome desde cargo numa variável. Neste exemplo, "Analista Contábil".
5 - Seleciona a Plan2
6 - Lista em Plan2, todos os funcionários, que tenham o cargo "checado". Neste caso, apenas quem for "Analista Contábil".
7 - Volte para Plan1, e selecione a mesma célula que estava selecionada, quando executei a macro. No caso, B57

Esta movimentação (em negrito) é completamente desnecessária a partir do VBA.
Assim a tela nem piscaria e o conteúdo de Plan2 seria o que vc está querendo...

Mas se já funcionou e te satisfez, blz...

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 30/09/2014 2:22 pm
(@renatoddd)
Posts: 70
Trusted Member
Topic starter
 

Olá amigo, bom dia.

Sua ajuda foi de fundamental importância para a resolução do meu caso.
Eu sei um pouco de VBA mas não o suficiente para fazer coisas mais complexas.
Então, as vezes dou uma "pernada". Faço de um jeito não tão adequado mas, no final, acaba funcionando.
Te agradeço imensamente pelo empenho em me ajudar meu caro.
Como sempre foi foi nota 10.
Se precisar de algo em photoshop é só me chamar.
Grande abraço.
No fim das contas, pegando as dicas que vcs deram, o resultado ficou como eu queria.

valeuuuuu ! ! ! ! ! !

Renato, estou confuso, antes de continuar preciso entender o que pretende, estou me baseando somente em suposição :

No primeiro Post você pretendia :
1) Armazenar em uma Variável a Celula Ativa
2) Selecionar uma outra celula;
3) Apos Retornar a Celula que ficou armazenada na Variável.

Ok,. até ai, tanto a rotina que postei quanto ao do colega gtsalikis realizam este procedimento uma vez que esteja realizando alteração na propria aba.

Agora é que você complicou :
Estou na aba "Plan1", que é uma banco de dados com a relação de funcionários.
Vou rodar um código que pega o cargo do funcionário da linha ativa :

Você não havia comentado Cargo e sim Endereço da celula que é executado pela linha abaixo.
sCelAtiva = ActiveCell.Address(0, 0)

Vai para "Plan2" e lista na Plan2, todos os funcionários cadastrados na Plan1, que tem o mesmo cargo.
Não compreendi a questão de listar na Plan2 todos os funcionários cadastrados na Plan1, que tem o mesmo cargo.

"Agora vem o que eu preciso"
Na Plan2, coloquei um botão de VOLTAR para Plan1.
Quando eu apertar este botão, quero voltar para Plan1 e selecionar a célula que estava selecionada quando rodei a macro.

Nesta parte, como você saiu da Plan1 para a Plan2 sem ter efetuado nenhuma alteração na Plan1, ao retornar para Plan1 a Celula que vai estar selecionada é a celula que estava ativa quando saiu da mesma, não sendo necessário armazenarmos esta Variável.

Agora aqui você complicou mais ainda:
Esta na Plan2
Ao clicar num botão, ele pega o valor da range("k5"), vai para Plan1 e seleciona a célula cujo valor esta range("k5") lá da Plan2.

Como vai para Plan1 e seleciona o Valor que está em K5 se acima quer que vá para Plan1 e selecione a celula que estava ativa ?

Como pegar o valor digitado em K5, por ex: em K5, está digitado "D6". Então, ele lê o conteudo de K5, que no caso é "D6" e seleciona a célula D6.
Em K5, vai estar digitado o endereço da celula que deve ser selecionada.

Nesta parte vejo que não precisa mais da Variavel da celula que estava ativa na Plan1 uma vez que quer que vá para o endereço armazenado na celula da Plan2 - K5 = (D6), ficou estranho.

De qualquer forma para captar o valor em "K5" (D6) e utilizar este valor como referencia de Range pode utilizar as seguintes instruções:

Dim sRg_Plan2
Sheets("Plan2").Activate

sRg_Plan2 = Range("K5").Value

        With Sheets("Plan1")
            .Activate
            Range(sRg_Plan2).Activate
        End With

Como pode ver sua explicação está um pouco confusa, lembre-se de que você sabe o que quer e nós temos de procurar entender pois não lidamos com o aplicativo que está criando.

[]s

 
Postado : 09/10/2014 4:42 am
(@renatoddd)
Posts: 70
Trusted Member
Topic starter
 

Olá, bom dia.

Gostaria de agradecer.
Sua ajuda e atenção foram fundamentais para a resolução do meu caso.
Consegui chegar onde eu queria.
Muito obrigado amigo !

seria isso:

Sub teste()

Dim celula_ativa As Range

Set celula_ativa = ActiveCell

'seu código

celula_ativa.Select

End Sub
 
Postado : 09/10/2014 4:44 am
(@renatoddd)
Posts: 70
Trusted Member
Topic starter
 

Mauro, bom dia.

Obrigado meu amigo. Com a sua ajuda e a dos demais amigos, consegui fazer o que eu pretendia.
Vocês são nota 10.

Pelo que entendi, você já tem uma rotina em execução, o ideal seria ter postado a mesma para uma analise melhor, mas veja se é isto:

Sub RetornarParaCelulaAtiva()

    Dim sCelAtiva
    
    'Armazena o Endereço da celula Ativa no momento
    'da execução da rotina
    sCelAtiva = ActiveCell.Address(0, 0)
    
        'Executa outras ações
        'Aqui entra suas instruções
         Range("B20").Select
    
    'Volta a Celula que estava ativa qdo a rotina foi executada
    Range(sCelAtiva).Activate

End Sub

[]s

 
Postado : 09/10/2014 4:45 am
(@renatoddd)
Posts: 70
Trusted Member
Topic starter
 

Oi, bom dia.

Rapaz, me desculpe. Não consegui ser claro na explicação.
Mas, no final, pegando as dicas e códigos que me enviaram, eu consegui fazer o que eu pretendia.
Então, sou muito grato a você e aos demais amigos do fórum.

Grande abraço e obrigado !

colocar confuso nisso deu até nó no raciocínio
o ideal seria postar um planilha de exemplo com alguns dados e explicar melhor oq vc quer fazer

os métodos de endereços :

    Np = ActiveSheet.Name    'memoriza o nome da planilha atual

    Colu = Selection.Column    'memoriza coluna selecionada
    Lini = Selection.Row          'memoriza linha selecionada

    ca = ActiveCell.Column    'memoriza coluna da celula ativa
    cl = ActiveCell.Row          'memoriza linha da celula ativa
    cd = ActiveCell.Address    'memoriza edereço completo da celula ativa

se vc quer marcar uma celula e a planilha atual para voltar para ela pode fazer assim

Sub exemp()
Np = ActiveSheet.Name 'memoriza nome da plan (aba) ativa
cd = ActiveCell.Address 'memoriza endereço da celula ativa

'resto da macro

Sheets(Np).Activate   'volta para a planilha que estava
Range(cd).Activate    'seleciona a celula

End Sub

para selecionar a mesma linha da célula ativa na outra plan :
cl = ActiveCell.Row 'memoriza linha da celula ativa

sheets("nomeplan").cells(cl,"B").Select 'seleciona a coluna "B" e a linha da celula ativa "cl"

 
Postado : 09/10/2014 4:47 am
(@renatoddd)
Posts: 70
Trusted Member
Topic starter
 

Agradeço a todos os que me ajudaram.

Não consegui ser claro na explicação do que eu pretendia mas, mesmo assim, com sua ajuda e dedicação, consegui montar um conjunto de códigos que resolveu meu caso.

Muito obrigado a todos.
É muito bom poder contar com pessoas como vocês.

Minha imensa gratidão aos que responderam e aos administradores do fórum.

 
Postado : 09/10/2014 4:49 am