Notifications
Clear all

Referência Absoluta em VBA

12 Posts
2 Usuários
0 Reactions
1,993 Visualizações
(@godegodes)
Posts: 0
New Member
Topic starter
 

Boa tarde Galera,

Estou com uma duvida sobre referência absoluta...
Vamos lá. Criei uma planilha onde através de botões e macros eu oculto/mostro linhas.
Porém a planilha contem 10 botões e durante um determinado trabalho eu precisarei inserir linhas nesse grupo de linhas que são ocultadas pelo botão.
Ao inserir linhas a operação de ocultar/exibir fica errada, pois o meu intervalo é fixo....segue o vba para que fique mais claro...

Private Sub schneider_Click()

If Range("51:76,348:348,357:358").EntireRow.Hidden = False Then
Range("51:76,348:348,357:358").EntireRow.Hidden = True
ElseIf Range("51:76,348:348,357:358").EntireRow.Hidden = True Then
Range("51:76,348:348,357:358").EntireRow.Hidden = False

End If

End Sub

Private Sub servidoracessorios_Click()

If Rows("20:32").EntireRow.Hidden = False Then
Rows("20:32").EntireRow.Hidden = True
ElseIf Rows("20:32").EntireRow.Hidden = True Then
Rows("20:32").EntireRow.Hidden = False

End If

End Sub

Private Sub cadast_Click()

If Rows("33:50").EntireRow.Hidden = False Then
Rows("33:50").EntireRow.Hidden = True
ElseIf Rows("33:50").EntireRow.Hidden = True Then
Rows("33:50").EntireRow.Hidden = False
End If

End Sub

A questão é como eu torno o intervalo uma referência absoluta, que ao inserir linhas dentro do intervalo as funções seguintes possam se "adaptar" também?
Na planilha do excel podemos resolver facilmente apertando F4, mas no vba ainda não achei uma solução....alguem me ajuda?

 
Postado : 28/08/2015 11:47 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

gode, pelo que entendi você quer endereços dinamicos, o que conseguimos atraves do VBA por algumas alternativas, tipo UsedRange, ou localizar a última celula preenchida e usar para montar o range, só que analisando somente as rotinas que postou em duas delas poderia definir uma metodologia, pois temos o parametro fixo incial que seriam o 20 na Sub servidoracessorios e o 33 na Sub cadast, mas na "Sub schneider" temos numeros salteados "51:76,348:348,357:358" o que dificultaria.
como não sei como insere as linhas e se conteem algum dado, minha sugestão seria no momento em que lançar ou inserir linhas ter uma coluna auxiliar a qual seria marcado com um "x" já no lançamento se esta linha deverá ser oculta ou não e depois ajustar uma rotina que oculte as linhas que contenham o "x" ou tambem utilizando o filtro avançado.
Se não é bem isto que entendi, forneça mais detalhes, assim podemos analisar melhor.

[]s

 
Postado : 28/08/2015 12:51 pm
(@godegodes)
Posts: 0
New Member
Topic starter
 

Mauro...

Vou tentar explicar de outra forma, acho que ficou meio confuso mesmo....

Hoje eu tenho uma planilha com vário botões que ocultam/exibem várias linhas (vide imagem abaixo).

As linhas que cada botão oculta/exibe são sequenciais, por exemplo.

Botão 1
oculta/exibe as linhas de 20 até 30

Botão 2
oculta/exibe as linhas de 31 até 76

Botão 3
oculta/exibe as linhas de 77 até 93

etc etc....tenho vários botões.

Agora o problema -> Vamos supor que eu queira inserir um linha na Range do botão 1, então eu vou na planilha e insiro uma linha manualmente, ou seja, agora o meu intervalo deve ser da linha 20 até a linha 31, e o botão 2 deve ser da linha 32 até a linha 77 e assim por diante. Como eu faço para esse ajuste de linha ser automático?
Hoje eu tenho que entrar manualmente em cada uma das macros e adicionar a quantidade de linhas que adicionei naquele intervalo e nos intervalos seguintes, é muito trabalhoso se pensar que em uma das planilhas eu tenho 30 botões.

Só para exemplificar o que eu gostaria.
Se você tem duas planilhas e link um determinada célula da planilha 1 na planilha 2 você tem a seguinte fórmula: =Plan1!$B$2, como eu estou usando referência absoluta mesmo que eu insira linhas antes desta célula a fórmula estará sempre correta.

