Guardar como pdf excel
Estoy realizando una macro que pueda unificar el contenido de varias hojas en un solo PDF, quiero que automáticamente seleccione un rango diferente en cada hoja para que solo imprima ese rango seleccionado en el PDF final.
Ej: tengo 4 hojas condiferentes nombres, per en la hoja1 me imprima solo el rangoA1:F30; en la hoja el rango A!1:F45; en la hoja 3 el rango A1:F10 y en la hoja 4 el rango A1:F56,
Estos rangos de cada hoja sean unificados en un PDF, con la opción de guardar como PDF de excel
1 respuesta
Esta sería la macro, tomando el ejemplo de 4 hojas
Sub guardarpdf() 'Por.DAM Set l1 = ActiveWorkbook Set l2 = Workbooks.Add Set h2 = l2.ActiveSheet l1.Activate u = 1 Sheets("Hoja1").Range("A1:F30").Copy h2.Range("A" & u) u = h2.Range("a1").SpecialCells(xlLastCell).Row + 1 Sheets("Hoja2").Range("A1:F45").Copy h2.Range("A" & u) u = h2.Range("a1").SpecialCells(xlLastCell).Row + 1 Sheets("Hoja3").Range("A1:F10").Copy h2.Range("A" & u) u = h2.Range("a1").SpecialCells(xlLastCell).Row + 1 Sheets("Hoja4").Range("A1:F56").Copy h2.Range("A" & u) u = h2.Range("a1").SpecialCells(xlLastCell).Row ruta = l1.Path l2.Activate Range("A1:F" & u).Select Selection.ExportAsFixedFormat Type:=xlTypePDF, _ Filename:=ruta & "\libro9.pdf" End Sub
La macro te crea un nuevo libro con los rangos que necesitas por hoja y el nuevo libro lo guarda como PDF.
Prueba y me comentas
Saludos. Dante Amor
Si es lo que necesitas.
Hola ejecute tu macro pero al copiar y pegar en una solo hoja pra después enviar a PDF se pierden (el ancho de columnas, Formatos de celdas entreo otras cosas) por lo que preferiría imprimir directamente lso rangos de cada hoja en PDF.
Te envío la rutina que estoy tratando de utilizar para que me colabores. esta rutina imprime un rango fijo en todas las hojas, directamente a PDF.
he tratado de asignarle un rango variable o que me imprima la selección activa de cada hoja.
En donde dice Fila_final y la linea de código que sigue, he tratado de que me seleccione el ultimo valor de la columna "A" hasta la columna "F". esto con el fin de que seleccione este rango para después imprimirlo.
Dim hoja As Control
x = 0
For Each hoja In Me.Controls
If Not hoja.Name = "CommandButton1" Then
x = x + 1
If hoja.Value = True Then
Worksheets(hoja.Caption).PageSetup.LeftFooter = hoja.Caption
If a = 1 Then ren = "False" Else ren = "True"
Worksheets(hoja.Caption).Select Replace:=ren
a = 1
End If
End If
Next
On Error Resume Next
nbre = Trim(InputBox(" Registre un Nombre ")) & "_" & Format(Now, "dd-mm-yyyy")
Set wb = ActiveWorkbook
With wb
'las 2 lineas siguientes las he puesto para tratar de seleccionar el ultimo valor de la columna "A"
Fila_Final = Range("A" & Cells.Rows.Count).End(xlUp).Row
Range("A1:f" & Fila_Final).Select
'de aquí en adelante quiero cambiar mi rango de selección para que no sea fijo
RutaArchivo = "c:pdf" & "\" & nbre & ".pdf" '<====Ruta archivo
Range ("A1:f39").ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
RutaArchivo, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=True, OpenAfterPublish:=True
'Sheets(1).Select
Unload Me
Esta rutina la cargo desde un commandbutton en un userform..
Espero me puedas colaborar, ya que tu ejemplo es útil pero no quiero copiar los valores en una única hoja, me parece un paso adicional, si puedo imprimir cada hoja directamente en PDF.
Te agradezco tu ayuda
La copia lleva valores y formatos, lo único que se pierde son los anchos de las columnas.
Para obtener la última fila con datos de la columna A, utiliza esto:
filafinal = Range("A" & Rows.Count).End(xlUp).Row
Saludos. No olvides finalizar
ok
la copia lleva valores, formatos pero la idea es aplicar algo como lo que te escribí, si me ayudas a adaptarlo te lo agradezco se que no es difícil para una persona con tus conocimientos; ademas estoy muy cerca de conseguir lo que busco. es solo que el rango activo que ya esta seleccionado en todas las hojas se imprima en un solo PDF
TE agradezco me ayudes
un solo PDF; revisa la macro que te envíe, con este código puedo guardar varias hojas en un PDF pero el rango es fijo. quiero que encuentre el último valor de cada hoja en la columna 1 e imprima en un solo archivo todas mis hojas de excel.
Quedaría así
filafinal = Range("A" & Rows.Count).End(xlUp).Row
RutaArchivo = "c:pdf" & "\" & nbre & ".pdf" '<====Ruta archivo
Range ("A1:F" & filafinal).ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
RutaArchivo, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=True, OpenAfterPublish:=True
Hola Experto
Ya aplique el código que me enviaste pero toma el rango de la primera hoja y de ahi en adelante lo aplica para todas las hojas
Ej si en la primera hoja selecciono el rango A1:f50 este rango lo toma e imprime todas las hojas con el mismo rango, existen hojas donde hay mas datos o menos datos.
Espero me puedas seguir colaborando
No revisé todo tu código, solamente estoy tratando de entender lo que necesitas.
Tú mencionaste que ya tenías todas las hojas en una sola hoja, solamente te faltaba encontrar el último dato de la columna A, eso es lo que hice.
Hola
No experto , tengo mis hojas pero no en una sola hoja, las hojas son independientes. pero tiene rangos diferentes que quiero imprimir en un solo PDF, sin copiar todas las hojas en una porque tengo bastante información como tablas dinámicas, gráficos enlaces hipervínculos que se perderían o tendría que volver a ajustar en la nueva hoja o archivo si llevo todo a una sola hoja.
Lo que trato de hacer es encontrar el ultimo valor con datos en la columna "a" de cada hoja para poder imprimir la selección activa de cada hoja en un único PDF.
Gracias por tu colaboración
hola
manualmente debo seleccionar la hoja/ seleccionar el rango/guardar como PDF el rango seleccionado, asi sucesivamente con todas las hojas; y después unificar todos los PDF¨S en uno solo, lo cual es bastante dispendioso y mas si se superan 10 hojas como en algunos casos.
Con el código que te envíe, este proceso lo hace pero con un rango fijo, lo que dificulta la tarea porque en algunas hojas del pdf van a quedar espacios en blanco y otras hojas van a quedar con información incompleta.
gracias por tu colaboracion
Discúlpame pero tu macro no hace eso, solamente toma UNA HOJA, y un rango y eso es lo que envía al pdf.
Mi pregunta es, si manualmente no puedes enviar hoja por hoja a un SOLO pdf, tampoco la macro lo va a poder hacer.
Lo que tu haces es generar varios pdf y luego con otra herramienta es juntar todos los pdf en un solo PDF, ¿es así?
Hola
en este momento tengo mi macro abierta con varias hojas y junto con el código que me enviaste anteriormente, esta toma el mismo rango de las hojas y las imprime en un único PDF. lo de juntar muchas hojas combinándolas en un pdf es una opción pero no es lo que estoy buscando.
es cierto lo que dices no se puede enviar hoja por hoja a un solo PDF por eso no tengo contemplada esa opción es muy dispendiosa.
primero debes tener un userform con un botón y desde allí llamar el código que te envíe anteriormente, en este userform se muestran las hojas que tengo en mi libro y desde allí puedo escoger mediante check list cuales quiero imprimir, revísalo y me cuentas.
te envío el código que debe ir en el userform el cual debe llevar un botón
ya adicione el código que me enviaste anteriormente
Private Sub CommandButton1_Click()
Dim hoja As Control
x = 0
For Each hoja In Me.Controls
If Not hoja.Name = "CommandButton1" Then
x = x + 1
If hoja.Value = True Then
Worksheets(hoja.Caption).PageSetup.LeftFooter = hoja.Caption
If a = 1 Then ren = "False" Else ren = "True"
Worksheets(hoja.Caption).Select Replace:=ren
a = 1
End If
End If
Next
On Error Resume Next
nbre = Trim(InputBox(" Registre un Nombre ")) & "_" & Format(Now, "dd-mm-yyyy")
Set wb = ActiveWorkbook
With wb
filafinal = Range("A" & Rows.Count).End(xlUp).Row
RutaArchivo = "c:pdf" & "\" & nbre & ".pdf" '<====Ruta archivo
Range("A1:F" & filafinal).ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
RutaArchivo, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=True, OpenAfterPublish:=True
Unload Me
End With
End Sub
Private Sub UserForm_Activate()
Dim cCntrl As Control
Dim oSheet As Object
x = 60
For Each oSheet In Sheets
Set cCntrl = Me.Controls.Add("Forms.checkbox.1", , True)
With cCntrl
.Caption = oSheet.Name
.Width = Me.Width
.Height = 15
.Top = x
.Left = 18
.Value = True
End With
x = x + 15
Next
Me.Height = x + 36
End Sub
Disculpa, ya lo revisé y tenías razón si se envían todas las hojas.
Con el siguiente código envías todas las hojas, y solamente el rango de A1 a F y hasta la última fila de A.
Sub apdf() 'Por.DAM For Each h In Sheets If Not h.Name = "CommandButton1" Then uf = h.Range("A" & Rows.Count).End(xlUp).Row h.PageSetup.PrintArea = "A1:F" & uf h.Select replace:=False End If Next Application.DisplayAlerts = False nbre = Trim(InputBox(" Registre un Nombre ")) & "_" & Format(Now, "dd-mm-yyyy") RutaArchivo = "c:\pdf" & "\" & nbre & ".pdf" ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _ Filename:=RutaArchivo, _ Quality:=xlQualityStandard, IncludeDocProperties:=True, _ IgnorePrintAreas:=False, OpenAfterPublish:=False End Sub
Nota: tienes que tener en C:\ una carpeta llamada pdf
Prueba y me comentas.
Hola experto
Creo que funciona pero no se donde colocar el código, ya que me enviaste una subrutina y yo hacia el llamado desde el botón del userform para poder escoger las hojas que quiero imprimir?
Así quedaría tu botón
Private Sub CommandButton1_Click() 'Por.DAM Dim hoja As Control For Each hoja In Me.Controls If Not hoja.Name = "CommandButton1" Then If hoja.Value = True Then uf = Sheets(hoja.Caption).Range("A" & Rows.Count).End(xlUp).Row Sheets(hoja.Caption).PageSetup.PrintArea = "A1:F" & uf If una Then Sheets(hoja.Caption).Select replace:=False Else una = True Sheets(hoja.Caption).Select End If End If End If Next nbre = Trim(InputBox(" Registre un Nombre ")) & "_" & Format(Now, "dd-mm-yyyy") RutaArchivo = "c:\pdf" & "\" & nbre & ".pdf" ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _ Filename:=RutaArchivo, _ Quality:=xlQualityStandard, IncludeDocProperties:=True, _ IgnorePrintAreas:=False, OpenAfterPublish:=False End Sub
- Compartir respuesta