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

Respuesta
1

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

Ya no entendí. ¿Quieres un pdf o varios pdf?

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

¿Y manualmente cómo haces para imprimir la selección activa de cada hoja en un único PDF?

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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas