Un Saludo!!
He actualizado este artículo basado en una pregunta realizada por correo, ya que me pareció muy interesante, y es para contar las páginas de archivos de Word.
Así que ahora puedes contar páginas tanto de PDF como de archivos DOC y DOCX
Me han hecho varias preguntas directamente al correo, o en las encuestas, y esta es una que me hicieron que me pareció interesante compartir.
Nos solicitan lo siguiente:
«Macro para abrir un cuadro de diálogo que me permita seleccionar un PDF, hacer su hipervínculo en un celda y automáticamente en la celda de su costado me cuenta cuántas páginas tiene dicho PDF»
Suena algo complejo, pero acá te muestro la solución que se dió.
Solución para contar páginas en PDF DOC y DOCX
El archivo se compone de 2 tablas:
- Una para leer un múltiples archivos PDF, DOC o DOCX y extraer la cantidad de páginas.
- Y la otra tabla es para seleccionar una carpeta de donde se leen todos los archivos PDF, DOC o DOCX que se encuentran dentro para obtener la cantidad de páginas por cada archivo.
También al final del código, se adiciona el hipervínculo para poder abrir el archivo al seleccionar la celda.
Acá te muestro una imagen del archivo resultado.
Código para contar páginas de PDF DOC o DOCX
A continuación te muestro el código para contar las páginas de archivos PDF DOC o DOCX.
'Creado por Practicaprende.com
Sub leer_pdf_unico_archivo()
Dim xStr As String
Dim row As Integer
Dim xFd As FileDialog
Dim xFdItem As Variant
Dim xFileName As String
Dim xFileNum As Long
Dim RegExp As Object
Set xFd = Application.FileDialog(msoFileDialogFilePicker)
Set fso = CreateObject("Scripting.FileSystemObject")
If xFd.Show = -1 Then
row = 9
xFd.AllowMultiSelect = True
Range("B" & row & ":F100").ClearContents
For Each vrtSelectedItem In xFd.SelectedItems
extension = fso.GetExtensionName(vrtSelectedItem)
xFdItem = vrtSelectedItem
xStr = ""
If (extension = "pdf") Then 'Leer desde PDF
Range("B" & row).Value = xFdItem
Call adicionar_link("B" & row, CStr(xFdItem))
Set RegExp = CreateObject("VBscript.RegExp")
RegExp.Global = True
RegExp.Pattern = "/Type\s*/Page[^s]"
xFileNum = FreeFile
Open (xFdItem) For Binary As #xFileNum
xStr = Space(LOF(xFileNum))
Get #xFileNum, , xStr
Close #xFileNum
Range("C" & row).Value = RegExp.Execute(xStr).Count
ElseIf (extension = "doc" Or extension = "docx") Then 'Leer desde Doc o Docx
Range("B" & row).Value = xFdItem
Call adicionar_link("B" & row, CStr(xFdItem))
Range("C" & row).Value = "Loading..."
Set xWdApp = CreateObject("Word.Application")
Set xWd = GetObject(vrtSelectedItem)
Range("C" & row).Value = xWd.ActiveWindow.Panes(1).Pages.Count
xWd.Close False
End If
row = row + 1
Next
End If
End Sub
Sub leer_pdf_desde_carpeta()
Dim xStr As String
Dim row As Integer
Dim xFd As FileDialog
Dim xFdItem As Variant
Dim xFileName As String
Dim xFileNum As Long
Dim RegExp As Object
Set xFd = Application.FileDialog(msoFileDialogFolderPicker)
Set fso = CreateObject("Scripting.FileSystemObject")
If xFd.Show = -1 Then
row = 9
xFdItem = xFd.SelectedItems(1) & Application.PathSeparator
xFileName = Dir(xFdItem & "*.*", vbDirectory)
xStr = ""
Range("B" & row & ":F100").ClearContents
Do While xFileName <> ""
extension = fso.GetExtensionName(xFileName)
If (extension = "pdf") Then 'Leer desde PDF
Range("E" & row).Value = xFdItem & xFileName
Call adicionar_link("E" & row, xFdItem & xFileName)
Set RegExp = CreateObject("VBscript.RegExp")
RegExp.Global = True
RegExp.Pattern = "/Type\s*/Page[^s]"
xFileNum = FreeFile
Open (xFdItem & xFileName) For Binary As #xFileNum
xStr = Space(LOF(xFileNum))
Get #xFileNum, , xStr
Close #xFileNum
Range("F" & row).Value = RegExp.Execute(xStr).Count
row = row + 1
ElseIf (extension = "doc" Or extension = "docx") Then 'Leer desde Doc o Docx
Range("E" & row).Value = xFdItem & xFileName
Call adicionar_link("E" & row, xFdItem & xFileName)
Range("F" & row).Value = "Loading..."
Set xWdApp = CreateObject("Word.Application")
Set xWd = GetObject(xFdItem & xFileName)
Range("F" & row).Value = xWd.ActiveWindow.Panes(1).Pages.Count
xWd.Close False
row = row + 1
End If
xFileName = Dir
Loop
End If
End Sub
Private Sub adicionar_link(celda As String, archivo As String)
With Range(celda)
.Hyperlinks.Add Anchor:=Range(celda), _
Address:=archivo
End With
End Sub
La idea de esta página es compartir todo el conocimiento que se pueda, y que mejor que compartir una duda real de un seguidor de la página.
Espero sea de tu ayuda.
CONCLUSION
Ya viste como contar las páginas de archivos PDF DOC o DOCX, una solicitud de un seguidor de la página.
Si quieres ver mas ejemplos que tenemos visita nuestro Blog
Espero te guste!
Saludos!
☕Si te ha gustado el contenido puedes invitarme un café! ☕
DESCARGAR EJEMPLO
En el siguiente link puedes descargar el archivo utilizado, Si tienes alguna duda o sugerencia para mejorar el código, simplemente comenta en el formulario de Contacto
Para descargar el archivo utilizado es necesario estar registrado. Acá Puedes Registrarte y si ya estas registrado puedes ingresar a tu cuenta de usuario.
Buenas noches!
Me gusta mucho tu código, pero tengo una pregunta, cómo puedo evitar el cuadro de diálogo, que tome la ruta desde una celda o desde «ThisWorkbook.Path», que tome automáticamente la ruta del archivo y me liste los PDFs y sus páginas.
Muchas gracias,
Diana A
Hola Diana! Espero estés bien!! Gracias por preguntar.
El código toma la ruta del Cuadro de Dialogo, pero si quieres especificar una en concreto puedes omitir esto:
Set xFd = Application.FileDialog(msoFileDialogFolderPicker)
y omitir todo el código que tenga «xFd», ya que eso corresponde al cuadro de dialogo y sus archivos.
Por otro, lado revisa la variable «xFdItem», es en donde se guarda la carpeta seleccionada, entonces puedes reemplazar el valor de esta variable por tu carpeta.
Ya que el código lo que hace es buscar todos los archivos(*.*) dentro de esa carpeta y luego los condiciona a PDF DOC o DOCX.
Un saludo Diana y espero te sirva!!! 🙂👍
Excelente programa, pero es posible que incluya los archivos que esten ubicados en las subcarpetas que tengo en la carpeta seleccionada?
Hola Miller! muchas gracias por comentar, interesante tu solicitud, déjame lo valido y dado caso actualizo el artículo para incluir las subcarpetas. Un saludo 👍
Eres el mejor, muchas gracias por el aporte. bendiciones
Hola
Probé con unos archivos de 6000 páginas y no entrega la cantidad real :C.
no cuenta bien las hojas gracias pero no funciona
Ricardo!! Gracias por escribir, genera algun error? o no cuenta las hojas? puedes aclarar un poco mas?
No da el valor real…
Marlon!!
Puede no dar el valor real en la medida que el pdf tenga ciertas características, ya que lo que el código hace es una verificación binaría del pdf y de allí se obtiene la cantidad de páginas.
Para tener una mayor garantía se debe utilizar la referencia de adobe, pero esta no es gratuita por lo cual no se muestra en este artículo.
Un saludo!
Te agradezco mucho me fue muy útil
Hola
Probe con uno y varios archivos y todo me cuenta 0 con excel 2019
Dayro! Gracias por escribir!
Podrías subir uno de los archivos que genera error en https://solicitud.practicaprende.com/ para revisarlo puntualmente, quedo atento Dayro!
A Mí me pasa algo parecido con Excel 2016, la cantidad de páginas que recupera no es correcta.
Por su comentario me atrevo a pensar que el nuevo formato de Adobe ya no se ajusta al string de consulta que se usa en esta macro y habría que considerar si el archivo firmado digitalmente también ha variado su estructura interna
Ya busqué por varias fuentes una solución pero la única más sencilla es a través de comandos de linux, y empatar esto es peor
A mi no me funcionó, en una carpeta tengo 957 archivos y solo contó los folios a 3 de ellos.
Diana!! como estas? podrías subir en https://solicitud.practicaprende.com/ uno de los archivos que no funcionaron para revisar por que no lo lee. Vale? quedo atento!
Lo descargué y probé varias veces. En algunas funcionó y el resto ya no. Quise contar folios de una carpeta con aproximadamente 100 archivos que contienen entre 1 y 4 folios cada uno, pero no mostró resultados. 🙁
Diana! gracias por escribir! tocaría revisar especificamente el pdf por si tiene contraseña o tiene algun formato especial que no pueda ser leido por esta macro.
Si gustas puedes hacer la solicitud desde https://solicitud.practicaprende.com/ y subir uno de los archivos que generaron error.
Quedo atento!
HOLA…. pueden ayudarme..
hice prueba con un grupo de archivo de pdf…. uno de ello tiene 9 paginas pero el contador me indica que tiene 14.. ya lo revise bien el archivo por si tiene hojas en blanco y nada….. mmm a que se debe???
Antonio! gracias por escribir! ya tocaría revisar el pdf por si tiene contraseña o tiene algun formato especial que no pueda ser leido por esta macro. si gustas puedes hacer la solicitud desde https://solicitud.practicaprende.com/ y subir uno de los archivos que generaron error. quedo atento
Es muy buen codigo. la verdad me gustaria saber donde puedo aprender esos codigos avanzados de macros. ya que solo veo cursos basicos en la red, ni siquiera en libros he encontrado un codigo de esa manera
Harles! gracias por comentar!
Este código en particular por ejemplo hace uso de «regex» o «Expresiones Regulares», pero son totalmente separados de Excel, me refiero son temas que se necesitan aprender por aparte y luego venir a vba a implementarlos.
Mas que todo uno aprende es buscando codigos y adaptandolos a tus necesidades.
Por ejemplo en https://practicaprende.com/11 tienes un codigo para obtener las estadisticas del coronavirus por país, echale un vistazo y me cuentas que te pareció.
La única forma de aprender es practicando bastante y haciendo tus propios codigos.
Un saludo!
Hola puede «no contar» las paginas en blanco.
Gracias.
Julian! gracias por comentar! revisando con el codigo actual no es posible, ya sería revisar otro tipo de implementación para leer un pdf desde vba!
Necesitaría que también tenga en cuenta las subcarpetas, sabes si es posible?
Gracias! la macro va genial!
Montse! Gracias por escribir!
interesante tu sugerencia, dejame lo anoto y actualizo el artículo con subcarpetas!!
Gracias!
Hola, lo probé pero me sale en todos una página de más y quisiera saber de que manera puedo hacer para que salga de manera exacta. Gracias por tu ayuda.
no funciona… la misma mierda de todo que dice que cuenta utilizando el mesmo argoritmo que hay y que no funciona
Kety!!
el código que se muestra en el artículo es con referencias gratuitas, por lo cual si el pdf tiene ciertas características y cierta encriptación puede no funcionar.
Para tener una mayor garantía se debe utilizar la referencia de adobe, pero esta no es gratuita por lo cual no se muestra en este artículo.
Un saludo!