Ficou mais claro minha duvida?
Caso não eu reescrevo sem problemas...

Obrigado

 
Postado : 28/08/2015 1:30 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Pelo que postou agora se qdo acrescenta linha da forma que disse, mesmo adicionando a linha ou linhas manualmente da para atraves de rotina capturar a ultima linha e jogar em uma variável, era o que eu mais ou menos estava supondo, só que como ficaria as linhas do Botão :
Private Sub schneider_Click() - If Range("51:76,348:348,357:358") onde a numeração é pulada.

Se possível anexe um modelo reduzido e compactado de acordo com as regras do forum e se for necessário altere os dados para uma melhor analise, só por imagem ficamos em suposições somente.
Agora já estou saindo, e se der mais tarde em casa dou uma olhada.
[]s

 
Postado : 28/08/2015 1:54 pm
(@godegodes)
Posts: 0
New Member
Topic starter
 

Segue planilha simplificada conforme solicitado....
Vamos ver se consegue me ajudar.. :)

Abraço

 
Postado : 28/08/2015 2:33 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Segue planilha simplificada conforme solicitado....
Vamos ver se consegue me ajudar.. :)

Abraço

gode,
Primeiro: o seu arquivo devria estar compactado de acordo com as regras do forum conforme citei, por isto exclui, de uma olhada nas regras :
viewtopic.php?f=7&t=203
• Upload
Devido a ultrapassagem da marca de 1,5Gb de armazenamento de arquivos na hospedagem do Planilhando,
limitaremos o tamanho de cada arquivo para 2Mb sendo obrigatório o uso dos formatos .zip - .rar - .ice visto
a gratuidade e não geração de recursos para bancar o site.

Segundo : Qual versão do excel está utilizando ? O arquivo dava mensagem de erro, de objeto ausente;

Terceiro : Deve estar faltando alguma aba, a que esta sendo referenciada na função Procv;

Quarto : O projeto está protegido com Senha.

Quinto : Você não respondeu sobre a questão que coloquei referente ao Botão "Private Sub schneider_Click()" - If Range("51:76,348:348,357:358") onde a numeração é pulada.

Assim fica dificil conseguir ajudar, lembre-se que você tem conhecimento do que quer e nós é a primeira vez que temos contato, então quanto mais detalhe tiver melhor.

[]s

 
Postado : 28/08/2015 8:35 pm
(@godegodes)
Posts: 0
New Member
Topic starter
 

Mauro,

Desculpe-me as falhas...

Vamos lá...

Segue o arquivo novamente compactado conforme regra do fórum.
Preciso que o arquivo funcione no excel 2010 e 2013 Uso o 2010 no meu pc.
O erro de objeto eu já arrumei, era um código que esqueci de apagar quando gerei esta planilha teste simplificada.
Retirei a proteção do código.
Esqueça a numeração alternada. Se resolvermos na numeração sequencial conforme planilha em anexo eu aplico no resto. :)

Atenciosamente,

 
Postado : 31/08/2015 6:39 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Se entendi, segue uma possibilidade (somente servidor acessórios), mas se for isso, pode ser estendida/adaptada para os demais.

Private Sub servidoracessorios_Click()
Dim nLSA As Integer
nLSA = Application.Match("TERMINAL*", Sheets("TESTE").Range("A20:A200"), 0) + 18
    If Rows("20:" & nLSA).EntireRow.Hidden = False Then
        Rows("20:" & nLSA).EntireRow.Hidden = True
    ElseIf Rows("20:" & nLSA).EntireRow.Hidden = True Then
        Rows("20:" & nLSA).EntireRow.Hidden = False
    End If
End Sub
 
Postado : 31/08/2015 8:43 am
(@godegodes)
Posts: 0
New Member
Topic starter
 

Bom dia Reinaldo,

Perfeito cara, era exatamente isso que eu queria.
Se não for pedir d+, você poderia me explicar as linhas de programação que você fez?
Desde já agradeço muito.

Abraço

Gode editei sua mensagem, pois quem lhe enviou a rotina não fui eu e sim o colega Reinaldo, então não se esqueça de clicar na mãozinha agradecendo o mesmo.

 
Postado : 31/08/2015 9:01 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

A função Match (Corresp na aplicação em português) localiza e retorna a posição (numero) onde foi localizado o Texto. Adicionado 18 para "compensar" o inicio na linha 20. No mais e incluir a variável com o numero nos if's correspondentes.

Pode ser utilizado assim tambem:

Private Sub servidoracessorios_Click()
Dim nLSA As Integer
nLSA = Application.Match("TERMINAL*", Sheets("TESTE").Range("A1:A200"), 0) - 1
    If Rows("20:" & nLSA).EntireRow.Hidden = False Then
        Rows("20:" & nLSA).EntireRow.Hidden = True
    ElseIf Rows("20:" & nLSA).EntireRow.Hidden = True Then
        Rows("20:" & nLSA).EntireRow.Hidden = False
    End If
End Sub
Private Sub cadast_Click()
Dim nLSA As Integer
nLSA = Application.Match("SOLUÇÃO*", Sheets("TESTE").Range("A1:A200"), 0) - 1
    If Rows("33:" & nLSA).EntireRow.Hidden = False Then
        Rows("33:" & nLSA).EntireRow.Hidden = True
    ElseIf Rows("33:" & nLSA).EntireRow.Hidden = True Then
        Rows("33:" & nLSA).EntireRow.Hidden = False
    End If
End Sub
 
Postado : 31/08/2015 11:22 am
(@godegodes)
Posts: 0
New Member
Topic starter
 

Trabalhei no código que o amigo Reinaldo postou....e ainda tenho problemas.

Vamos lá...

A planilha anexa já está com o código que o Reinaldo sugeriu, porém o problema ainda persiste.

Olha só...

Pegue a planilha anexa e insira, por exemplo, 5 linhas na linha 26.
O intervalo chamado "SERVIDOR E ACESSÓRIOS" passa agora a ser da linha 20 até a linha 37.
Até aí está tudo ok, o botão correspondente "Servidor e Acessórios" continua funcionando corretamente, pois pela fórmula e vai buscar o próximo subtítulo "SOLUÇÃO SCHNEIDER", porém o próximo botão fica totalmente errado, adicionamos 5 linhas e o seu intervalo que seria ocultado/exibido também deveria ser acrescido e isso não acontece, pois o come da fórmula é um valor fixo.

Como resolver isso?

 
Postado : 31/08/2015 12:04 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Assim então
(Considerando que o primeiro item "SERVIDOR E ACESSÓRIOS" inicia sempre na linha 20)

Private Sub servidoracessorios_Click()
Dim nLSA As Integer

nLSA = Application.Match("TERMINAL*", Sheets("TESTE").Range("A1:A2000"), 0) - 1
    If Rows("20:" & nLSA).EntireRow.Hidden = False Then
        Rows("20:" & nLSA).EntireRow.Hidden = True
    ElseIf Rows("20:" & nLSA).EntireRow.Hidden = True Then
        Rows("20:" & nLSA).EntireRow.Hidden = False
    End If
End Sub
Private Sub cadast_Click()
Dim nLSA As Integer, iLSA As Integer
iLSA = Application.Match("TERMINAL*", Sheets("TESTE").Range("A1:A2000"), 0)

nLSA = Application.Match("SOLUÇÃO SCHNEIDER*", Sheets("TESTE").Range("A1:A2000"), 0) - 1
    If Rows(iLSA & ":" & nLSA).EntireRow.Hidden = False Then
        Rows(iLSA & ":" & nLSA).EntireRow.Hidden = True
    ElseIf Rows(iLSA & ":" & nLSA).EntireRow.Hidden = True Then
        Rows(iLSA & ":" & nLSA).EntireRow.Hidden = False
    End If
End Sub
Private Sub schneider_Click()
Dim nLSA As Integer, iLSA As Integer
iLSA = Application.Match("SOLUÇÃO SCHNEIDER*", Sheets("TESTE").Range("A1:A2000"), 0)

nLSA = Application.Match("SOLUÇÃO SCAIP*", Sheets("TESTE").Range("A1:A2000"), 0) - 1
    If Rows(iLSA & ":" & nLSA).EntireRow.Hidden = False Then
        Rows(iLSA & ":" & nLSA).EntireRow.Hidden = True
    ElseIf Rows(iLSA & ":" & nLSA).EntireRow.Hidden = True Then
        Rows(iLSA & ":" & nLSA).EntireRow.Hidden = False
    End If
End Sub
 
Postado : 31/08/2015 12:18 pm