Buscar impresoras del sistema

Buenos dias valedor.
Preciso saber si mediante código puedo llamar a visualizar las impresoras que tengo instaladas en mi sistema, sin tener que crear una macro para cada impresora. De la manera que lo tengo montado ahora, si instalo una nueva, tengo que modificar la macro.
Te envió el código
Application.ActivePrinter = "EPSON LQ-680Pro ESC/P 2 en LPT1:"
Sheets("lista").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1
Sheets("datos").Select
Gracias
xabier

1 respuesta

Respuesta
1
Supongo que por -visualizar las impresoras intaladas- te refieres a saber que impresoras estan instaladas en tu equipo, Excel no cuenta con algun metodo para saber esto, pero se puede usar una función del API de windows, no se si las has usado alguna vez, agrega un nuevo modulo de código y copia/pega el siguiente código y prueba la macro MostrarImpresoras, verifica que funciones y despues puedes adaptarlo a tu código, por ejemplo, se podrian mostrar en un ComboBox para que le usuario seleccione la impresora donde quiere imprimir, saludos...
' Get information about all of the local printers using structure 1. Note how
' the elements of the array are loaded into an array of data structures manually. Also
' note how the following special declares must be used to allow numeric string pointers
' to be used in place of strings:
Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Long) As Long
Private Declare Function EnumPrinters Lib "winspool.drv" Alias "EnumPrintersA" (ByVal flags As Long, ByVal name As String, ByVal Level As Long, pPrinterEnum As Long, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long
Const PRINTER_ENUM_LOCAL = &H2
Private Type PRINTER_INFO_1
flags As Long
pDescription As String
pName As String
pComment As String
End Type
Private Sub MostrarImpresoras()
'KPD-Team 1999
'URL: http://www.allapi.net/
'E-Mail: [email protected]
Dim longbuffer() As Long ' resizable array receives information from the function
Dim printinfo() As PRINTER_INFO_1 ' values inside longbuffer() will be put into here
Dim numbytes As Long ' size in bytes of longbuffer()
Dim numneeded As Long ' receives number of bytes necessary if longbuffer() is too small
Dim numprinters As Long ' receives number of printers found
Dim c As Integer, retval As Long ' counter variable & return value
'Me.AutoRedraw = True 'Set current graphic mode to persistent
' Get information about the local printers
numbytes = 3076 ' should be sufficiently big, but it may not be
ReDim longbuffer(0 To numbytes / 4) As Long ' resize array -- note how 1 Long = 4 bytes
retval = EnumPrinters(PRINTER_ENUM_LOCAL, "", 1, longbuffer(0), numbytes, numneeded, numprinters)
If retval = 0 Then ' try enlarging longbuffer() to receive all necessary information
numbytes = numneeded
ReDim longbuffer(0 To numbytes / 4) As Long ' make it large enough
retval = EnumPrinters(PRINTER_ENUM_LOCAL, "", 1, longbuffer(0), numbytes, numneeded, numprinters)
If retval = 0 Then ' failed again!
Debug.Print "Could not successfully enumerate the printes."
End ' abort program
End If
End If
' Convert longbuffer() data into printinfo()
If numprinters <> 0 Then ReDim printinfo(0 To numprinters - 1) As PRINTER_INFO_1 ' room for each printer
For c = 0 To numprinters - 1 ' loop, putting each set of information into each element
' longbuffer(4 * c) = .flags, longbuffer(4 * c + 1) = .pDescription, etc.
' For each string, the string is first buffered to provide enough room, and then the string is copied.
printinfo(c).flags = longbuffer(4 * c)
printinfo(c).pDescription = Space(lstrlen(longbuffer(4 * c + 1)))
retval = lstrcpy(printinfo(c).pDescription, longbuffer(4 * c + 1))
printinfo(c).pName = Space(lstrlen(longbuffer(4 * c + 2)))
retval = lstrcpy(printinfo(c).pName, longbuffer(4 * c + 2))
printinfo(c).pComment = Space(lstrlen(longbuffer(4 * c + 3)))
retval = lstrcpy(printinfo(c).pComment, longbuffer(4 * c + 3))
Next c
' Display name of each printer
For c = 0 To numprinters - 1
MsgBox "Name of printer" & c + 1 & " is: " & printinfo(c).pName
Next c
End Sub
Fejoal, el código funciona correctamente, pero tengo un problema, solo me aparece la impresora que tengo instalada como LPT1 y no las que están en red. Posiblemente hay que modificarlo, pero no he sido capaz.
gracias
1.- No soy Fejoal
2.- En mi equipo me muestra perfectamente bien las impresoras de red, claro, siempre y cuando este compartidas y las reconozca el sistema
Valedor, perdona la confusión con el nombre, creo que no podré hacerlo, porque veo que la configuración de mis impresoras en red es un poco compleja, estan asignadas como si fueran una I.P, de todas manera el código es de gran utilidad.
Gracias por la ayuda.
xabier

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas