Imprimir desde un módulo VBA

Resuelto
Mistral_13200 Mensajes publicados 649 Estado Miembro -  
 Oz -
Hola,
Hola a todos,
He creado un libro de Excel en el que tengo un módulo VBA para la impresión. Este libro está a disposición de varias decenas de usuarios. Funciona muy bien y es apreciado por todos. Sin embargo, se me pide que lo mejore permitiendo elegir la impresora (en caso de que varias impresoras estén conectadas a la computadora) o elegir la calidad de impresión. Para ello, me gustaría que en mi macro de impresión a continuación llamara y mostrara el cuadro de diálogo "Imprimir", ¡pero no logro hacerlo!

Sub ImpresionTabla() Dim p As Integer 'Application.ScreenUpdating = False ' Bloquea la actualización de la pantalla. 'Application.EnableEvents = False ' Detiene la verificación. If Sheets("Bordereau").Range("A28").Value = "" Then ' Prueba si la primera celda utilizada, A28. MsgBox ("¡La tabla no ha sido completada!" & vbCrLf & " " & vbCrLf & "Por lo tanto, no hay nada que imprimir."), vbCritical, "Federación Trucmuche" Exit Sub End If 'Define el área completa Sheets("Tabla").PageSetup.PrintArea = "$A$1:$N$235" ' Parte de la hoja utilizada. p = Nb_LineaBdx ' Salta a la función Nb_LineaBdx p = Nb_PaginasBdx(p) ' Salta a la función Nb_PaginasBdxN2 With Sheets("Tabla") .Visible = True .PrintOut from:=1, To:=p .Visible = False End With Application.ScreenUpdating = True ' Restaura la actualización de la pantalla. Application.EnableEvents = True ' Restablece la verificación. End Sub ' Calcula y devuelve el N° de la última línea no vacía. Function Nb_LineaBdx() As Integer Dim I As Integer For I = 28 To 235 If Sheets("Tabla").Range("A" & I).Value = "" Then Exit For ' Prueba la primera celda vacía de la columna A. Next I Nb_LineaBdx = I - 1 End Function ' Calcula y devuelve el número de páginas. Function Nb_PaginasBdx(Lineas As Integer) As Integer Select Case Lineas Case 1 To 58: Nb_PaginasBdx = 1 Case 59 To 110: Nb_PaginasBdx = 2 Case 111 To 162: Nb_PaginasBdx = 3 Case 163 To 214: Nb_PaginasBdx = 4 Case Is > 214: Nb_PaginasBdx = 5 End Select End Function

Independientemente de esta modificación, el libro y la impresión funcionan muy bien.
¿Puede ayudarme?
De antemano, gracias.
Mistral

37 respuestas

  • 1
  • 2
michel_m Mensajes publicados 18903 Fecha de registro   Estado Colaborador Última intervención   3 320
 
Hola,

Para elegir una impresora
Application.Dialogs(xlDialogPrint).Show

y normalmente tienes el botón "propiedades de la impresora"

esta sintaxis quizás no funcione en red (yo estoy en un solo puesto) en ese caso habría que utilizar WMI... Dices.
Michel
0
Mistral_13200 Mensajes publicados 649 Estado Miembro 4
 
Hola Michel,

Gracias por tu respuesta y por tu rapidez.

He hecho una prueba en un simple libro y funciona correctamente, al menos para las propiedades de la impresora. Me queda probar esto con varias impresoras.
Sin embargo, no consigo integrar esta línea en mi módulo mientras conservo el cálculo del número de páginas a imprimir.
¿Tienes alguna idea?
Atentamente,
Mistral
0
Mistral_13200 Mensajes publicados 649 Estado Miembro 4
 
Re,

De hecho, tengo muchas dificultades para entender todos los argumentos (15 en total) de la instrucción:

Application.Dialogs(xlDialogPrint).Show(, 2, [p], 7, , , , , , , , , , , 1)


Consigo validar el número de páginas a imprimir (de 2 a [p]) así como el número de copias (7), pero no logro validar la opción "Páginas" y, sin embargo, pongo bien el décimoquinto argumento en 1.

¿Tendrías alguna idea o solución que me propongas?
Cordialmente
Mistral
0
michel_m Mensajes publicados 18903 Fecha de registro   Estado Colaborador Última intervención   3 320
 
Lo siento, no veo nada en absoluto...
0
Le Pingou Mensajes publicados 12273 Fecha de registro   Estado Colaborador Última intervención   1 476
 
Hola,
Intenta con este código que te permite elegir la impresora (clic en OK para validar la selección):
Application.Dialogs(Excel.xlBuiltInDialog.xlDialogPrinterSetup).Show
Y en tu código recuperas el nombre de la impresora activa que colocas como argumento adicional de
PrintOut .PrintOut from:=1, To:=p .....


O con esto:
Sub choix_imprimante imprimante = Application.Dialogs(xlDialogPrinterSetup).Show Application.ActivePrinter = imprimante End Sub
Saludos.
El Pingüino
0
Mistral_13200 Mensajes publicados 649 Estado Miembro 4
 
Hola Le Pingou,
Primero que nada, gracias por interesarte en mi problema.
Quise probar las dos soluciones propuestas, pero debo reconocer que me estoy perdiendo un poco.
En la primera, efectivamente se abre la ventana de selección de la impresora, puedo elegirla y configurar la impresión con la tecla "Configurar", pero no veo cómo recuperar el nombre de la impresora ni cómo insertarlo después.
En la segunda tengo un error 1004: El método ActivePrinter del objeto Application ha fallado.
¿Puedes ayudarme, por favor?
Atentamente
Mistral
0
pijaku Mensajes publicados 13513 Fecha de registro   Estado Moderador Última intervención   2 772
 
Hola,
La instrucción dada por Le Pingou :
imprimante = Application.Dialogs(xlDialogPrinterSetup).Show
devuelve "verdadero" o "falso". Verdadero y falso no son nombres de impresora (;-)) te recomiendo :
Sub elección_impresora() Dim impresora As String, ImpresoraInicial As String ImpresoraInicial = Application.ActivePrinter Application.Dialogs(xlDialogPrinterSetup).Show impresora = Application.ActivePrinter MsgBox impresora Application.ActivePrinter = ImpresoraInicial End Sub


Respuesta editada para la adición de ImpresoraInicial que permite restablecer los parámetros predeterminados......
0
Le Pingou Mensajes publicados 12273 Fecha de registro   Estado Colaborador Última intervención   1 476
 
Hola pijaku,
Sí, de acuerdo con usted, sin embargo, como él quiere utilizar el comando [PrintOut] he aclarado lo siguiente:
Y en su código recuperan el nombre de la impresora activa que colocan como argumento adicional de PrintOut .PrintOut from:=1, To:=p , .....
Saludos.
El Pingüino
0
pijaku Mensajes publicados 13513 Fecha de registro   Estado Moderador Última intervención   2 772
 
Hola El Pingüino,
Exacto. Mi respuesta era solo un complemento a la tuya.
Que tengas un buen día.
Hasta pronto.
0
Le Pingou Mensajes publicados 12273 Fecha de registro   Estado Colaborador Última intervención   1 476
 
Hola Mistral_13200,
Sí, puedo ayudarte, es difícil responder sin ver el código que has creado.. !

Nota: en cuanto a la primera, no he dicho la tecla [Configurar] sino: haz clic en Aceptar para validar la opción, lo cual es diferente.

Saludos.
El Pingüino
0
Mistral_13200 Mensajes publicados 649 Estado Miembro 4
 
El Pingou,
Pijaku

Hola a los dos,

Gracias por dedicar su tiempo a resolver mi problema.

Todo el código de mi macro está en mi primer mensaje. Solo recordaría que este código funciona perfectamente tal como está. Sin embargo, algunos usuarios me piden que lo modifique para poder elegir la impresora y la calidad de impresión.
He entendido que hay que validar la elección de la impresora con OK, simplemente quería decir que también se podría intervenir en los parámetros de la impresora si se desea.
Es en la integración de la impresora predeterminada en mi macro donde me atasco y es precisamente ahí donde necesito su ayuda.
Ahora, si ustedes consideran que la instrucción
PrintOut
no es adecuada, no tengo nada en contra de cambiarla, pero no sé por cuál.
He intentado:

Application.Dialogs(xlDialogPrint).Show(, 2, [p], 7, , , , , , , , , , , 1)

Pero ahí me atoro en la forma de validar la opción de página de la ventana "Imprimir". Sé recuperar el Nb de página y el Nb de copias y eso es indispensable para imprimir solo el Nb de página necesario.

De todas maneras, muchas gracias a los dos.
Atentamente
Mistral
0
Le Pingou Mensajes publicados 12273 Fecha de registro   Estado Colaborador Última intervención   1 476
 
Hola,
Sí, pero no es el código con la corrección el que no funciona.
En este caso, las líneas de código que debes tener justo después de la línea:
 p = Nb_PagesBdx(p)
:
Application.Dialogs(Excel.XlBuiltInDialog.xlDialogPrinterSetup).Show Nom = ActivePrinter With Sheets("Tableau") .Visible = True .PrintOut from:=1, To:=p, ActivePrinter:=Nom .Visible = False End With

Nota: en el cuadro de diálogo eliges la impresora y validas con OK.
--
Saludos.
El Pingüino
0
michel_m Mensajes publicados 18903 Fecha de registro   Estado Colaborador Última intervención   3 320
 
Hola a todos,

Por casualidad
No he encontrado ayuda sobre tus 15 argumentos (...?...) y no entiendo este 1.... cuando hablas de "hojas", ¿te refieres a hojas dentro de una "tabla" de Excel?

Para encontrar el número de hojas por tabla, encontré esta instrucción en otro sitio
ExecuteExcel4Macro("GET.DOCUMENT(50)")

y para imprimir:
FeuilN.PrintOut From:=1 To:=ExecuteExcel4Macro("GET.DOCUMENT(50)"


pero....
--
Michel
0
Mistral_13200 Mensajes publicados 649 Estado Miembro 4
 
Hola Michel,

La instrucción:

Application.Dialogs(xlDialogPrint).Show(, 1, [p], 7, , , , , , , , , , , 1)

tiene 15 argumentos de configuración posibles que son:

range_num, from, to, copies, draft, preview, print_what, color, feed, quality, y_resolution, selection, printer_text, print_to_file, collate

Puedo configurar sin problema las páginas que deseo imprimir (de 1 a p) y el número de ejemplares a imprimir (7), ver el ejemplo anterior, pero no logro validar la opción de páginas en la parte "Rango" del cuadro de diálogo Imprimir, siempre queda en "Todo". Por lo tanto, imprimo toda la hoja del libro, es decir, 25 páginas.

Atentamente
Mistral
0
michel_m Mensajes publicados 18903 Fecha de registro   Estado Colaborador Última intervención   3 320
 
Pequeña pregunta: ¿por qué poner p entre corchetes?

En cuanto al 1 del argumento n)15 collate, no es necesario porque collate:= true por defecto

con el grabador de macros extensión página 1 a 2
ActiveWindow.SelectedSheets.PrintOut From:=1, To:=2, Copies:=1
0
Le Pingou Mensajes publicados 12273 Fecha de registro   Estado Colaborador Última intervención   1 476
 
Hola Mistral_13200,
Una de las soluciones está aquí: https://forums.commentcamarche.net/forum/affich-21020404-imprimer-depuis-un-module-vba#12
Lo he probado y funciona.
¿Es posible saber si para ustedes está en orden?
Saludos.
El Pingüino
0
Mistral_13200 Mensajes publicados 649 Estado Miembro 4
 
porque "p" es una variable, es el resultado del cálculo del número de páginas a imprimir.

Para ser más preciso, en la parte Alcance de la ventana Imprimir hay dos opciones: "Todo" y "Página(s)" quiero cambiar de "Todo" a "Página(s)" y no puedo.
0
Le Pingou Mensajes publicados 12273 Fecha de registro   Estado Colaborador Última intervención   1 476
 
