Excel - Botón vista previa en función de un formulario con la lista de hojas

Para Dante Amor.

Buenos días Dante,

He utilizado el código que facilitaste en el hilo siguiente y funciona perfectamente: https://www.todoexpertos.com/preguntas/5nhplmjjxoovjpsr/macro-de-excel-para-imprimir-varias-hojas-de-un-mismo-libro

El problema es que, en mi caso, se trata de un fichero utilizado por diferentes personas, que a veces hay que imprimir en color o blanco y negro, a veces hay que adaptar los márgenes,...

Se me ha ocurrido que lo mejor sería que, en lugar de imprimir directamente, se abriera la ventana de vista preliminar. Así el usuario podría ver cómo va a salir la impresión, cuántas páginas son, si hay que retocar los márgenes o si quiere incluir algún pie de página, por ejemplo.

Simplemente he sustituido la orden PrintOut por PrintPreview pero no funciona.

Private Sub CommandButton1_Click()
'Por.Dante Amor
    For i = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(i) Then
            h = ListBox1.List(i)
            Sheets(h).PrintPreview
        End If
    Next
End Sub
Private Sub UserForm_Activate()
'Por.Dante Amor
    ListBox1.MultiSelect = 1
    ListBox1.ListStyle = 1
    For Each h In Sheets
        ListBox1.AddItem h.Name
    Next
End Sub

Se abre la vista previa de la primera hoja pero el formulario sigue en primer plano y no se puede ni imprimir, ni ver la vista previa ni cerrar el formulario...

¿Podrías echarme una mano? ¿Se te ocurre algo para poder solucionar este problema?

1 Respuesta

Respuesta
2

Puedes descargar de aquí la nueva versión de la aplicación:

https://www.gerencie.com/enviar-varias-hojas-de-un-libro-de-excel-a-imprimir-o-archivo.html


Para ver la vista preliminar, realiza lo siguiente:

- Cambia la propiedad ShowModal del Userform a False

-  Agrega lo siguiente en el código:

Private Sub CommandButton1_Click()
'Por.Dante Amor
    Me.Hide
    For i = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(i) Then
            h = ListBox1.List(i)
            Sheets(h).PrintPreview
        End If
    Next
    Me.Show
End Sub

Buenos días Dante,

Como no voy a usar más que la vista previa (ni pdf, ni exportar, ni imprimir), me he quedado con el código antiguo más las modificaciones que me indicas en tu respuesta.

Funciona muy bien... sólo un pequeño detalle: me sale el formulario, elijo las pestañas y saltan las vistas previas. Pero, una vez que salgo de las vistas previas, se mantiene el formulario de selección pero se duplican las pestañas... es decir, me aparecen para seleccionar todas las pestañas 2 veces... y si vuelvo a sacar las vistas previas, me aparece el formulario con las pestañas 3 veces.

No es algo que impida el correcto funcionamiento de la macro pero, visualmente no queda demasiado "bonito".

¿Se te ocurre algo?

Gracias!

Puedes poner cómo te quedó el código para revisarlo.

Private Sub CommandButton1_Click()
'Por.Dante Amor
    Me.Hide
    For i = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(i) Then
            h = ListBox1.List(i)
            Sheets(h).PrintPreview
        End If
    Next
    Me.Show
End Sub
Private Sub UserForm_Activate()
'Por.Dante Amor
    ListBox1.MultiSelect = 1
    ListBox1.ListStyle = 1
    For Each h In Sheets
        ListBox1.AddItem h.Name
    Next
End Sub

Aquí está... Ves algo raro?

Cambia esta línea

Private Sub UserForm_Activate()

Por esta:

Private Sub UserForm_Initialize()

Lo que hace el evento Activate, es cargar el listbox cada que se activa el userform, en este caso, cada que presionas el botón, se oculta (hide) el userform y después se muestra (show); y vuelve a cargar el listbox. Es por eso que lo vamos a cambiar por el evento Initialize, para que solamente se cargue una vez el listbox cuando inicia el Userform.

Sal u dos

¡Gracias! 

Funciona perfectamente... eres un crack!! Me has ahorrado muchísimo trabajo...

Y te agradezco también la explicación. Aprender es más fácil gracias a gente como tú.

Un saludo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas