› Sviluppare funzionalita su Microsoft Office con VBA › chiudere maschera con tasto ESC
-
AutoreArticoli
-
ciao a tutti,
avrei l'esigenza di chiudere la userform pigiando il tasto ESC, invece che il bottone "chiudi" usando manualmente il mouse.
Come faccio ?
Grazie !!
Inserisci un commanButton nel form
Modifica la proprietà
Cancel = True
Aggiungi la routine:
Private Sub CommandButton1_Click() Unload Me End Sub@mirko la richiesta era di chiudere una userform con il tasto Esc non con un commandbutton.
Non so se sia possibile con il tasto ESC; si dovrebbe provare con Application.OnKey magari con un tasto diverso da ESC.
avrei l'esigenza di chiudere la userform pigiando il tasto ESC
Mmmmm....forse è possibile ma dovresti lavorare sull'evento KeyDown di ogni controllo presente in UserForm (in ogni TextBox, ComboBox e ListBox).
Qualcosa del genere:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = vbKeyEscape Then Unload Me End If End Subda ripetere come dicevo in ogni controllo.
Però lo vedo un lavoro inutile.
Sono curioso di capire come mai non è possibile chiudere la UserForm utilizzando il click del mouse?!
Ciao ricordo che in VB.NET impostando la proprietà "cancelButton" a True si otteneva quello che chiedi, però non so in VBA.
Puoi provare e riferire. Purtroppo non ho il pc davanti per provare
ciao
doppio click sulla userform e aggiungi il codice
Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = vbKeyEscape Then Unload Me End Subciao
Potrebbe essere una soluzione, però se il focus è su un controllo qualsiasi, il tuo codice non funzionerà!
allora penso vadano usate le API... ucas
Perchè le Api prova così la metti nell'userform
Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If KeyAscii = 27 Then Unload Me End Subprova così la metti nell'userform
Ciao Oscar, sei sicuro che funziona? Tu l'hai provato? Immagino che in una UserForm ci sia almeno una TextBox o ComboBox, altrimenti non vedo che senso abbia la sua esistenza. Prova il tuo codice con almeno uno di questi controlli.
prova così la metti nell'userform
Ciao Alex si che ho provato
Allego il File
Allegati:
You must be logged in to view attached files.Prova il tuo codice con almeno uno di questi controlli.
Ciao Oscar, forse non hai letto quanto ho detto qui!!
Riprova inserendo anche solo un TextBox in UserForm (che è quello che ci si aspetta da che contenga)
Ad ogni modo un'altra strada valida (se ci sono molti controlli (TextBox, ComboBox e ListBox), sarebbe quella di utilizzare i Moduli di Classe. Ma è un terreno da me sconosciuto
Ciao ricordo che in VB.NET impostando la proprietà "cancelButton" a True si otteneva quello che chiedi, però non so in VBA.
Ripropongo me stesso, forse non l'avete letto!!! Qualcuno che abbia il pc davanti
Prova il tuo codice con almeno uno di questi controlli.
Ciao Alex si hai ragione se hai qualche controllo non funziona piu
Ciao Alex si hai ragione se hai qualche controllo non funziona piu
Questa cosa l'avevo detta poco sopra
Potrebbe essere una soluzione, però se il focus è su un controllo qualsiasi, il tuo codice non funzionerà!
Questa cosa l'avevo detta poco sopra
Potrebbe essere una soluzione, però se il focus è su un controllo qualsiasi, il tuo codice non funzionerà!
Si d'accordo , ma se hai una sola TextBox ti basta chiudere anche quella , è ovvio che se ne hai 100 non ne vale piu la pena
Ciao ricordo che in VB.NET impostando la proprietà "cancelButton" a True si otteneva quello che chiedi, però non so in VBA

Grazie @alexps81 per il riscontro
Ma da codice con me.cancelButton non è accessibile!? Che peccato
Prova questa
Poi se il set focus si trova sulla ComboBox , bisogna disattivare anche quelle
Allegati:
You must be logged in to view attached files.Qui chiudo anche se il set focus si trova nella ComboBox
Allegati:
You must be logged in to view attached files.Ciao Oscar, ecco era proprio quello che intendevo!

Io non ne capisco molto di Moduli di Classe però da come immaginavo, per evitare di codificare ogni "Controllo", è meglio utilizzare i Moduli di Classe.
Se mi permetti farei delle mie correzioni
...adatterei il tuo codice così:Nel Modulo della UserForm:
1) anziché utilizzare un doppio ciclo FOR EACH, ne uso uno solo che verifica se il Controllo è una TextBox o una ComboBox
2) dichiarazioni delle variabili ctl (come Control) e tb (come Oggetto). Come le avevi dichiarate tu erano Variant
3) eliminazione di Application.ScreenUpdating = False (oltre a non essere utile, lascia l'aggiornamento dello schermo disabilitato)
Option Explicit Private TextBoxes As Collection Private ComboBoxes As Collection Private Sub UserForm_Initialize() Dim ctl As Control, tb As Object Set TextBoxes = New Collection Set ComboBoxes = New Collection For Each ctl In Me.Controls If TypeName(ctl) = "TextBox" Then Set tb = New ChiudiText Set tb.cmd = ctl TextBoxes.Add tb ElseIf TypeName(ctl) = "ComboBox" Then Set tb = New ChiudiCombo Set tb.cmd = ctl ComboBoxes.Add tb End If Next ctl End SubNel Modulo di Classe ChiudiCombo:
Option Explicit Public WithEvents cmd As MSForms.ComboBox Private Sub cmd_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If KeyAscii = 27 Then Unload cmd.Parent End Sub1) anziché utilizzare il metodo HIDE che nasconde la Form, utilizzo UNLOAD così da scaricarla.
2) nella
If KeyAscci...utilizzo il metodo Parent per risalire alla UserForm dov'è posizionato l'oggetto cmd (in questo caso la ComboBox)Nel Modulo di Classe ChiudiText:
Option Explicit Public WithEvents cmd As MSForms.TextBox Private Sub cmd_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If KeyAscii = 27 Then Unload cmd.Parent End SubStessa spiegazione data per il Modulo di Classe ChiudiCombo
Ciao Oscar, ecco era proprio quello che intendevo!

Infatti pensavo anch'io a una cosa simile , ma poi l'ho fatto in fretta giusto per dare un'idea e prima cosa mica sono alla tua portata , io sono solo un principiante ai tuoi confronti
-
AutoreArticoli
