Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

vba ver las impresoras y escoger una

2,377 views
Skip to first unread message

et

unread,
Aug 24, 2004, 3:39:51 PM8/24/04
to
Con application.dialogs(xldialogprinter) puedo ver el menú de impresoras y
seleccionar la que deseo, pero a alguién se le ocurre como hacerlo con una
macro.
Gracias


Héctor Miguel

unread,
Aug 25, 2004, 1:12:31 AM8/25/04
to
hola, et !

> Con application.dialogs(xldialogprinterSETUP) puedo ver ... impresoras y seleccionar la que deseo
> ... como hacerlo con una macro.

[hasta donde se...] las 'bases' serian las siguientes:
-> puedes obtener un listado de las impresoras instaladas [p.e.]
creando un objeto ("WScript.Network").EnumPrinterConnections
que te devuelve una matriz de dos dimensiones indicando 1° el puerto y 2° el nombre de cada impresora
-> con Application.ActivePrinter puedes 'tomar' [y 'dejar'] los datos de la impresora activa
si la vas a usar para 'cambiar' la impresora activa [por macros]... ->se requiere<-
1.- el nombre de la impresora
2.- una preposicion que indique...
3.- el puerto hacia el que se dirige la salida de la impresora
4.- dos puntos ->:<- para 'finalizar' la cadena
-> la preposicion [si en español... 'en' si en ingles... 'on' si en frances... 'sur' etc.]
=> NO te la proporciona <= el 'EnumPrinterConnections' [NI los dos puntos] :-((
tendrias que 'adivinarla' [asumiendo quizas una u otra] o... 'tomarla' de Application.ActivePrinter
[ademas] usar a la inversa las dimensiones de la matriz que devuelve 'EnumPrinterConnections'
=> 1° la segunda [nombre de la impresora] y 2° la primera [el puerto de conexion]
-> con respecto del puerto de conexion...
la matriz podria 'devolverte' [p.e.] un puerto USB001 [o alguna conexion de red]
y el Application.ActivePrinter 'mostraria' [p.e.] un puerto de conexion tipo 'Ne02:

te expongo en seguida un ejemplo [muy 'basico'] del uso del objeto 'WScript.Network'
presentando la informacion en un MsgBox [y asumiendo español para la preposicion -> en <-]
si quisieras que el usuario 'seleccione' de entre las opciones... podrias [p.e.]
cambiar el MsgBox por un InputBox ->manteniendo en alguna matriz 'global'<- las devoluciones del objeto]
[creo que sigue siendo mas 'sencillo' la presentacion del dialogo (xlDialogPrinterSetup)] :))

si cualquier duda... ¿comentas?
saludos,
hector.
=== en un modulo de codigo 'normal' ===
Sub Informar_Impresoras()
Dim Txt As String, Sig As Integer
Txt = "Las impresoras disponibles son:"
With CreateObject("WScript.Network").EnumPrinterConnections
For Sig = 0 To .Count - 1 Step 2
Txt = Txt & vbCr & (Sig + 2) / 2 & ".- " & .Item(Sig + 1) & " en " & .Item(Sig)
Next
End With
Txt = Txt & vbCr & vbCr & "Impresora activa:" & vbCr & Application.ActivePrinter
MsgBox Txt, , "Lista de impresoras"
End Sub

et

unread,
Aug 25, 2004, 11:04:48 AM8/25/04
to
Ante todo gracias, me voy a poner a ahora mismo a probar la solución
propuesta.
"Héctor Miguel" <NOhemio...@PLShotmail.com> escribió en el mensaje
news:uGcBiImi...@tk2msftngp13.phx.gbl...

et

unread,
Aug 26, 2004, 1:22:08 PM8/26/04
to
Estoy de acuerdo que la opción más sencilla es la de mostrar el diálogo de
impresora y que se elija desde el.
¿Cómo crees que se podría hacer un array con los datos proporcionados por
Application.ActivePrinter y escoger la impresora de forma automática, según
el modelo que quiera imprimir?
Obvio que con vba para que el usuario tenga limitado el acceso a la barra de
herramientas.

Gracias mil


"Héctor Miguel" <NOhemio...@PLShotmail.com> escribió en el mensaje
news:uGcBiImi...@tk2msftngp13.phx.gbl...

Héctor Miguel

unread,
Aug 26, 2004, 9:06:53 PM8/26/04
to
hola, et !

> ... de acuerdo que la opcion mas sencilla es ... mostrar el dialogo de impresora y que se elija desde el.
> ... ¿...hacer un array ... y escoger la impresora de forma automatica, segun el modelo que quiera imprimir?
> ... con vba para que el usuario tenga limitado el acceso a la barra de herramientas.

me encontre con algunas 'barreras' :-( como...
-> 'pasarle' a 'ActivePrinter' el puerto de conexion ->EXACTO<-
lo cual [generalmente] FALLA cuando interviene algun puerto 'variable' como redes o usb's :-((
-> para no hacerte el cuento 'largo'... ->acabe usando<- el xlDialogPrinterSetup
[aunque... de manera -casi- 'imperceptible' para el usuario] :D

la siguiente 'secuencia' de procedimientos muestra un inputbox para [opcionalmente] cambiar de impresora 'activa'
espero que sea +/- lo que necesitas ;)


saludos,
hector.
=== en un modulo de codigo 'normal' ===

Sub MostrarImpresoras(): Dim Msj As String, Sig As Integer, Cambiar As String
Msj = vbTab & "Disponibles:": InfoDeImpresoras
For Sig = 1 To UBound(IMPNombres)
Msj = Msj & vbCr & Sig & ".- " & IMPNombres(Sig)
Next: Msj = Msj & vbCr & vbTab & _
"Activa:" & vbCr & Activa & ".- " & Application.ActivePrinter & vbCr & _
"Puedes seleccionar una impresora distinta de la activa..."
Cambiar = Trim(InputBox(Msj, "Cambiar impresora activa", Activa))
If Cambiar = "" Then GoTo SinCambios
If Cambiar = Activa Then GoTo SinCambios
If Cambiar > 0 And Cambiar <= UBound(IMPNombres) Then
If Cambiar > Activa _
Then SendKeys "{Down " & Cambiar - Activa & "}~" _
Else SendKeys "{Up " & Activa - Cambiar & "}~"
Application.Dialogs(xlDialogPrinterSetup).Show
Else
SinCambios:
MsgBox "No hubo cambio en la impresora activa." & _
vbCr & "Sigue siendo: " & Application.ActivePrinter
End If
End Sub
=== en un modulo de codigo 'normal' [y privado por si las dudas] ===
Option Private Module: Option Base 1: Option Compare Text: Public IMPNombres, Activa As Integer
Sub InfoDeImpresoras()
Dim Sig As Integer, Men(32) As Integer, May(32) As Integer, _
Pri As Integer, Ult As Integer, n1 As Integer, n2 As Integer, Tmp, Prov
With CreateObject("WScript.Network").EnumPrinterConnections
ReDim Mtx(.Count / 2)
For Sig = 1 To .Count Step 2: Mtx((Sig + 1) / 2) = .Item(Sig): Next
End With: Pri = LBound(Mtx): Ult = UBound(Mtx): Sig = 1: Men(Sig) = Pri: May(Sig) = Ult
Do
If Ult > Pri Then
Prov = Mtx(Ult): n1 = Pri - 1: n2 = Ult
Do
Do: n1 = n1 + 1: Loop Until Mtx(n1) >= Prov
Do: n2 = n2 - 1: Loop Until n2 = Pri Or Mtx(n2) <= Prov
Tmp = Mtx(n1): Mtx(n1) = Mtx(n2): Mtx(n2) = Tmp
Loop Until n2 <= n1
Tmp = Mtx(n2): Mtx(n2) = Mtx(n1): Mtx(n1) = Mtx(Ult): Mtx(Ult) = Tmp: Sig = Sig + 1
If (n1 - Pri) > (Ult - n1) Then
Men(Sig) = Pri: May(Sig) = n1 - 1: Pri = n1 + 1
Else: Men(Sig) = n1 + 1: May(Sig) = Ult: Ult = n1 - 1
End If
Else: Pri = Men(Sig): Ult = May(Sig): Sig = Sig - 1: If Sig = 0 Then Exit Do
End If: Loop: IMPNombres = Mtx
For Sig = 1 To UBound(IMPNombres)
If EsActiva(IMPNombres(Sig)) Then
Activa = Sig: Exit For
End If: Next
End Sub
Function EsActiva(ByVal Esta As String) As Boolean
With Application: EsActiva = (Len(.ActivePrinter) > Len(.Substitute(.ActivePrinter, Esta, ""))): End With
End Function

et

unread,
Aug 27, 2004, 12:35:33 PM8/27/04
to
Como siempre, muchas gracias.
Y ya exprimendote un poco más: algún curso o libro donde pueda aprender un
poco más porque estoy francamente alucinado contigo.

Gracias de nuevo.

Un saludo


"Héctor Miguel" <NOhemio...@PLShotmail.com> escribió en el mensaje

news:%23P79mI9...@TK2MSFTNGP15.phx.gbl...

Héctor Miguel

unread,
Aug 27, 2004, 5:23:50 PM8/27/04
to
hola, et !

> Como siempre, muchas gracias.
=> como siempre [que se presenta la ocasion...] => gracias a ti [por el 'feed-back'] ;)

> ... algun curso o libro donde pueda aprender un poco mas [...]
=> me gustaria decirte que leyendo 'tales o cuales' libros ... [pero, estaria siendo 'excluyente'] ;)
todo material de estudio [manuales, {F1}, libros,cursos, web's, estos foros, etc.] ->es excel...ente<-
mas bien [creo yo que], cada quien 'avanza al ritmo que puede/quiere/necesita' ;)
ademas considera que [en muchas de las ocasiones]
-> 'buscando una cosa'... 'encuentras... otra' [que se te habia 'perdido']
-> o ['te topas' con] 'la hermana que se escapo de su prision' [sor-presa... ¡ NO esta !!!] :))
=> cuando 'se atora la carreta' [que nos sucede a todos] :-(
NO es 'imprescindible' saberlo todo ;) es suficiente con saber...
el telefono del que sabe... o el e-mail... o la web... o... ¿porque no consultas en el foro? :D

saludos,
hector.

et

unread,
Aug 28, 2004, 3:41:04 AM8/28/04
to
gracias.

"Héctor Miguel" <NOhemio...@PLShotmail.com> escribió en el mensaje
news:uQnpowH...@tk2msftngp13.phx.gbl...
0 new messages