Hola Mistral_13200,
Entonces, con mi propuesta (pos 12) se respetan los valores de sus variables.
Lamento si esto no es de su agrado.
Saludos.
El Pingüino
0
Mistral_13200 Mensajes publicados 649 Estado Miembro 4
 
Estoy un poco perdido en medio de todos estos mensajes, pero he respondido a tu propuesta, quizás no en el orden correcto y te pido disculpas.

Estoy de acuerdo, las variables están respetadas.
Aparentemente, solo queda, más fácil de decir que de hacer, poder modificar los parámetros de impresión como la calidad Normal/Borrador o N&B/Color.
0
Mistral_13200 Mensajes publicados 649 Estado Miembro 4
 
Re El Pingüino,

Parece que efectivamente funciona la impresora, ya que está bien reconocida como la predeterminada. ¡Eso ya es algo bueno!
Sin embargo, si cambio la calidad de impresión o si elijo imprimir en B/N o en color utilizando el botón "Configurar" de la ventana de diálogo, no pasa nada y, sin embargo, confirmo correctamente con Ok.
De hecho, diría que mantengo los parámetros de impresión de la última configuración manual.
No entiendo nada...
Atentamente
Mistral
0
Le Pingou Mensajes publicados 12273 Fecha de registro   Estado Colaborador Última intervención   1 476
 
Hola,
Sí, parece que es más fácil decirlo que hacerlo, poder modificar los parámetros de impresión como la calidad Normal/Borrador o N&B/Color y para que eso funcione hay que pasar los parámetros elegidos al procedimiento.
¿Puede mencionar exactamente qué parámetros serán permitidos para el usuario?

--
Saludos.
El Pingüino
0
Le Pingou Mensajes publicados 12273 Fecha de registro   Estado Colaborador Última intervención   1 476
 
Hola Mistral_13200,
Acabo de realizar pruebas con el código que le propuse, cambiando los diversos valores de configuración, negro/blanco, colores, orientación (Vertical/Horizontales), etc. y todo funciona perfectamente con el código tal como está.

--
Saludos.
El Pingüino
0
Mistral_13200 Mensajes publicados 649 Estado Miembro 4
 
Hola Le Pingou,

Yo también hice otras pruebas anoche en otra computadora y otra impresora y efectivamente pude cambiar la calidad de impresión y el color. Desafortunadamente, en el club no tengo impresoras en red...
Voy a averiguar por qué en mi impresora color me quedo en B/N???

Cuando haya solucionado mi problema y si me lo permites, me volveré a poner en contacto contigo si tengo más preguntas.
Una vez más, muchas gracias a los tres por su ayuda.
Atentamente
Mistral

PD: Estaré ausente hasta el 21/03
0
Le Pingou Mensajes publicados 12273 Fecha de registro   Estado Colaborador Última intervención   1 476
 
Hola,
Voy a mirar por qué en mi impresora de color sigo en blanco y negro???
Probablemente reinstalar el software de la impresora!
¡Buenas vacaciones!
Saludos.
El Pingüino
0
Mistral_13200 Mensajes publicados 649 Estado Miembro 4
 
Re,

Es exactamente lo que acabo de hacer y el problema persiste.
A continuación, el código completo con el que realizo mis pruebas y por el cual no creo haber cometido un error.

Sub ImpressionTableau() Dim p As Integer Application.ScreenUpdating = False ' Bloquea la actualización de la pantalla. Application.EnableEvents = False ' Detiene la revisión. If Sheets("Tableau").Range("A28").Value = "" Then ' Prueba si la primera celda utilizada, A28. MsgBox ("¡El Tabla no ha sido ingresado!" & vbCrLf & " " & vbCrLf & "Por lo tanto, no hay nada que imprimir."), vbCritical, "Federación Trucmuche" Exit Sub End If 'Define el área completa Sheets("Tableau").PageSetup.PrintArea = "$A$1:$N$235" ' Parte de la hoja utilizada. p = Nb_LigneBdx ' Salta a la función Nb_LigneBdx p = Nb_PagesBdx(p) ' Salta a la función Nb_PagesBdx 'p = 9 If Application.Dialogs(Excel.XlBuiltInDialog.xlDialogPrinterSetup).Show = False Then GoTo Line1 Else Nom = ActivePrinter With Sheets("Tableau") .Visible = True .PrintOut from:=1, To:=p, ActivePrinter:=Nom '.Visible = False 'A poner de nuevo en la versión definitiva. End With End If Line1: Application.ScreenUpdating = True ' Restaura la actualización de la pantalla. Application.EnableEvents = True ' Reestablecimiento del servicio de revisión. End Sub ' Calcula y devuelve el número de la última línea no vacía. Function Nb_LigneBdx() As Integer Dim I As Integer For I = 28 To 235 If Sheets("Tableau").Range("B" & I).Value = "" Then Exit For ' Prueba la primera celda vacía de la columna A. Next I Nb_LigneBdx = I - 1 End Function ' Calcula y devuelve el número de páginas. Function Nb_PagesBdx(Lignes As Integer) As Integer Select Case Lignes Case 1 To 58: Nb_PagesBdx = 1 Case 59 To 110: Nb_PagesBdx = 2 Case 111 To 162: Nb_PagesBdx = 3 Case 163 To 214: Nb_PagesBdx = 4 Case Is > 214: Nb_PagesBdx = 5 End Select End Function


Si ves alguna anomalía, gracias por señalármelo.
Desahogarme no me hará daño...
Cordialmente
Mistral
0
Le Pingou Mensajes publicados 12273 Fecha de registro   Estado Colaborador Última intervención   1 476
 
Hola,
La parte que toca a la impresora es correcta.
Para evitar el [GoTo Line1] lo escribiría de esta manera:
If Application.Dialogs(Excel.XlBuiltInDialog.xlDialogPrinterSetup).Show = True Then Nom = ActivePrinter With Sheets("Tableau") .Visible = True .PrintOut from:=1, To:=p, ActivePrinter:=Nom '.Visible = False 'A reponer en la versión definitiva. End With End If

Nota: para su impresora, asegúrese de que la modificación de los parámetros se tenga en cuenta directamente sin pasar por el procedimiento VBA.

--
Saludos.
El Pingüino
0
Mistral_13200 Mensajes publicados 649 Estado Miembro 4
 
Hola L e Pingou,

Vuelvo a la carga porque aún no funciona. He reinstalado mi impresora y funciona con normalidad. Si realizo pruebas de impresión manualmente desde Archivo/Imprimir, imprimo bien en B/N o en color según mis elecciones. Lo mismo para la calidad de impresión Normal/Borrador.

Sin embargo, cuando hago pruebas utilizando la macro, tengo dos problemas (En ese momento, la impresora está configurada en color/Normal):
Primer intento: Inicio la impresión con el botón y valido la elección por OK sin cambiar nada. La impresión es en B/N aunque la impresora estaba configurada en color y se mantuvo así. ¿Por qué?
Segundo intento: Inicio la impresión y configuro la impresión en B/N y luego valido por OK. La impresión se realiza correctamente en B/N (la impresora está OK, verificado por Archivo/Imprimir) pero aparece el segundo problema, que es que tengo dos líneas punteadas que aparecen en el borde derecho de las celdas de las columnas G y N. ¿Por qué?
Tercer intento: Inicio la impresión y configuro la impresión en Color, luego valido por OK. La impresión se realiza en B/N aunque la impresora ha cambiado a color (la impresora está OK, verificado por Archivo/Imprimir)!!!
Todas estas pruebas se realizaron en el libro cuyo enlace está a continuación:

http://www.cijoint.fr/cjlink.php?file=cj201103/cij3nbfyED.xls

¿Puedes ayudarme porque realmente ya no entiendo nada?
Gracias de antemano.
Atentamente
Mistral
0
Le Pingou Mensajes publicados 12273 Fecha de registro   Estado Colaborador Última intervención   1 476
 
Hola,
Todo funciona correctamente en mi casa.
¿Ha revisado su macro paso a paso?
Intente también desactivar el evento: `EnableEvents'.

--
Saludos.
El Pingüino
0
  • 1
  • 2