Como desactivar el cierre del Userform

Estoy adaptando una macro que encontré en la red fara filtrar datos a mis necesidades, el problema es que no se como hacer que la POR del Userform quede desactiva y poder utilizar los dos botones que coloque una para salir y otro para guardar lo filtrado en la hoja ReporteInventario. Cabe aclarar que ahorita lo hace con solo apretar la x.

Anexo archivo https://mega.nz/#!nIoFGTBT!4WP_afb7e_rEyDsjsTVkCRi-ugtdvEuYY4Ov-Jvs4T8 

2 respuestas

Respuesta
1

¿Ya intentaste esta macro?, la instrucción cancela el usar la POR como modo de salida

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Cancel = True
MsgBox ("para salir use los botones "), vbInformation, "AVISO EXCEL"
End Sub

¡Gracias! Por tu ayuda. Si ce cancelo pero ahora pero ahora con la instrucción que le doy al botón salir me manda el msgbox (Para salir use los botones). Te anexo como la tengo.

Private Sub CommandButton1_Click()

Unload Busqueda_Inventario

End Sub

Private Sub CommandButton2_Click()
Dim Fila As Integer
Dim Final As Integer
Dim i As Integer

For Fila = 2 To 10000
If ReporteInventario.Cells(Fila, 1) = "" Then
Final = Fila
Exit For
End If
Next


End Sub

Private Sub nombregp_Change()
Application.ScreenUpdating = False
nombre = IIf(Me.nombregp.Text = "", "", "*") & _
Me.nombregp.Text & IIf(Me.nombregp.Text = "", "", "*")
filtrargp
uf = Sheets("ReporteInventario").Range("A" & Rows.Count).End(xlUp).Row
With Me.ListBox1
.ColumnCount = 9
.RowSource = "ReporteInventario!A1:I" & uf
End With
End Sub


Private Sub filtrargp()
Application.ScreenUpdating = False
Sheets("ReporteInventario").Range("A1").CurrentRegion.Delete xlShiftUp
With Sheets("Inventario")
uf2 = .Range("A" & Rows.Count).End(xlUp).Row
With .Range("A1:I" & uf2)
If nombre <> "" Then

If nombre <> "" Then .AutoFilter Field:=2, Criteria1:=nombre

.Copy Sheets("ReporteInventario").Range("A1")
Else
Sheets("ReporteInventario").Range("A1").CurrentRegion.Delete xlShiftUp
Me.ListBox1 = ""
End If
End With
If .AutoFilterMode Then .Range("A1").AutoFilter
End With
Application.ScreenUpdating = True
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Cancel = True
MsgBox ("para salir use los botones "), vbInformation, "AVISO EXCEL"
End Sub

Ya encontré la solución amigo pero ahora me surgió otro problema al correr la macro menu me aparece la ventana de buscar en el inventario pero inmediatamente vuelve aparecer la ventana del menu cosa que no deber si no hasta que cierre la ventana de buscar. No se si me ex´plique anexo archivo.

https://mega.nz/#!uVoT3aJD!9i1cqc4R-NGbygKsHw3mgdd_F4c_uODNCAJ2Pst0wdY 

Perdón amigos este es el archivo bueno, en la sección de Búsqueda botón inventario del menu principal sucede lo comentado anteriormente. Gracias por su apoyo

https://mega.nz/#!2AYwSKZB!jfPjeOWVe0DMYviqmD0QJKCIR01R3PKrVC5kwiwelsA 

Tienes una línea de más, si te fijas en la instrucción ocultas el menu, luego mandas llamar el formulario búsqueda salidas e inmediatamente después vuelves a llamar al menu principal solución borra la ultima línea y por cierto así lo tienes también en otros botones

Private Sub CommandButton11_Click()
Menu.Hide
Busqueda_Salidas.Show
Menu.Show
End Sub

Pero si borro esa ultima línea me cierra todo el archivo al dar cerrar en la ventana de Búsqueda, yo lo que quiero es que aparezca de nuevo el menu. En los otros botones si me funcionan, no entiendo porque en este userform no sucede lo mismo. Checa en el ultimo archivo que subí y veraz

Cuando eliminaste el cerrar con POR también eliminaste el regreso automático al formulario padre en este caso menu, y como en el formulario hijo(busqueda_inventario) no tiene instrucciones de que hacer simplemente lo cierra tal y como esta wscrito en el código, en el botón de salida del formulario hijo debes colocar estas líneas

Private Sub CommandButton1_Click()
Unload Busqueda_Inventario
Menu.Show
End Sub

Y del formulario menu tienes que borrar la instrucción en negritas, esa esta de más al colocarla en el formulario busqueda_inventario

Private Sub CommandButton11_Click()
Menu.Hide
Busqueda_Salidas.Show
Menu.Show
End Sub

Respuesta
1

La macro enviada por James es la correcta cuando deseamos inhabilitar el botón de cerrar el userform. No te olvides que necesitas otro botón de comando con la instrucción de salida, por ejemplo:

Private Sub CommandButton1_Click()
'cierra el formulario
Unload Me
End Sub

Otra opción sería quitar ese botón 'x' de este modo:

Insertá un módulo y allí copiá las siguientes líneas (atención con el comentario)

Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Public Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
Public Const GWL_STYLE As Long = -16&
Public Const WS_SYSMENU As Long = &H80000
'quitar el texto PtrSafe si se trabaja con 32bits

Luego en el formulario tendrás un botón de comando para salir como el que te mostré antes.

Y en el evento Initialize del userform coloca estas líneas:

Private Sub UserForm_Initialize()
Dim hWnd As Long
Dim lngWstyle As Long
hWnd = FindWindow(vbNullString, Me.Caption)
lngWstyle = GetWindowLong(hWnd, GWL_STYLE)
SetWindowLong hWnd, GWL_STYLE, lngWstyle And (Not WS_SYSMENU)
DrawMenuBar hWnd
'el resto de tus instrucciones para este evento, si tuvieras.
End Sub

Sdos y no olvides valorar las respuestas (opciones: excelente o buena)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas