Macro que Guardar archivo en pdf, y ahora que sea en xlsx

A los miembros de este foro, quisiera ver la posibilidad de mejorar la macro, esta macro me permite grabar en PDF ahora lo que me piden es grabar .xlsx, bajo el mismo detalle:

Dim valor As String: Dim NOMBRE As String
Private Sub CommandButton1_Click()
Sheets("boleta").Select
End
End Sub

Private Sub ListBox1_Click()
'Act.Por.Dante Amor
LIMPIA
Set x = Worksheets("BOLETA")
Set y = Worksheets("TRABAJADOR")
valor = ListBox1.Value
numero = ListBox1.ListIndex + 1
Set Z = x.Range("b:b")
With Z
Set busca = .Find(valor, LookIn:=xlValues)
End With
r = busca.Address
ri = Range(r).Offset(-10, -1).Address
'rf = Range(ri & ":m" & numero * 62).Address
rf = Range(ri & ":o" & numero * 67).Address
PREGUNTA = MsgBox("¿GENERAR PDF? ", vbYesNo, "AVISO")
If PREGUNTA = vbYes Then
CARPETA2
'ActiveSheet.PageSetup.PrintArea = ActiveSheet.UsedRange.Address
'Set rng = Range(ActiveSheet.UsedRange.Address)
x.Range(rf).ExportAsFixedFormat Type:=xlTypePDF, _
fileName:=NOMBRE, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=True, _
From:=1, To:=10, OpenAfterPublish:=False
MsgBox "El archivo PDF fue generado en: " & NOMBRE & ".pdf"
Else
End
End If
End Sub
Private Sub OptionButton1_Click()
guardar_pdf
End Sub

Private Sub UserForm_Activate()

Set x = Worksheets("BOLETA")
x.Select

LIMPIA
With UserForm1
.Caption = "CONVERTIR PDF"
.Move 150, 10
End With

celda = x.Range("B11").Value

a = 0
Do While celda <> Empty
celda = x.Range("B11").Offset(a, 0).Value
If celda = Empty Then Exit Do
ListBox1.AddItem celda
a = a + 67
Loop

End Sub
Sub LIMPIA()
Set x = Worksheets("BOLETA")
Set y = Worksheets("TRABAJADOR")

For Each PIC In y.Pictures
PIC.Delete
Next PIC

'Set Z = y.Range("A1:M62")
Set Z = y.Range("A1:O67")
Z.ClearContents

End Sub

Sub CARPETA2()
Set fso = CreateObject("Scripting.FileSystemObject")
Dim archivos As String
Dim contador As Integer

respuesta = MsgBox(ActiveWorkbook.Path, vbYesNo, "USAR CARPETA")

If respuesta = vbYes Then
directorio = ActiveWorkbook.Path
Else
titulo = "Selecciona la ruta de tu carpeta"
On Error Resume Next
With CreateObject("shell.application")
directorio = .browseforfolder(0, titulo, 0).Items.Item.Path
End With: On Error GoTo 0
If directorio = "" Then
MsgBox "No has marcado ningún directorio.", , "Operación no válida"
End
Else
MsgBox "Ha seleccionado la siguiente ruta " & directorio
End If
End If

RES = MsgBox("¿Guardar con el nombre de: " & valor & ".pdf", vbYesNo, "AVISO")

If RES = vbYes Then
hoja = valor
Else
hoja = InputBox("TECLEA UN NOMBRE:", "AVISO")
If hoja = Empty Then End
End If

NOMBRE = directorio & "\" & hoja

End Sub

El siguiente codigo forma parte de la primera descripción, y esperando contar con su valioso aporte, quedo agradecido siempre de uds.

Dim NOMBRE As String
Sub guardar_pdf()
CARPETA
ActiveSheet.PageSetup.PrintArea = ActiveSheet.UsedRange.Address

Set rng = Range(ActiveSheet.UsedRange.Address)

rng.ExportAsFixedFormat Type:=xlTypePDF, _
fileName:=NOMBRE, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=True, _
From:=1, To:=10, OpenAfterPublish:=False
Range("A1").Select

MsgBox "El archivo PDF fue generado en: " & NOMBRE & ".pdf"
End Sub
Sub CARPETA()
Set fso = CreateObject("Scripting.FileSystemObject")
Dim archivos As String
Dim contador As Integer

respuesta = MsgBox("Usar carpeta por default", vbYesNo, "AVISO")

If respuesta = vbYes Then
directorio = ActiveWorkbook.Path
Else
titulo = "Selecciona la ruta de tu carpeta"
On Error Resume Next
With CreateObject("shell.application")
directorio = .browseforfolder(0, titulo, 0).Items.Item.Path
End With: On Error GoTo 0
If directorio = "" Then
MsgBox "No has marcado ningún directorio.", , "Operación no válida"
End
Else
MsgBox "Ha seleccionado la siguiente ruta " & directorio
End If
End If

RES = MsgBox("¿Guardar con nombre por default?", vbYesNo, "AVISO")

If RES = vbYes Then
hoja = ActiveSheet.Name
Else
hoja = UCase(InputBox("TECLEA UN NOMBRE:", "AVISO"))
End If

NOMBRE = directorio & "\" & hoja

End Sub
'REVISAR ESTA RUTINA
Sub ajustar()
Range("a68").Select
n = Range("a68").Value
Do While ActiveCell <> Empty
Set x = ActiveCell.Resize(2, 2)
x.EntireRow.Insert
ActiveCell.Offset(69, 0).Select
Loop
End Sub
Sub forma()
UserForm1.Show
End Sub

1 Respuesta

Respuesta
2

Cambia tu evento Listbox1_Click por lo siguiente:

Private Sub ListBox1_Click()
    LIMPIA
    Set x = Worksheets("BOLETA")
    Set y = Worksheets("TRABAJADOR")
    valor = ListBox1.Value
    numero = ListBox1.ListIndex + 1
    Set Z = x.Range("b:b")
    With Z
        Set busca = .Find(valor, LookIn:=xlValues)
    End With
    r = busca.Address
    ri = Range(r).Offset(-10, -1).Address
    'rf = Range(ri & ":m" & numero * 62).Address
    rf = Range(ri & ":o" & numero * 67).Address
    PREGUNTA = MsgBox("¿GENERAR PDF? ", vbYesNo, "AVISO")
    If PREGUNTA = vbYes Then
        CARPETA2
        'ActiveSheet.PageSetup.PrintArea = ActiveSheet.UsedRange.Address
        'Set rng = Range(ActiveSheet.UsedRange.Address)
        x.Range(rf).ExportAsFixedFormat Type:=xlTypePDF, _
            Filename:=NOMBRE, Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, IgnorePrintAreas:=True, _
            From:=1, To:=10, OpenAfterPublish:=False
        '
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
        n = Application.SheetsInNewWorkbook
        Application.SheetsInNewWorkbook = 1
        x.Range(rf).Copy
        Workbooks.Add
        ActiveWorkbook.Range("A1").PasteSpecial xlPasteValues
        ActiveWorkbook.Range("A1").PasteSpecial xlPasteFormats
        ActiveWorkbook.SaveAs _
            Filename:=NOMBRE, _
            FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
        ActiveWorkbook.Close
        Application.SheetsInNewWorkbook = n
        Application.ScreenUpdating = False
        '
        MsgBox "El archivo PDF fue generado en: " & NOMBRE & ".pdf"
    Else
        End
    End If
End Sub

Lo que hace es generar el pdf y también un xlsx con la misma información.

Prueba y me comentas.


.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

Hola Amigo Dante Amor, reemplazando la macro anterior por la nueva rutina que brindas, me emite el siguiente error, adjunto imagen

Espero tu apreciación, gracias.

Prueba con esta:

Private Sub ListBox1_Click()
    LIMPIA
    Set x = Worksheets("BOLETA")
    Set y = Worksheets("TRABAJADOR")
    valor = ListBox1.Value
    numero = ListBox1.ListIndex + 1
    Set Z = x.Range("b:b")
    With Z
        Set busca = .Find(valor, LookIn:=xlValues)
    End With
    r = busca.Address
    ri = Range(r).Offset(-10, -1).Address
    'rf = Range(ri & ":m" & numero * 62).Address
    rf = Range(ri & ":o" & numero * 67).Address
    PREGUNTA = MsgBox("¿GENERAR PDF? ", vbYesNo, "AVISO")
    If PREGUNTA = vbYes Then
        CARPETA2
        'ActiveSheet.PageSetup.PrintArea = ActiveSheet.UsedRange.Address
        'Set rng = Range(ActiveSheet.UsedRange.Address)
        x.Range(rf).ExportAsFixedFormat Type:=xlTypePDF, _
            Filename:=NOMBRE, Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, IgnorePrintAreas:=True, _
            From:=1, To:=10, OpenAfterPublish:=False
        '
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
        n = Application.SheetsInNewWorkbook
        Application.SheetsInNewWorkbook = 1
        x.Range(rf).Copy
        Workbooks.Add
        ActiveSheet.Range("A1").PasteSpecial xlPasteValues
        ActiveSheet.Range("A1").PasteSpecial xlPasteFormats
        ActiveWorkbook.SaveAs _
            Filename:=NOMBRE, _
            FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
        ActiveWorkbook.Close
        Application.SheetsInNewWorkbook = n
        Application.CutCopyMode = False
        Application.ScreenUpdating = True
        '
        MsgBox "El archivo PDF fue generado en: " & NOMBRE & ".pdf"
    Else
        End
    End If
