Mostrar números de páginas dentro das células

Oi caros leitores.
Hoje falo sobre um assunto que ‘penei’ um pouco para aprender como fazer: Exibir, como conteúdo de uma célula, o número da página ou total de páginas de uma planilha. O Excel mostra este mesmo tipo de informação apenas na ferramenta Cabeçalho/Rodapé.
Sei que em muitos casos essa função seria extremamente útil, talvez não para exibir o resultado na célula, mas para utilizar internamente nas suas rotinas de tratamento para as mais variadas funções de suas macros.
Vou mostrar como obter esta informação, que você poderá adaptá-la como preferir em suas macros.
Primeiramente, acesse o ambiente VBA (ALT+F11).
Insira um módulo.
Escreva as funções abaixo:
Para Exibir o Número da Página Atual da Planilha

Public Function NumeroDaPagina(Optional ByRef rng As Excel.Range) As Variant
Dim pbHorizontal As HPageBreak
Dim pbVertical As VPageBreak
Dim nHorizontalPageBreaks As Long
Dim nVerticalPageBreaks As Long
Dim nNumeroDaPagina As Long
On Error GoTo ErrHandler
    'Application.Volatile   'Você pode utilizar esta linha de comando para atualizar
                            'automaticamente a cada alteração (TORNA UM POUCO LENTO)
                            'Para utilizá-la basta desmarcar como comentário (')
    If rng Is Nothing Then _
    Set rng = Application.Caller
    With rng
        If .Parent.PageSetup.Order = xlDownThenOver Then
            nHorizontalPageBreaks = .Parent.HPageBreaks.Count + 1
            nVerticalPageBreaks = 1
        Else
            nHorizontalPageBreaks = 1
            nVerticalPageBreaks = .Parent.VPageBreaks.Count + 1
        End If
        nNumeroDaPagina = 1
        For Each pbHorizontal In .Parent.HPageBreaks
            If pbHorizontal.Location.Row > .Row Then Exit For
            nNumeroDaPagina = nNumeroDaPagina + nVerticalPageBreaks
        Next pbHorizontal
        For Each pbVertical In .Parent.VPageBreaks
            If pbVertical.Location.Column > .Column Then Exit For
            nNumeroDaPagina = nNumeroDaPagina + nHorizontalPageBreaks
        Next pbVertical
    End With
    NumeroDaPagina = nNumeroDaPagina
ResumeHere:
    Exit Function
ErrHandler:
    NumeroDaPagina = CVErr(xlErrRef)
    Resume ResumeHere
End Function

Para Exibir o Número Total de Páginas da Planilha

Public Function TotalDePaginas() As Variant
Dim pbHorizontal As HPageBreak
Dim pbVertical As VPageBreak
Dim nHorizontalPageBreaks As Long
Dim nVerticalPageBreaks As Long
Dim nTotalDePaginas As Long
On Error GoTo ErrHandler
    'Application.Volatile   'Você pode utilizar esta linha de comando para atualizar
                            'automaticamente a cada alteração (TORNA UM POUCO LENTO)
                            'Para utilizá-la basta desmarcar como comentário (')
    With ActiveSheet
        If .PageSetup.Order = xlDownThenOver Then
            nHorizontalPageBreaks = .HPageBreaks.Count + 1
            nVerticalPageBreaks = 1
        Else
            nHorizontalPageBreaks = 1
            nVerticalPageBreaks = .VPageBreaks.Count + 1
        End If
        nTotalDePaginas = 1
        For Each pbHorizontal In .HPageBreaks
            nTotalDePaginas = nTotalDePaginas + nVerticalPageBreaks
        Next pbHorizontal
        For Each pbVertical In .VPageBreaks
            nTotalDePaginas = nTotalDePaginas + nHorizontalPageBreaks
        Next pbVertical
    End With
    TotalDePaginas = nTotalDePaginas
ResumeHere:
    Exit Function
ErrHandler:
    TotalDePaginas = CVErr(xlErrRef)
    Resume ResumeHere
End Function

Feche o VBA e retorne para a planilha.
Para usar as funções, digite na célula:
=NumeroDaPagina() Exibe a página atual ou específica
ou
=TotalDePaginas() Exibe o total de páginas do documento
Você também pode personalizar a informação de saída da função NumeroDaPagina.
Suponha que você tenha numa determinada página as informações de uma tabela de preço. Esta tabela, inicia-se na célula B105. Para fazer referência a este conteúdo, você pode escrever na primeira página, por exemplo, uma indicação assim:
Veja a tabela de preços na página:  =NumeroDaPagina(B105)
Irá mostrar a pagina referente a célula B105.
Com isso, você poderá até montar um simples índice. Bom demais!
Espero que tenham gostado.

18 comentários em “Mostrar números de páginas dentro das células”

  1. Reinaldo,
    Me ajudou bastante em um relatório mas ainda preciso, para que fique perfeito, como atualizá-lo em uma linha que vai ser repetida durante a impressão? Dessa forma não precisaria repetir a mesma entende?
    Obrigado.

    Responder
  2. Reinaldo boa noite.
    Essa informação foi muiiiiiiiitooooooooo últil. Estou começando agora com essa coisa de vba. e estou amando.
    Têm como eu fazer com que por exemplo, as paginas da guia 2 siga a numeração dada na célula da guia 1.? (tanto individual como total) desde já agradeço.
    Eliane

    Responder
    • Oi Eliane.
      O VBA é muito interessante mesmo.
      Dá para fazer o que você escreveu sim. Contudo, como falei no artigo, essa função é mais interessante para se utilizar programaticamente, pois, usando-se nas células da planilha fica bem lenta a planilha pois a fórmula se atualiza a cada cálculo.
      Enfim, tudo depende da forma que você quer utiizar isso. Pensando rapidinho aqui, você poderia deixá-la assim:
      -Alterando o método TotalDePaginas
      Public Function TotalDePaginas(Optional ByRef rng As Excel.Range) As Variant
      Dim pbHorizontal As HPageBreak
      Dim pbVertical As VPageBreak
      Dim nHorizontalPageBreaks As Long
      Dim nVerticalPageBreaks As Long
      Dim nTotalDePaginas As Long
      On Error GoTo ErrHandler
      'Application.Volatile
      If rng Is Nothing Then
      Set rng = ActiveSheet.Range("A1")
      End If
      With rng.Worksheet
      If .PageSetup.Order = xlDownThenOver Then
      nHorizontalPageBreaks = .HPageBreaks.Count + 1
      nVerticalPageBreaks = 1
      Else
      nHorizontalPageBreaks = 1
      nVerticalPageBreaks = .VPageBreaks.Count + 1
      End If
      nTotalDePaginas = 1
      For Each pbHorizontal In .HPageBreaks
      nTotalDePaginas = nTotalDePaginas + nVerticalPageBreaks
      Next pbHorizontal
      For Each pbVertical In .VPageBreaks
      nTotalDePaginas = nTotalDePaginas + nHorizontalPageBreaks
      Next pbVertical
      End With
      TotalDePaginas = nTotalDePaginas
      ResumeHere:
      Exit Function
      ErrHandler:
      TotalDePaginas = CVErr(xlErrRef)
      Resume ResumeHere
      End Function

      Você poderia chamá-la na 2a. guia assim:
      =NumeroDaPagina() + TotalDePaginas(Guia1!A1)
      =TotalDePaginas() + TotalDePaginas(Guia1!A1)
      Tenta aí… e boa sorte
      —————————————-
      Não deixe de nos seguir no Twitter – twitter.com/exceldoseujeito

      Responder
  3. Gostei muito da Function NumeroDaPagina, de fato ela funciona nas células das planilhas do excel, contudo fica muito lenta. Mas o que gostaria de saber é como faço para ela retornar o número da página dentro de um label.
    Obrigado.

    Responder
    • Oi Jarbas,
      Você precisa definir uma macro para escrever no label. Nesta macro, você vai alterar a propriedade Caption do Label. Exemplo:
      'Num módulo
      Sub Macro1 ()
      Label1.Caption = NumeroDaPagina()
      End Sub

      Abraço

      Responder
  4. Olá!
    Não entendo nada sobre VBA, mas consegui colocar na minha planilha o número total de páginas. O número da página atual fala que está com erro de compilação (não sei o que é isso). Gostaria de uma ajuda sua, eu queria colocar o número atual da página e o número total da página na mesma célula (exemplo: Folha: 1/1…1/2…2/2)

    Responder
    • Oi Aline,
      Você pode fazer assim:
      =”Folha: ” & NumeroDaPagina() & “/” & TotalDePaginas()
      Aproveito, para deixar um aviso pra galera que lê esta matéria:
      Na ferramenta Cabeçalho e Rodapé tem suporte a esta funcionalidade. É mais ideal para usá-la quando quiser exibir a numeração das páginas de um relatório.
      A função descrita neste artigo foi pensada com intuito maior de aplicá-la em funções internas das macros ou em casos específicos para mostrar algum posicionamento de página na própria célula. É uma macro lenta, portanto, não recomendada para paginar todo um documento, ok.
      Abração.

      Responder
      • Olá,
        Muito útil esta macro, mas ainda estou com uma dificuldade.
        Utilizei a fórmula, conforme a respostas do comentário:=NumeroDaPagina() & “/” & TotalDePaginas()
        A célula que contem esta fórmula, faz parte de uma das linhas que se repete no cabeçalho, mas o Número da Página não é atualizado na visulização da impressão.
        Existe alguma forma, para automatizar a informação? (deixei o Application.Volatile sem a ‘). Ou tenho que incluir essas linhas a se repetir em toda as páginas?
        Valeu!

        Responder
        • Oi Julie, tudo bem?
          Na verdade, a intenção primordial desta macro é para fazer uso interno, dentro de outras macros, para fazer referências a páginas de maneira dinâmica.
          No exemplo, mostrei como usá-las na célula, mais para fins didáticos e pequenas adaptações onde houvesse a necessidade desta informação. Visto que, o seu uso em vários locais numa planilha grande, por exemplo, perderia-se muito em performance.
          O ideal para exibição da forma como você precisa, ou seja, exibir em todas as páginas, seria realmente o uso da ferramenta Cabeçalho/Rodapé.
          Espero que tenha sido claro.
          Um abraço.

          Responder
  5. Cara funcionou muito bem, mas notei que não está atualizando automaticamente, quando acrescentado novas páginas. Tenho que ir na célula e apertar enter.

    Responder
  6. Oi Reinaldo! Obrigado pelo conhecimento!!
    quando digitei a formula, abriu novamente o VBA com o seguinte erro:
    Erro de compilação:
    Bloco If sem End If

    Responder
    • Você pode ter copiado e colado o código direto do site.
      Dessa forma, alguns caracteres de formatação HTML foram adicionados ao seu projeto VBA, gerando o erro.
      Copie o código novamente, utilizando a opção “copiar código” no canto superior direito do próprio código o site. Ou faça o download da versão de exemplo que eu disponibilizo no final da matéria.
      Ou… escreva todo o código na raça, na mão… linha por linha… (acho que essa opção você vai descartar… rsrsrsrs)
      Abraços,
      Aproveita e participa da nossa promoção deste mês, valendo um Curso de Excel!!!

      Responder
  7. Reinaldo seu código funciona perfeitamente, muito obrigado.
    Poderia me ajudar em algo mais?
    Preciso de um código para ler o resultado do total das folhas (em uma célula) e copiar somente o valor para outra célula, sem referência.
    Agradeço pela ajuda.

    Responder

Deixe um comentário