Saltar al contenido

Guardar userform en 2016 64 bits en pdf


Recommended Posts

publicado

Hola

Hola

Desde mi punto de vista, creo que podríamos decir que existen dos formas de imprimir un "UserForm" desde VBA:

1- Usar el método "PrintForm": La desventaja de dicho método, para algunas personas, es que actúa sobre la impresora predeterminada del sistema operativo y por lo tanto se tendría que tener una que "imprima" en PDF o cambiar, de ser otra, la predeterminada (ojo, no la impresora a usar sino la predeterminada) a una de PDF y quizá después volver a colocar la predeterminada que se tenía antes (sé que se lee enredado, pero espero se entienda). Ah sugiero que todo eso sea a través de algún evento de un objeto del "UserForm", por ejemplo un botón:

Private Sub CommandButton1_Click()
Dim WshNetwork As Object
Dim ImpresoraActiva  As String
Set WshNetwork = CreateObject("WScript.Network")
Let ImpresoraActiva = Left(ActivePrinter, Len(ActivePrinter) - 9)
WshNetwork.SetDefaultPrinter "Adobe PDF"
Me.PrintForm
WshNetwork.SetDefaultPrinter ImpresoraActiva
End Sub

2- La segunda forma sería recurrir a las funciones de la API de Windows. Realizamos una captura de pantalla del "UserForm", la pegamos en una hoja de Excel y con el método de exportar PDF del Excel convertimos dicha imagen en PDF. Ah, también sugiero usar 
un evento de algún objeto del "UserForm":

#If VBA7 And Win64 Then
    Private Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
#Else
    Private Declare  Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
#End If

Const KEYEVENTF_EXTENDEDKEY = &H1
Const KEYEVENTF_KEYUP = &H2
Const VK_SNAPSHOT = &H2C
Const VK_MENU = &H12

Private Sub CommandButton1_Click()

Dim Ruta As String

keybd_event VK_MENU, 0, KEYEVENTF_EXTENDEDKEY, 0
keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0
keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0
keybd_event VK_MENU, 0, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0
DoEvents

ThisWorkbook.Worksheets.Add After:=Worksheets(Worksheets.Count)
Range("A1").Select
ActiveSheet.Paste
Let Ruta = ActiveWorkbook.Path & "\" & "UserForm.pdf"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Ruta, _
    Quality:=xlQualityStandard, IncludeDocProperties:=False, _
    IgnorePrintAreas:=False, OpenAfterPublish:=False
Application.DisplayAlerts = False
Worksheets(Worksheets.Count).Delete
Application.DisplayAlerts = True
End Sub

Ah, funciona Office de 32 o de 64 bits. Saludos.

Abraham Valencia

publicado

Abraham  Hola!!!!

No te imaginas la ayuda tan grande que me diste!!! Funciona perfecto lo único que me queda en duda es algo, aplique el primer código y funciona siempre y cuando la impresora PDF  creada se invoque con el mismo nombre. Mil y mil gracias!!!!!! :)

 

publicado

Si re revisas, yo use el nombre de mi impresora PDF:

WshNetwork.SetDefaultPrinter "Adobe PDF"

Y claro, cada quien lo adapta al nombre de la suya. Su tu intención es usar el archivo en varias PC, pues habría que buscar/detectar la PDF correspondiente de cada una lo que, te aseguro, no será tan fácil.

Abraham Valencia

publicado

Hola

Si mal no te entendí, creo que esto te ayudará, solo tendrías que adaptarlo a tus necesidades:

Sub ImpresorasConectadas()

Dim Items As Integer

Let UltimaFila = Cells(Rows.Count, 1).End(xlUp).Row + 1

With CreateObject("WScript.Network").EnumPrinterConnections
    For Items = 0 To .Count - 1 Step 2
        If UCase(.Item(Items + 1)) Like "*PDF*" Then
            MsgBox "La impresora pdf es: " & .Item(Items + 1)
        End If
    Next Items
End With

End Sub

Saludos

Abraham Valencia

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.