2009-11-23 26 views
7

El siguiente código de VBA se detiene en Me.Show. Según mis pruebas, parece que Me.Show detiene la ejecución de todos los códigos, incluso si el código está dentro del UserForm.¿Por qué mostrar un UserForm como ejecución modal de código de detención?

Esta parte está fuera del UserForm:

Public Sub TestProgress() 
    Dim objProgress As New UserForm1 
    objProgress.ShowProgress 
    Unload objProgress 
End Sub 

Esta parte está dentro de la UserForm:

Private Sub ShowProgress() 
    Me.Show vbModal 
    Dim intSecond As Integer 
    For intSecond = 1 To 5 
     Application.Wait Now + TimeValue("0:00:01") 
     Me.ProgressBar1.Value = intSecond/5 * 100 
    Next intSecond 
    Me.Hide 
End Sub 

El código se detiene en Me.Show, después de que se muestra el formulario de usuario. No hay ningún error, solo interrumpe la ejecución del código. Parece que la única manera de ejecutar código dentro de un formulario de usuario modal en VBA es incluirlo en el procedimiento UserForm_Activate así:

Esta parte está fuera del formulario de usuario:

Public Sub TestProgress() 
    Dim objProgress As New UserForm1 
    Load objProgress 
    Unload objProgress 
End Sub 

Esta pieza dentro del formulario de usuario:

Private Sub UserForm_Initialize() 
    Me.Show vbModal 
End Sub 

Private Sub UserForm_Activate() 
    Dim intSecond As Integer 
    For intSecond = 1 To 5 
     Application.Wait Now + TimeValue("0:00:01") 
     Me.ProgressBar1.Value = intSecond/5 * 100 
    Next intSecond 
    Me.Hide 
End Sub 

Por supuesto, no puedo poner Me.Show dentro UserForm_Activate porque eso procedimiento sólo se activa después de la UserFo rm Mostrar evento.

La documentación para UserForm.ShowModal dice "Cuando un formulario de usuario es modal, el usuario debe proporcionar la información o cerrar el formulario de usuario antes de usar cualquier otra parte de la aplicación. Ningún código subsiguiente se ejecuta hasta que el formulario de usuario está oculta o descargada."

Estoy tratando de usar un UseForm modal como una barra de progreso para evitar que el usuario interactúe con la aplicación mientras se ejecuta un proceso. Pero esto será difícil de lograr si todo mi código tiene que estar dentro del procedimiento UserForm_Activate.

Me estoy perdiendo algo aquí? ¿Por qué se detiene la ejecución de todos los códigos en Me.Show?

Respuesta

2

Creo que lo descubrí.

Después de Me.Show el evento UserForm_Activate se desencadena. Si no hay ningún código en el procedimiento UserForm_Activate, nada sucederá porque VBA está esperando Me.Hide.

Así que el orden de los acontecimientos es: Me.Show>UserForm_Activate>Me.Hide

Cualquier código que quiero correr debe estar en el procedimiento UserForm_Activate y debe ser antes Me.Hide.

La estructura es muy estricta, pero puedo usar esa estructura para mi ventaja.

+3

Todo lo que realmente necesita hacer si quiere seguir siendo capaz de interactuar con la hoja mientras que la forma es de hasta es usar este código al llamar el formulario de usuario: 'userform.show vbModeless'. – Casey

10

Cuando se muestra el formulario con vbModal, el código suspenderá la ejecución y esperará la interacción del usuario con el formulario. Por ejemplo, hacer clic en un botón o usar un menú desplegable.

Si actualiza la propiedad de formulario

ShowModal = False 

y eliminar vbModal desde el código. Esto permitirá que la ejecución del código continúe cuando se muestre el formulario.

+0

Sí, vbModeless UserForms es fácil, pero debo bloquear la interacción del usuario con la aplicación hasta que el proceso finalice. Era solo una cuestión de averiguar cómo estructurar el código en un UserForm de vbModal. Lástima que la documentación no solo dice "si usas vbModal, asegúrate de poner el código que deseas ejecutar en UserForm_Activate y antes de mí.Ocultar. ¡Gracias! – Kuyenda

+0

Eso no funcionó para mí. El' sub 'que llama continúa funcionando , pero no se representan absolutamente ningún componente, ni siquiera una etiqueta simple. – cbaldan

-3

Realmente no sé lo que está pasando en su mente porque hay una amplia variedad de código para lo que su están pidiendo, pero espero que esto puede ayudar a

Private Sub cmdSwitch_Click() UserForm1.Hide UserForm2 .show

End Sub

-2

Creo que lo he descubierto trate de hacer este sencillo paso en usted forma click derecho en la parte bancaria y haga clic en propiedades cambiar el "ShowModal" False o en el código VBA cuando se presenta el formulario de usuario utilizando el siguiente código:

UserForm1.Show Falso

5

que estaba buscando una respuesta a por qué estaba consiguiendo el error siguiente:

Run time error '5': Invalid procedure call or argument

cuando ejecutar esta línea de código:

UserForm1.Show True 

a pesar de que esta línea funciona:

UserForm1.Show False 

Por supuesto. Verdadero no es lo mismo que vbModal! Así que la respuesta sencilla es utilizar las enumeraciones correctas:

UserForm1.Show vbModal 
UserForm1.Show vbModeless 
Cuestiones relacionadas