End Sub

Avísame cualquier duda

Amigo Dante Amor, la macro ahora ya quedo OK, es decir genera el archivo pdf como el xlsx, solo un pequeño detalle, que, al generar el archivo en excel este queda descuadrado adjunto imagen, y si no fuese molestia solicitarte tú apoyo para que quede igual que archivo en pdf


Agradezco nuevamente tu colaboración, caso contrario daría como tema solucionado, gracias.

Después de esta línea:

ActiveSheet. Range("A1"). PasteSpecial xlPasteFormats

Agrega esta línea:

ActiveWorkbook. Range("A1"). PasteSpecial xlPasteColumnWidths

Es difícil competir contra excel, lo que hace esta línea, es enviar un rango de celdas, directamente a una impresora, en este caso, a la impresora "PDF", internamente existe un programa (ExportAsFixedFormat), que tiene un código para determinar cómo imprimir el PDF

x.Range(rf).ExportAsFixedFormat Type:=xlTypePDF

Lo que pides es enviar un rango a un archivo de excel, eso no existe.

Si lo que quieres es toda la hoja, entonces cambia la macro por esta:

Private Sub ListBox1_Click()
    LIMPIA
    Set x = Worksheets("BOLETA")
    Set y = Worksheets("TRABAJADOR")
    valor = ListBox1.Value
    numero = ListBox1.ListIndex + 1
    Set Z = x.Range("b:b")
    With Z
        Set busca = .Find(valor, LookIn:=xlValues)
    End With
    r = busca.Address
    ri = Range(r).Offset(-10, -1).Address
    'rf = Range(ri & ":m" & numero * 62).Address
    rf = Range(ri & ":o" & numero * 67).Address
    PREGUNTA = MsgBox("¿GENERAR PDF? ", vbYesNo, "AVISO")
    If PREGUNTA = vbYes Then
        CARPETA2
        'ActiveSheet.PageSetup.PrintArea = ActiveSheet.UsedRange.Address
        'Set rng = Range(ActiveSheet.UsedRange.Address)
        x.Range(rf).ExportAsFixedFormat Type:=xlTypePDF, _
            Filename:=NOMBRE, Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, IgnorePrintAreas:=True, _
            From:=1, to:=10, OpenAfterPublish:=False
        '
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
        'n = Application.SheetsInNewWorkbook
        'Application.SheetsInNewWorkbook = 1
        'x.Range(rf).Copy
        'Workbooks. Add
        x. Copy
        'ActiveWorkbook. Range("A1"). PasteSpecial xlPasteValues
        'ActiveWorkbook. Range("A1"). PasteSpecial xlPasteFormats
        'ActiveWorkbook. Range("A1"). PasteSpecial xlPasteColumnWidths
        ActiveWorkbook.SaveAs _
            Filename:=NOMBRE, _
            FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
        ActiveWorkbook.Close
        'Application.SheetsInNewWorkbook = n
        Application.ScreenUpdating = False
        '
        MsgBox "El archivo PDF fue generado en: " & NOMBRE & ".pdf"
    Else
        End
    End If
End Sub

Prueba ambos casos.

sal u dos

¡Gracias! Amigo Dante Amor, solo era una sugerencia que se me había ocurrido, y como indicas estuve navegando por internet y es cierto que para grabar un pdf tiene su propia regla

x.Range(rf).ExportAsFixedFormat Type:=xlTypePDF

Por lo demás, la macro quedo OK. por lo que agradezco tú colaboración brindada, por lo que daria como TEMA RESUELTO.

Gracias.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas