Abrir un UserForm al Cerrar otro UserForm

15/03/2007 - 23:44 por Insumos | Informe spam
Gente del foro:

Tengo la siguiente consulta: Tengo dos Userform llamados UserForm1 y
UserForm2. Desde el UserForm1 accedo al UserForm2 mediante un botón de
comando. Ahora lo que yo quiero es que al cerrar el UserForm2 clickeando en
el botón con la X que se encuentra en el extremo superior derecho de la
ventana (el que esta en la barra de título) en lugar de volver a la hoja de
cálculo se abra el UserForm1. He experimentando con estos códigos:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

Load UserForm1
UserForm2.Hide
UserForm1.Show

End Sub

Private Sub UserForm_Terminate()

Load UserForm1
UserForm2.Hide
UserForm1.Show

End Sub

Tanto con uno con otro código lo que sucede es que la primera vez funciona y
al cerrar el UserForm2 vuelve al UserForm1, pero si vuelvo a acceder al
UserForm2 y lo vuelvo a cerrar ya no vuelve la segunda vez a abrir el
UserForm1. Se puede solucionar esto?
Desde ya muchas gracias!!!

CONTADURIA

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
16/03/2007 - 08:16 | Informe spam
hola, 'anonimo/a' !

podrias exponer 'como' es el codigo que muestra cada uno de los useforms ???
- el que muestra el userform1
- y el que tienes en el boton que muestra al userform2 ;)

saludos,
hector.

__ la consulta original __
... dos Userform llamados UserForm1 y UserForm2. Desde el UserForm1 accedo al UserForm2 mediante un boton
... quiero... que al cerrar el UserForm2... con la X... en la barra de título) en lugar de volver a la hoja... se abra el UserForm1.
He experimentando con estos codigos:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Load UserForm1
UserForm2.Hide
UserForm1.Show
End Sub
Private Sub UserForm_Terminate()
Load UserForm1
UserForm2.Hide
UserForm1.Show
End Sub
... la primera vez funciona y al cerrar el UserForm2 vuelve al UserForm1
pero si vuelvo a acceder al UserForm2 y lo vuelvo a cerrar ya no vuelve la segunda vez a abrir el UserForm1...
Respuesta Responder a este mensaje
#2 Insumos
16/03/2007 - 17:28 | Informe spam
Hola Héctor:

Aqui te pongo los códigos:

El código que llama al UserForm1 es el que sigue (el UserForm1 aparece al
abrir el archivo):


Sub Auto_open()

Load UserForm1
UserForm1.Show

End Sub


En el UserForm1 hay solo dos botones de comando y están estos códigos:

Private Sub CommandButton1_Click()

Load UserForm2
UserForm1.Hide
UserForm2.Show

End Sub


Private Sub CommandButton2_Click()

Load UserForm4
UserForm1.Hide
UserForm4.Show

End Sub



En el UserForm2 hay más elementos y los códigos son estos:




Private Sub CommandButton1_Click()

If ListBox1.ListIndex = -1 Or ComboBox2 = Empty Or ComboBox3 = Empty Or
TextBox1 = Empty Then GoTo 100 Else GoTo 10

10

Worksheets("Base").[A65536].End(xlUp).Offset(1) = Label1
Worksheets("Base").[B65536].End(xlUp).Offset(1) = ListBox1
Worksheets("Base").[C65536].End(xlUp).Offset(1) = ComboBox2
Worksheets("Base").[D65536].End(xlUp).Offset(1) = TextBox1.Value
Worksheets("Base").[E65536].End(xlUp).Offset(1) = ComboBox3

TextBox1 = Empty
ListBox1 = Empty
ComboBox2 = Empty
ComboBox3 = "Pesos"

GoTo 200

100 UserForm2.Hide
101 Load UserForm3
105 UserForm3.Show

200

End Sub

Private Sub CommandButton2_Click()

Load UserForm1
UserForm2.Hide
UserForm1.Show

End Sub

Private Sub UserForm_Activate()

TextBox1 = Empty
ListBox1 = Empty
ComboBox2 = Empty
ComboBox3 = "Pesos"
With TextBox1
.SetFocus
End With

End Sub

Private Sub UserForm_Initialize()

Label1 = Sheets("Parámetros").Range("A1")

ComboBox3.AddItem "Pesos"
ComboBox3.AddItem "U$S"
ComboBox3.AddItem "Reales"
ComboBox3.AddItem "Euros"

Sheets("Parámetros").Range("C7").Select
Do While ActiveCell <> Empty
ActiveCell.Offset(1, 0).Select
ListBox1.AddItem ActiveCell
Loop

