Discussion:
Vista previa sin cerrar formulario
(demasiado antiguo para responder)
Ivan
2006-09-04 20:46:14 UTC
Permalink
Hola a todos de nuevo.

aqui va un nuevo problema (para mi) que espero que, como siempre, me
ayudeis a resolver.

¿como puedo -supongo que es posible- abrir la vista previa de
impresion de una hoja, llamandola desde un formulario, sin tener que
cerrar este?

Las veces que lo he intentado el ordenador se me cuelga y tengo que
salir de excel con 'Finalizar programas'.

De la unica forma que lo consigo es cerrando el formulario: <Unload
Me:activesheet.printPreview>.

He pensado, aunque todavia no lo he probado, en asignar a una variable
(booleana, pej) un valor que me vuelva a abrir el formulario en el
evento de despues de imprimir (creo recordar que hay uno, no recuerdo
el nombre) de la hoja, o algo similar. Pero pienso que debe haber algo
mas sencillo.

Si podeis echarme una mano os lo agradezco.

Un saludo y hasta pronto
Ivan
Héctor Miguel
2006-09-04 20:53:57 UTC
Permalink
hola, Ivan !
como puedo -supongo que es posible- abrir la vista previa de impresion de una hoja
llamandola desde un formulario, sin tener que cerrar este?
Las veces que lo he intentado el ordenador se me cuelga y tengo que salir de excel con 'Finalizar programas'.
De la unica forma que lo consigo es cerrando el formulario: <Unload Me:activesheet.printPreview>. [...]
-> el -verdadero- 'problema' es que al mandar la ejecucion de la vista preliminar de impresion [PrintPreview por codigo]...
[se supone que] le estas 'cediendo el control' de la aplicacion ->al usuario<- :)) [entonces]...
a) al mostrar el formulario, asegurate que lo muestras en forma 'no-modal' [p.e. -> UserForm1.Show vbModeLess]
para que el usuario tenga la posibilidad de cancelar [o INCLUSO imprimir] o interactuar en el dialogo del printpreview
b) si la version de excel es menor a 2000, la presentacion de formularios 'no-modales' no tiene soporte 'directo' :-(
seria necesario echar mano de trucos adicionales :))
c) otra alternativa [si no quieres cederle el control al usuario] es pulsar la tecla {Esc} mientras el userform esta en printpreview
[por si las dudas, prueba como pudiera 'afectarle' si [NO] usas una instruccion 'application.screenupdating = false' -?-
d) otro punto que pudiera causar una -cierta- 'interferencia' es si dicho boton tiene la propiedad 'TakeFocusOnClick' en True -?-

comentas [si hubiera] detalles adicionales ?
saludos,
hector.
Ivan
2006-09-04 21:47:22 UTC
Permalink
Hola Hector Miguel, muchas gracias de nuevo.

He hecho pruebas con show vbModalLess, pero al estar el formulario ya
abierto en forma modal me da el error '401 no puede mostrar en forma no
modal si esta en forma modal'. ¿existe alguna forma de cambiar de
modal a no modal y viceversa, con el formulario ya cargado?

Quizas deberia mostrarlo desde el principio en forma no modal, pero
hace tiempo tuve un par de contratiempoos bastante engorrosos con
'modal si/modal no' y le he cogido un poco de respeto/miedo a su uso,
que me imagino tampoco debe ser especialmente complicado una vez cogido
el tranquillo.

En cuanto a que el usuario pueda interactuar, aunque no es necesario,
tampoco pasaria nada. Se trata de un formulario para mostrar/ocultar
columnas, para ordenar por un determinado campo e imprimir una hoja
desde el si se desea.

El temor lo tengo a que el usuario abra otro formulario desde la
interfax con este ya abierto y empiecen a surgir conflictos (que creo
recordar fue lo que me paso en mi anteriores tentativas con el modo,
aunque no estoy del todo seguro que fuera esto). ¿se puede abrir un
formulario, modal o no, estando uno no modal ya abierto?

Disculpa el rollo y gracias de nuevo

Un saludo y hasta pronto
Ivan
Post by Héctor Miguel
hola, Ivan !
como puedo -supongo que es posible- abrir la vista previa de impresion de una hoja
llamandola desde un formulario, sin tener que cerrar este?
Las veces que lo he intentado el ordenador se me cuelga y tengo que salir de excel con 'Finalizar programas'.
De la unica forma que lo consigo es cerrando el formulario: <Unload Me:activesheet.printPreview>. [...]
-> el -verdadero- 'problema' es que al mandar la ejecucion de la vista preliminar de impresion [PrintPreview por codigo]...
[se supone que] le estas 'cediendo el control' de la aplicacion ->al usuario<- :)) [entonces]...
a) al mostrar el formulario, asegurate que lo muestras en forma 'no-modal' [p.e. -> UserForm1.Show vbModeLess]
para que el usuario tenga la posibilidad de cancelar [o INCLUSO imprimir] o interactuar en el dialogo del printpreview
b) si la version de excel es menor a 2000, la presentacion de formularios 'no-modales' no tiene soporte 'directo' :-(
seria necesario echar mano de trucos adicionales :))
c) otra alternativa [si no quieres cederle el control al usuario] es pulsar la tecla {Esc} mientras el userform esta en printpreview
[por si las dudas, prueba como pudiera 'afectarle' si [NO] usas una instruccion 'application.screenupdating = false' -?-
d) otro punto que pudiera causar una -cierta- 'interferencia' es si dicho boton tiene la propiedad 'TakeFocusOnClick' en True -?-
comentas [si hubiera] detalles adicionales ?
saludos,
hector.
Ivan
2006-09-05 00:16:40 UTC
Permalink
Hola de nuevo Hector Miguel, y/o cualquiera que ande por ahi.

Para no faltar a mi costumbre de los authilos, aqui va lo que de
momento parece ser la solucion (posiblemente un poco chapucera, pero
hace el apaño) siguiendo el 'hilo' de tus consejos.

El codigo, tras elegir la hoja de impresion, y en funcion de una
variable asociada a un checkBox (ImprimirVisibles) que decide si se
imprimen todos los campos o solo los visibles, oculta el formulario
para volver a mostrarlo en forma no modal, y lo vuelve a ocultar para
no molestar en la vista previa ( no utilizo el metodo PrintPreview,
porque no se como volver a mostrar el formulario -ahora que lo pienso
no he probado a asoaciar el valor false/true a la ventana de vista
previa abierta con el metodo). Al salir de la vista previa se vuelve a
mostrar el formulario.

Private Sub DefinirImpresion()
Dim cVi As Byte
If optImprFavoritos = True Then _
Worksheets("Favoritos").Activate Else _
Worksheets("Listado").Activate
If ImprimirVisibles = False then
With ActiveSheet
Application.ScreenUpdating = False
For cVi = 69 To 90
If .Range(Chr(cVi) & 1).EntireRow.Hidden = True Then _
.Range(Chr(cVi) & 1).EntireRow.Hidden = False
Next
Application.ScreenUpdating = True
End With
End if
With Me
.Hide
.Show vbModeless
.Hide
End With
Select Case Application.Dialogs(xlDialogPrintPreview).Show
Case True, False
Me.Show
End Select
End Sub

Si me quieres/quereis dar algun consejo para mejorarlo, sera bien
recibido.

En cualquier caso muchas gracias
Un saludo y hasta pronto
Ivan

PD: el codigo esta modificado sobre la marcha en este editor de
mensajes, pues me he dado cuenta que estaba muy recargado. Antes
funcionaba bien, espero que ahora tambien.
Ivan
2006-09-05 00:41:47 UTC
Permalink
Otra vez mis autohilos:

a veces (muchas veces) soy muy burro y no pruebo lo evidente.

Resulta que no hace falta convertirlo en 'no modal' para abrir la vista
previa, basta con ocultarlo.

Disculpa/ad las molestias, aunque en cualquier caso ha servido para
atenuar un poco mis temores con el modo de los formularios.

De nuevo muchas gracias por todo.

Un saludo y hasta pronto
Ivan
Post by Ivan
Hola de nuevo Hector Miguel, y/o cualquiera que ande por ahi.
Para no faltar a mi costumbre de los authilos, aqui va lo que de
momento parece ser la solucion (posiblemente un poco chapucera, pero
hace el apaño) siguiendo el 'hilo' de tus consejos.
El codigo, tras elegir la hoja de impresion, y en funcion de una
variable asociada a un checkBox (ImprimirVisibles) que decide si se
imprimen todos los campos o solo los visibles, oculta el formulario
para volver a mostrarlo en forma no modal, y lo vuelve a ocultar para
no molestar en la vista previa ( no utilizo el metodo PrintPreview,
porque no se como volver a mostrar el formulario -ahora que lo pienso
no he probado a asoaciar el valor false/true a la ventana de vista
previa abierta con el metodo). Al salir de la vista previa se vuelve a
mostrar el formulario.
Private Sub DefinirImpresion()
Dim cVi As Byte
If optImprFavoritos = True Then _
Worksheets("Favoritos").Activate Else _
Worksheets("Listado").Activate
If ImprimirVisibles = False then
With ActiveSheet
Application.ScreenUpdating = False
For cVi = 69 To 90
If .Range(Chr(cVi) & 1).EntireRow.Hidden = True Then _
.Range(Chr(cVi) & 1).EntireRow.Hidden = False
Next
Application.ScreenUpdating = True
End With
End if
With Me
.Hide
.Show vbModeless
.Hide
End With
Select Case Application.Dialogs(xlDialogPrintPreview).Show
Case True, False
Me.Show
End Select
End Sub
Si me quieres/quereis dar algun consejo para mejorarlo, sera bien
recibido.
En cualquier caso muchas gracias
Un saludo y hasta pronto
Ivan
PD: el codigo esta modificado sobre la marcha en este editor de
mensajes, pues me he dado cuenta que estaba muy recargado. Antes
funcionaba bien, espero que ahora tambien.
Ivan
2006-09-05 00:54:41 UTC
Permalink
No hay tres sin cuatro

creo que acabo de comprender un poco mejor el concepto 'ceder el
control al usuario'.

del codigo expuesto hace ...... mensajes sobra una buena parte. Por lo
que se ve no hace falta usar application.Dialogs por que cuando se sale
de la vista previa el control vuelve automaticamnete al procedimiento.

El codigo quedaria asi (al menos de momento)

Private Sub DefinirImpresion()
Dim cVi As Byte
If optImprFavoritos = True Then _
Worksheets("Favoritos").Activate Else _
Worksheets("Listado").Activate
If ImprimirVisibles = False Then
With ActiveSheet
Application.ScreenUpdating = False
For cVi = 69 To 90
If .Range(Chr(cVi) & 1).EntireRow.Hidden = True Then _
.Range(Chr(cVi) & 1).EntireRow.Hidden = False
Next
Application.ScreenUpdating = True
Me.Hide
.PrintPreview
End With
End If
Me.Show
End Sub

Un saludo y disculpas de nuevo
Ivan
Héctor Miguel
2006-09-05 06:35:01 UTC
Permalink
hola, Ivan !
creo que acabo de comprender un poco mejor el concepto 'ceder el control al usuario'.
aprovechando que [seguramente] ya has 'probado' algunos 'efectos' de la interaccion entre usuario/aplicacion con el printpreview :))
y que mientras la aplicacion se encuentra en modo de impresion premilinar [bajo el control del usuario]...
[creo que] las preguntas [o situaciones a resolver] pudieran ser +/- las siguientes:

- que necesitas/quisieras/... que el usuario 'pueda' hacer mientras esta en el printpreview ???
recuerda que excel esta 'bajo su control'... por lo que puede modificar [incluso] la configuracion de pagina [margenes, etc.]
o imprimir/cancelar y tomando en cuenta que el evento '_beforeprint' se dispara igualmente por printpreview que por print :))

comentas [si hubiera] algun otro detalle ?
saludos,
hector.

__ el codigo expuesto __
El codigo quedaria asi (al menos de momento)
Private Sub DefinirImpresion()
Dim cVi As Byte
If optImprFavoritos = True Then _
Worksheets("Favoritos").Activate Else _
Worksheets("Listado").Activate
If ImprimirVisibles = False Then
With ActiveSheet
Application.ScreenUpdating = False
For cVi = 69 To 90
If .Range(Chr(cVi) & 1).EntireRow.Hidden = True Then _
.Range(Chr(cVi) & 1).EntireRow.Hidden = False
Next
Application.ScreenUpdating = True
Me.Hide
.PrintPreview
End With
End If
Me.Show
End Sub
Ivan
2006-09-05 20:36:50 UTC
Permalink
Hola Hector Miguel, lo primero agradecerte de nuevo tu atencion.
Post by Héctor Miguel
- que necesitas/quisieras/... que el usuario 'pueda' hacer mientras esta en el printpreview ???
recuerda que excel esta 'bajo su control'... por lo que puede modificar [incluso] la configuracion de pagina [margenes, etc.]
en realidad solo se trata de lo obvio, o sea, 'ver' la vista previa y
que decida lo que hacer: imprimir , configurar la pagina, acceder a las
opciones de impresion, o todo ello junto, pero que al finalizar estas
tareas o al cancelar(cerrar) vueva a estar activo el formulario.

como comentaba se trata de un formulario para facilitar la
ocultacion/muestra de columnas, pudiendo decidir si se imprimen solo
las visibles, todas o solo algunas pero diferentes de las visibles.
Quizas sea un poco innecesario pero pienso que pude facilitar algunas
de estas tareas, pues se trata de hojas con 26 campos, y manualmente
puede resultar un poco mareante. Te explico un poco el contenido del
formulario:

.-dos listbox, uno con los 26 campos para elegir, y el otro para
añadir o quitar los que se desee ver o imprimr (hay 4 fijos)
.-un combo para elegir campo de ordenacion entre los elegidos
.-dos optbutton para elegir la hoja que se va a imprimir 8lista general
o de favoritos)
.- un checkbox para decidir si se imprimen solo los visibles del
listbox 2 o se imprimen todos los campos

luego hay 4 comandbutton, y es donde surge el 'problema':

.-aceptar, imprimir, configurar y cancelar

posiblemente el de configurar lo quite pues realmente se podria acceder
desde imprimir, que es donde va el codigo expuesto.

La cosa es que al aceptar simplemente se ejecuta lo elegido en el
formulario (aunque tambien deja a la espera las decisiones para una
posterior impresion), pero puede ocurrir que se desee imprimir una cosa
y ver otra, de ahí el querer que el formulario se mantenga activo
despues de la impresion, o de su visualizacion/configuracion, para que
el usuario decida la vista definitiva de la hoja.

Al formulario se accede desde un boton de la barra de herramientas.

Creo que ahora mas o menos realiza lo que quiero, dado que, supongo, al
continuar el codigo depues de la vista previa(mostrando el formulario)
el usuario no puede tener acceso mas que a las sucesivas ventanas que
surgen de esta, teniendo al final que volver a ella para imprimir o
cancelar. Por cierto el codogo tiene un error, al final lo pongo
corregido.

En cuanto a beforeprint, pensaba que habia algo parecido a afterprint,
pero por lo que he buscado, parece ser que no. ¿hay algo similar?

Y despues de ste rollo, un comentario/consulta: que tiene de especial
printpreview con respecto a otros cuadros de dialogo (como configurar
pagina) que si se pueden abrir sin ocultar el formulario?

Bueno, disculpas de nuevo por la extension de la respuesta, pero es
para explicar un poco el sentido de todo esto.

En cualquier caso muchas gracias

Un saludo y hasta pronto
Ivan

El codigo corregido:

Private Sub DefinirImpresion()
Dim cVi As Byte
If optImprFavoritos = True Then _
Worksheets("Favoritos").Activate Else _
Worksheets("Listado").Activate
With ActiveSheet
If ImprimirVisibles = False Then
Application.ScreenUpdating = False
For cVi = 69 To 90
If .Range(Chr(cVi) & 1).EntireRow.Hidden = True Then _
.Range(Chr(cVi) & 1).EntireRow.Hidden = False
Next
Application.ScreenUpdating = True
End If
Me.Hide
.PrintPreview
End With
Me.Show
End Sub
Gabriel Raigosa
2006-09-30 16:36:52 UTC
Permalink
-- Carpeta
Descripción
Dirección

1
** Microsoft Excel *
http://esnips.com/web/GabrielRaigosa

2
Archivos para usar en clase
http://esnips.com/web/RaigosaClase

3
Fechas y Horas
http://esnips.com/web/RaigosaFechasHoras

4
Formato y Formato Condicional
http://esnips.com/web/RaigosaFormatos

5
Foro Excel
http://esnips.com/web/ForoExcel

6
Funciones de Busqueda
http://esnips.com/web/RaigosaBusqueda

7
Funciones de Texto
http://esnips.com/web/RaigosaTexto

8
Funciones Financieras
http://esnips.com/web/RaigosaFinancieras

9
Funciones Logicas
http://esnips.com/web/RaigosaLogicas

10
Graficos con Excel
http://esnips.com/web/RaigosaGraficos

11
Grupo (Sabados)
Privado

12
Grupo (Viernes)
Privado

13
Grupo Excel Septiembre
Privado

14
Juegos con Excel
http://esnips.com/web/RaigosaJuegosExcel

15
Macros con Excel
http://esnips.com/web/Macros-con-Excel

16
Manuales Excel
http://esnips.com/web/RaigosaManuales

17
Paginas WEB
http://esnips.com/web/RaigosaPaginasExcel

18
Practicas - XLS
http://esnips.com/web/RaigosaPracticasXLS

19
Tablas Dinámicas
http://esnips.com/web/RaigosaTablasDinamicas

20
TEST
http://esnips.com/web/GabrielRaigosa-test

21
Validación
http://esnips.com/web/RaigosaValidacion

22
Varios
http://esnips.com/web/RaigosaVarios

23
VBA - Visual Basic para Aplicaciones
http://esnips.com/web/RaigosaVBA


Gabriel Raigosa
http://esnips.com/web/Raigosa
http://esnips.com/web/ForoExcel
--------------------------------------------------------------------------------------------
"Ivan" <***@teleline.es> escribi� en el mensaje news:***@e3g2000cwe.googlegroups.com...
Hola a todos de nuevo.

aqui va un nuevo problema (para mi) que espero que, como siempre, me
ayudeis a resolver.

¿como puedo -supongo que es posible- abrir la vista previa de
impresion de una hoja, llamandola desde un formulario, sin tener que
cerrar este?

Las veces que lo he intentado el ordenador se me cuelga y tengo que
salir de excel con 'Finalizar programas'.

De la unica forma que lo consigo es cerrando el formulario: <Unload
Me:activesheet.printPreview>.

He pensado, aunque todavia no lo he probado, en asignar a una variable
(booleana, pej) un valor que me vuelva a abrir el formulario en el
evento de despues de imprimir (creo recordar que hay uno, no recuerdo
el nombre) de la hoja, o algo similar. Pero pienso que debe haber algo
mas sencillo.

Si podeis echarme una mano os lo agradezco.

Un saludo y hasta pronto
Ivan

Loading...