vba ver las impresoras y escoger una

24/08/2004 - 21:39 por et | Informe spam
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

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
25/08/2004 - 07:12 | Informe spam
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
Respuesta Responder a este mensaje
#2 et
25/08/2004 - 17:04 | Informe spam
Ante todo gracias, me voy a poner a ahora mismo a probar la solución
propuesta.
"Héctor Miguel" escribió en el mensaje
news:
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

Respuesta Responder a este mensaje
#3 et
26/08/2004 - 19:22 | Informe spam
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" escribió en el mensaje
news:
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

Respuesta Responder a este mensaje
#4 Héctor Miguel
27/08/2004 - 03:06 | Informe spam
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
Respuesta Responder a este mensaje
#5 et
27/08/2004 - 18:35 | Informe spam
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" escribió en el mensaje
news:%
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

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida