none
Como Ativar a ultima celula de uma Range Nomeada RRS feed

  • Pergunta

  • Bom dia

    Tenho uma Range nomeada, por exemplo Range("a1:a10") de ListaNomes e preciso ativar a ultima celula da Range nomeada. Se selecionar o ListaNomes, a celula a1 estara ativada e a ultima celula e a10, porem no decorre do processamento serao incluidos linhas dentro da Range nomeada e a ultima celula da Range nomeada nao e mais a10. Poderia gerar um outro nome como UltimaLinha, mas na planilha ja tem varias ranges nomeada e nao queria aumenta mais.

    Tem como ativar sempre a ultima celula da Range nomeada independente do seu tamanho com codigo VBA?

    Desde ja Agradecao a quem possa ajudar

    Tadao

    segunda-feira, 28 de março de 2016 12:02

Respostas

  • Range("teste") tenta acessar o intervalo do nome definido na planilha ativa.

    Em outras palavras, Range("teste") é equivalente a ActiveSheet.Range("teste").

    A melhor forma de previnir que isso aconteça é qualificar completamente o objeto a ser acessado. Substitua, por exemplo, Range("teste") por ThisWorkbook.Names("teste").RefersToRange que, independentemente da pasta de trabalho que estiver ativa, o código funcionará.

    Ou algo como mostrado abaixo, se a pasta de trabalho for externa:

    Sub Main()
        Dim wb As Workbook
        
        Set wb = Workbooks.Open("c:\caminho\teste.xlsx")
        With wb.Names("teste").RefersToRange
            Application.Goto .Cells(.Cells.CountLarge)
        End With
    End Sub
    


    http://www.ambienteoffice.com.br - http://www.clarian.com.br

    quarta-feira, 30 de março de 2016 14:19
    Moderador

Todas as Respostas

  • Sub Main()
        Dim TargetName As Name
        Dim GotoRange As Range
        
        Set TargetName = ThisWorkbook.Names("teste")
        Set GotoRange = TargetName.RefersToRange
        GotoRange.Cells(GotoRange.Cells.CountLarge).Select
    End Sub
    


    http://www.ambienteoffice.com.br - http://www.clarian.com.br

    • Sugerido como Resposta André Santo terça-feira, 29 de março de 2016 14:40
    segunda-feira, 28 de março de 2016 14:05
    Moderador
  • Ola Felipe, obrigado pelo, codigo. Testei aqui e funcionou beleza.

    Pelo seu codigo, tive oportunidade de pesquisar e aprender mais novos codigos VBA.

    Eu estava tentando resolver com :

    Range("teste").SpecialCells(xlCellTypeLastCell).Select

    mas ativava a ultima celula da planilha e nao da Range("teste").

    Estava pesquisando sobre ContLarge e vi que e similar ao Count porem conta ate 17.179.869.184.......da para colocar nome do tamanho da planilha,nao?

    Percebi o raciocinio (por favor corrija-me se estou errado) pelo seu codigo de que Range("teste").Cells.Cont conta o numero de celulas dentro da range de nome teste.

    Como o codigo Range("teste").Cells(n).Activate ativa a nezima celula dentro da Range("teste") , coloca no lugar de n o numero de celulas que tem a Range("teste") para ativar a ultima celula da Range("teste"), certo?

    Baseado no seu codigo, fiz uma variante para o meu caso que e mais simple pois a range nome tem so umas 60 celulas e gostaria de um parecer seu se possivel,se nao ira dar problemas futuras.

    No codigo usei o With como abaixo:

    Sub UltimaCelula()
    
    With Range("teste")
        .Cells(.Cells.Count).Activate
    End With
    
    End Sub
    


    terça-feira, 29 de março de 2016 14:22
  • Não é recomendável utilizar SpecialCells(xlCellTypeLastCell). Pode falhar algumas vezes, principalmente quando vocÊ apaga conteúdo de um lugar que antes havia conteúdo.

    ---

    Utilizo o CountLarge ao invés do Count porque se o seu intervalo for muito grande e possuir muitas células, pode dar um erro de estouro. CountLarge não dará esse erro, uma que vez que não retornará erro mesmo se seu intervalo cobrir todas as células da planilha.

    ---

    Sobre seu exemplo, a sintaxe está correta (mas, como eu disse, use CountLarge ao invés de Count - apenas detalhe).

    Um pouco melhor seria usar Application.Goto .Cells(.Cells.CountLarge), pois dessa forma, se você não estiver com a planilha onde o nome definido se encontra, não obterá erro.

    ---


    http://www.ambienteoffice.com.br - http://www.clarian.com.br

    terça-feira, 29 de março de 2016 15:03
    Moderador
  • Obrigado pelo parecer que tem dado Felipe. Vou usar o CountLarge para nao ter problemas futuras........mas o Application.Goto deu mensagem de erro de que e necessario uma funcao ou variavel....onde devo ter errado?Abaixo anexei a modificacao que usei (Sub UltimaCelula3()).

    Outra coisa de diferente que notei foi que a opcao 2, ou seja Sub UltimaCelula2() funciona bem na pasta de teste mas quando fui colocar na pasta real onde preciso usar,.......nao funcionou.......mas o Sub UltimaCelula1() funcionou sem problema......onde deve estar o erro?

    Sub UltimaCelula1()
        Dim TargetName As Name
        Dim GotoRange As Range
        Set TargetName = ThisWorkbook.Names("teste")
        Set GotoRange = TargetName.RefersToRange
        GotoRange.Cells(GotoRange.Cells.CountLarge).Select
        MsgBox "Executado Opcao1"
        Range("A1").Select
    End Sub
    '------------------------------------------------------
    Sub UltimaCelula2()
    
    With Range("teste")
        .Cells(.Cells.CountLarge).Activate
    End With
        MsgBox "Executado Opcao2"
        Range("A1").Select
    End Sub
    '------------------------------------------------------
    Sub UltimaCelula3()
    
    With Range("teste")
        Application.Goto.Cells(.Cells.CountLarge).Select
    End With
        MsgBox "Executado Opcao3"
        Range("A1").Select
    End Sub
    

    quarta-feira, 30 de março de 2016 01:04
  • Range("teste") tenta acessar o intervalo do nome definido na planilha ativa.

    Em outras palavras, Range("teste") é equivalente a ActiveSheet.Range("teste").

    A melhor forma de previnir que isso aconteça é qualificar completamente o objeto a ser acessado. Substitua, por exemplo, Range("teste") por ThisWorkbook.Names("teste").RefersToRange que, independentemente da pasta de trabalho que estiver ativa, o código funcionará.

    Ou algo como mostrado abaixo, se a pasta de trabalho for externa:

    Sub Main()
        Dim wb As Workbook
        
        Set wb = Workbooks.Open("c:\caminho\teste.xlsx")
        With wb.Names("teste").RefersToRange
            Application.Goto .Cells(.Cells.CountLarge)
        End With
    End Sub
    


    http://www.ambienteoffice.com.br - http://www.clarian.com.br

    quarta-feira, 30 de março de 2016 14:19
    Moderador
  • Oh, Felipe, desculpe o meu lapso, nao tinha deixado espaco entre o Application.GoTo "espaco" .Cells(.Cells.CountLarge), e por isso que estava dando erro. Outra coisa e que precisava mudar o With Range para With Name.

    Agora esta tudo Ok conforme abaixo, muito Obrigado.

    Tadao

    'Opcao 1
    Sub UltimaCelula1()
        Dim TargetName As Name
        Dim GotoRange As Range
        Set TargetName = ThisWorkbook.Names("teste")
        Set GotoRange = TargetName.RefersToRange
        GotoRange.Cells(GotoRange.Cells.CountLarge).Select
        MsgBox "Selecionada a ultima celula da Range Nomeada", vbInformation, "Executado Opcao1"
        ActiveCell.EntireRow.Select
        MsgBox "Selecionada a ultima linha da Range Nomeada", vbInformation, "Executado Opcao1"
        Selection.Insert
        MsgBox "Inserida uma linha na ultima celula da Range Nomeada", vbInformation, "Executado Opcao1"
        Range("A1").Select
    End Sub
    '------------------------------------------------------
    'Opcao 2
    Sub UltimaCelula2()
    Dim wb As Workbook
    Set wb = ThisWorkbook
    
    With Range("teste")
        .Cells(.Cells.CountLarge).Activate
    End With
        MsgBox "Selecionada a ultima celula da Range Nomeada", vbInformation, "Executado Opcao2"
        Range("A1").Select
    End Sub
    '------------------------------------------------------
    'Opcao 3
    Sub UltimaCelula3()
    Dim wb As Workbook
    Set wb = ThisWorkbook 'ou Workbooks.Open("c:\caminho\teste.xlsx")
    
    With wb.Names("teste").RefersToRange
        Application.Goto .Cells(.Cells.CountLarge)
    End With
        MsgBox "Selecionada a ultima celula da Range Nomeada", vbInformation, "Executado Opcao3"
        Range("A1").Select
    End Sub
    '----

    quinta-feira, 31 de março de 2016 04:16