Sheets("Parámetros").Range("E7").Select
Do While ActiveCell <> Empty
ActiveCell.Offset(1, 0).Select
ComboBox2.AddItem ActiveCell
Loop

End Sub

"Héctor Miguel" escribió en el mensaje
news:
hola, 'anonimo/a' !

podrias exponer 'como' es el codigo que muestra cada uno de los useforms


???
- el que muestra el userform1
- y el que tienes en el boton que muestra al userform2 ;)

saludos,
hector.

__ la consulta original __
> ... dos Userform llamados UserForm1 y UserForm2. Desde el UserForm1


accedo al UserForm2 mediante un boton
> ... quiero... que al cerrar el UserForm2... con la X... en la barra de


título) en lugar de volver a la hoja... se abra el UserForm1.
> He experimentando con estos codigos:
> Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
> Load UserForm1
> UserForm2.Hide
> UserForm1.Show
> End Sub
> Private Sub UserForm_Terminate()
> Load UserForm1
> UserForm2.Hide
> UserForm1.Show
> End Sub
> ... la primera vez funciona y al cerrar el UserForm2 vuelve al UserForm1
> pero si vuelvo a acceder al UserForm2 y lo vuelvo a cerrar ya no vuelve


la segunda vez a abrir el UserForm1...


Respuesta Responder a este mensaje
#3 Héctor Miguel
17/03/2007 - 07:19 | Informe spam
hola, ?

1) comentarte que las instrucciones Load ['repetitivas' que usas] no son necesarias
los metodos .Hide y .Show se encargan de 'cargar' en memoria los objetos [oculto y visible]
la instruccion Load [generalmente] se usa para 'trabajar' con los objetos [cargados en memoria] si que el usuario 'se entere' ;)

2) no 'veo' la necesidad de ocultar los formularios 'anteriores' [si de todos modos se trabajan de forma 'modal'] -???-
a menos que requieras 'conservar' algunos datos segun se vayan 'llenando', en cuyo caso puedes mostrarlos como 'no modales' -?-

3) considera ademas que al mantener varios formularios 'ocultos'... estas corriendo el riesgo que al terminarse el codigo
pudieran quedar en memoria algunos objetos sin 'destruirse' y en algun momento recibiras 'errores' en otras partes del codigo -?-

4) del tema que nos ocupa... [regresar al formulario1 cuando SE CIERRA el formulario2]... y hasta donde he podido investigar:
-> el boton de cerrar el formulario [X] y/o pulsar las teclas {Alt}+{F4} cuando esta activo un formulario [que son lo mismo]...
a) puedes 'trampearlo' una vez [usarlo dos veces] y luego dejara de funcionar :-((
b) puedes agregarle una 'trampa' mas [y solo una mas] si muestras de nuevo el formulario anterior en el evento '_Terminate'

5) [en resumen]... creo que lo mas 'barato' que te puedo conseguir... es que EVITES que el boton [X] cierre el formulario
y 'obligues' al usuario a utilizar el boton que haria 'lo propio' [esconder el formulario activo y volver a mostrar al anterior] ;)
[con las 'reservas' de los comentarios en los puntos 2 y 3] -???-

6) te saldria aun mas 'barato'... si no existiendo 'necesidad' de conservar capturas previas en los formularios... [simplemente]
sigues mostrando los formularios como 'modales' [el metodo .Show 'simple y llano'] pero... -> SIN ocultar al formulario anterior -?-
lo cual obligadamente vuelve al formulario previo al cerrarse el formulario 'activo' ;)
y te evitas la necesidad de des/re ocutar/mostrar entre formulario y formulario :))

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

__ la re/consulta original __
... (el UserForm1 aparece al abrir el archivo):
Sub Auto_open()
Load UserForm1
UserForm1.Show
End Sub
En el UserForm1 hay solo dos botones de comando y están estos codigos:
Private Sub CommandButton1_Click()
Load UserForm2
UserForm1.Hide
UserForm2.Show
End Sub
Private Sub CommandButton2_Click()
Load UserForm4
UserForm1.Hide
UserForm4.Show
End Sub

En el UserForm2 hay mas elementos y los cadigos son estos: [...]
Respuesta Responder a este mensaje
#4 Insumos
17/03/2007 - 14:54 | Informe spam
Hola Héctor:

Cómo estas? Gracias por tu valiosa ayuda. He suprimido todos los Load y anda
todo perfectamente. También usé tu idea de no Ocultar el Formulario anterior
y entonces al cerrar el formulario siguiente vuelve al anterior. Todo
bárbaro!! Y tan simple! Gracias por tus soluciones maravillosas!!!
Bueno, ahora me queda solo una cosita en el tintero, que es que yo no quiero
que los usuarios puedan "acceder" a la hoja de cálculo al cerrar el
Userform1, sino que quiero que queden confinados a usar solo los UserForm.
En el UserForm1 puse este código:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

UserForm1.Hide
UserForm1.Show

End Sub

Y parece funcionar bien, ya que al apretar la X no se accede a la hoja de
cálculo sino que queda el UserForm1 en pantalla. Está bien lo que hize o hay
una mejor (y tal vez más segura para el código) manera?
Muchas gracias por todo!!

Mariano

"Héctor Miguel" escribió en el mensaje
news:
hola, ?

1) comentarte que las instrucciones Load ['repetitivas' que usas] no son


necesarias
los metodos .Hide y .Show se encargan de 'cargar' en memoria los


objetos [oculto y visible]
la instruccion Load [generalmente] se usa para 'trabajar' con los


objetos [cargados en memoria] si que el usuario 'se entere' ;)

2) no 'veo' la necesidad de ocultar los formularios 'anteriores' [si de


todos modos se trabajan de forma 'modal'] -???-
a menos que requieras 'conservar' algunos datos segun se vayan


'llenando', en cuyo caso puedes mostrarlos como 'no modales' -?-

3) considera ademas que al mantener varios formularios 'ocultos'... estas


corriendo el riesgo que al terminarse el codigo
pudieran quedar en memoria algunos objetos sin 'destruirse' y en algun


momento recibiras 'errores' en otras partes del codigo -?-

4) del tema que nos ocupa... [regresar al formulario1 cuando SE CIERRA el


formulario2]... y hasta donde he podido investigar:
-> el boton de cerrar el formulario [X] y/o pulsar las teclas


{Alt}+{F4} cuando esta activo un formulario [que son lo mismo]...
a) puedes 'trampearlo' una vez [usarlo dos veces] y luego dejara


de funcionar :-((
b) puedes agregarle una 'trampa' mas [y solo una mas] si muestras


de nuevo el formulario anterior en el evento '_Terminate'

5) [en resumen]... creo que lo mas 'barato' que te puedo conseguir... es


que EVITES que el boton [X] cierre el formulario
y 'obligues' al usuario a utilizar el boton que haria 'lo propio'


[esconder el formulario activo y volver a mostrar al anterior] ;)
[con las 'reservas' de los comentarios en los puntos 2 y 3] -???-

6) te saldria aun mas 'barato'... si no existiendo 'necesidad' de


conservar capturas previas en los formularios... [simplemente]
sigues mostrando los formularios como 'modales' [el metodo .Show


'simple y llano'] pero... -> SIN ocultar al formulario anterior -?-
lo cual obligadamente vuelve al formulario previo al cerrarse el


formulario 'activo' ;)
y te evitas la necesidad de des/re ocutar/mostrar entre formulario y


formulario :))

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

__ la re/consulta original __
> ... (el UserForm1 aparece al abrir el archivo):
> Sub Auto_open()
> Load UserForm1
> UserForm1.Show
> End Sub
> En el UserForm1 hay solo dos botones de comando y están estos codigos:
> Private Sub CommandButton1_Click()
> Load UserForm2
> UserForm1.Hide
> UserForm2.Show
> End Sub
> Private Sub CommandButton2_Click()
> Load UserForm4
> UserForm1.Hide
> UserForm4.Show
> End Sub
>
> En el UserForm2 hay mas elementos y los cadigos son estos: [...]


Respuesta Responder a este mensaje
#5 Héctor Miguel
17/03/2007 - 18:00 | Informe spam
hola, Mariano ! [gracias por 'exponer' tu nombre] :))

... me queda solo una cosita en el tintero
que es que yo no quiero que los usuarios puedan "acceder" a la hoja de calculo al cerrar el Userform1
sino que quiero que queden confinados a usar solo los UserForm.
En el UserForm1 puse este código:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
UserForm1.Hide
UserForm1.Show
End Sub

Y parece funcionar bien, ya que al apretar la X no se accede a la hoja de calculo sino que queda el UserForm1 en pantalla.
Esta bien lo que hize o hay una mejor (y tal vez mas segura para el codigo) manera?



si solo quieres evitar que este 'disponible/funcional/... el boton [X] de un formulario, usa algo +/- como lo siguiente:
en el modulo de codigo del formulario ==Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Cancel = CloseMode = vbFormControlMenu
End Sub

nota: todavia se puede cerrar el formulario [pero]... SOLO si pulsan {ctrl}+{break/pausa/interrupcion}
o... por algun boton 'de salida' que le proveas en el mismo formulario ;)

saludos,
hector.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida