Visual Basic para Aplicaciones - Interrumpir la ejecución de un procedimient

Life is soft - evento anual de software empresarial
 
Vista:

Interrumpir la ejecución de un procedimient

Publicado por esthermatozoide (2 intervenciones) el 07/03/2011 14:26:55
Buenas,
Tengo un macro que "llama" a otras macros. Adjunto el código de una de ellas, el de la otra contiene las mismas instrucciones, pero trabaja con distintos rangos.
---------------------------------------------------------------------------------------------------
Sub Crear_Ficha_Nuevo_Cliente()
Instrucciones varias
ComprobarCondiciones
ComprobarDatosInternos
End Sub
--------------------------------------------------------------------------------------------------
Sub ComprobarCondiciones()

Sheets("Desplegables").Activate

' Comprobar que se ha rellenado el campo "Forma de Pago"

If Cells(130, 3) = 1 Then
UFFormadePago.Show
End If

' Comprobar que se ha rellenado el campo "Condiciones de Pago"

If Cells(131, 3) = 1 Then
UFCondicionesdePago.Show
End If
--------------------------------------------------------------------------------------------------

Como se puede ver, desde estas macros se llama a distintos UserForms o cuadros de diálogo cuando se dan ciertas circunstancias. Adjunto el código de uno de ellos, los demás contienen las mismas instrucciones, pero trabajan con distintos rangos.

-------------------------------------------------------------------------------------------------
Private Sub UserForm_Initialize()

Load UFFormadePago
Sheets("Crear Ficha Nuevo Cliente").Select
ActiveWindow.ScrollRow = 44
UFFormadePago.Show

End Sub
------------------------------------------------------------------------------------------------------
Private Sub CBContinuar1_Click()

UFFormadePago.Hide

' Retomar la ejecución de la macro Crear_Ficha_Nuevo_Cliente, volviendo a ejecutar el procedimiento sub ComprobarCondiciones

ComprobarCondiciones

' Desactivar el cuadro de diálogo

Unload UFFormadePago

End Sub
-----------------------------------------------------------------------------------------------

Lo que busco es sencillo (al menos de explicar): simplemente quiero que cuando se cargue un UserForm se detenga la ejecución de todo código hasta que el usuario haga clic en el botón "Continuar".

He probado con Exit Sub, pero sólo me saca del procedimiento ComprobarCondiciones, con lo cual continúa con la "llamada" al otro procedimiento: ComprobarDatosInternos, y yo lo que necesito es que se detenga completamente. He pensado en la instrucción Wait, pero no me sirve porque es necesario que el usuario pueda ir al fichero excel, meter los datos que ha olvidado rellenar y hacer clic en Continuar.

¿Alguien puede ayudarme?

Mil gracias por adelantado. Esther-matozoide : )
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Interrumpir la ejecución de un procedimient

Publicado por Zeus Alberto Paez Renteria (26 intervenciones) el 10/03/2011 22:53:54
Mira veamos si te entiendo:

Deseas que se detenga el codigo de esta forma al iniciar?

Private Sub UserForm_Initialize()

Load UFFormadePago
Sheets("Crear Ficha Nuevo Cliente").Select
ActiveWindow.ScrollRow = 44
UFFormadePago.Show

End Sub

Me refiero a cuando haces el load UFFormadePago, si tienes otras instrucciones incluyelas en el Private Sub CBContinuar1_Click(), ahora quiza la pregunta aclare mejor la informacion; para que o porque quieres que se detenga la ejecucion de una forma.

Saludos desde Mexico

Att. Ing Zeus Paez
IT Support
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Interrumpir la ejecución de un procedimiento

Publicado por esthermatozoide (2 intervenciones) el 11/03/2011 13:32:07
Muchas gracias por contestar, Zeus
Lo que quería era que se detuviera la ejecución de la macro ComprobarCondiciones mientras el usuario introducía en el Excel la información que faltaba, y que cuando hiciera clic en el botón "Continuar" tras haber introducido el dato que faltaba se retomara la ejecución de la macro empezando por la instrucción que hizo que saltara el UserForm (es decir, yo quería que el botón hiciera un "Resume"). Viendo que el "resume" no era posible decidí limitarme a que finalizara por completo la ejecución de todo el código con un Exit Sub introducido inmediatamente después de la instrucción que llamó al UserForm. Pero claro, esto sólo finalizaba el procedimiento ComprobarCondiciones, pero no el procedimiento inicial Crear_Ficha_Nuevo_Cliente, que es el que llamaba a la sub ComprobarCondiciones, así que no me servía. Decidí entonces hacer procedimientos independientes, y con esto conseguí que al hacer clic en el botón (cambié "Continuar" por "Cerrar") se cerraran el UserForm y la macro que lo llamó. Pero surgió un problema más: si el usuario cerraba el UserForm haciendo clic en el aspa roja en lugar de en el botón se producía un error, y no conseguí ni hacer desaparecer el aspa roja, ni deshabilitarla ni que no diera error. Así que finalmente me decidí a probar sustituyendo el UserForm por un MsgBox y he conseguido exactamente lo que quería ¡Por Fin!
Muchas gracias de todos modos por tu tiempo, sólo puedo decir 2 cosas de la gente que altruistamente ayudáis en estas situaciones: ¡¡Sois Fantásticos!! y ¡¡Mil Gracias!!
Un saludo desde Madrid.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Interrumpir la ejecución de un procedimiento

Publicado por Ing. Zeus Paez (26 intervenciones) el 11/03/2011 16:41:41
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, _
ByVal wFlags As Long) As Long
Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As Long, ByVal bRevert As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Const MF_BYPOSITION = &H400&

'Como desabilitar la dichosa "X" del menu de una UserForm

Private Sub CommandButton1_Click()
'Utilizo el hide para ocultar la ventana pero es mas apropiado que uses el Unload para descargar
'la UserForm de memoria. Puedes cargarla colocando un boton en una Sheet(Hoja) y con el comando
'Load (UserForm1) despues UserForm1.Show y puedes ya sea ocultarla o cerrarla con UserForm1.Hide
' o cerrarla con Unload (UserForm), Uso el hide porque si utilizo el unload me marcara error pero
' a manera de ejemplo esta bien.
'Otra propiedad del UserForm que no se si conozcas es el UserForm.Show vbmodeless de forma que esto
'te permite tener la ventana activa de UserForm pero ademas podras utilizar las hojas, diriamos que
'funciona como un minimizar (pero no minimiza la ventana) y te permite trabajar con lo que esta detras
'de la UserForm, algunas versiones de Excel tienen problemas con este modo. Excel 97 y no recuerdo si el
'Excel 2010 o 2007 pero esta opcion te ayuda y pienso que para lo que querias hacer puede ser de utilidad
UserForm1.Hide
End Sub

Private Sub UserForm_Initialize()
Dim lHwnd As Long
'Vamos a buscar el handle de la User Form y utilizaremos tres funciones internas de Windows del user32 lib
'FindWindows, GetSystemMenu y RemoveMenu
'lHwnd esto es el handle o el manejador de la ventana de windows porque para windows todas las ventanas las
'identifica con un handle
lHwnd = FindWindow("ThunderDFrame", "UserForm1") 'Cambialo para hacer match con el caption de tu user form
Do While lHwnd = 0
lHwnd = FindWindow("ThunderDFrame", "UserForm1") 'Match el caption de tu UserForm
DoEvents
Loop
RemoveMenu GetSystemMenu(lHwnd, 0), 6, MF_BYPOSITION 'When using by position, 6 represents the 7th menu item (including separators)
End Sub

Att. Ing Zeus Alberto Paez R.
IT Engineer
Systems Development
Triumph Aerospace Group
Mexicali B.C. Mexico
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar