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.
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.
Neste caso é melhor usar as opções de Cabeçalho e Rodapé do próprio excel. ok.
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
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
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.
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
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)
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.
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!
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.
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.
Olá Willian.
Basta retirar a aspas (‘) da linha 10, onde tem o comando Application.Volatile. Lá eu descrevo pq este comando está desativado. Torna bem lenta a execução da planilha.
A intenção desta macro é utilizá-la em processos internos da programação.
Para marcações em relatórios, principalmente os extensos, use a paginação da ferramenta Cabeçalho e Rodapé.
Abç
É mesmo, valeu. To com um problema novo, minha planilha tem abas, porém quando to na aba ele conta só o total dessa aba e não do workbook inteiro.
Dá uma lida aqui nos comentários
https://www.exceldoseujeito.com.br/2010/09/17/mostrar-numeros-de-paginas-dentro-das-celulas/comment-page-1/#comment-2800
Abraços
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
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!!!
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.
Não entendi bem sua dúvida.
Para obter o Total de páginas, basta usar a fórmula em qualquer célula:
=TotalDePaginas()
Abç