Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Non uscire da una Textbox con il tasto invio

222 views
Skip to first unread message

Alberto

unread,
Feb 24, 2010, 4:47:00 AM2/24/10
to
Ciao a tutto il NG
in VBA, ho una form con 6 textbox.
Vorrei che dopo avere scritto il valore in una qualsiasi TB, il focus
non uscisse dalla stessa premendo enter, ma solo con il tab, oppure al
clic del mouse su un'altra TB.
Si può fare?

Grazie

Alberto G

Mauro Gamberini

unread,
Feb 24, 2010, 5:32:17 AM2/24/10
to
Vorrei che dopo avere scritto il valore in una qualsiasi TB, il focus
non uscisse dalla stessa premendo enter, ma solo con il tab, oppure al
clic del mouse su un'altra TB
****************************************************

Prova di mettere questo evento
nel modulo di codice della
UserForm:

Private Sub TextBox1_KeyDown( _
ByVal KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)
If KeyCode = 13 Then
KeyCode = 0
End If
End Sub

Qui � per la TextBox1.
Modifica di conseguenza.

Grazie per l'attenzione.

--
---------------------------
Mauro Gamberini
Microsoft MVP - Excel
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.microsoft.com/Forums/it-IT/excelit/threads

__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 4892 (20100224) __________

Il messaggio � stato controllato da ESET NOD32 Antivirus.

www.nod32.it


Mauro Gamberini

unread,
Feb 24, 2010, 6:05:42 AM2/24/10
to
<cut>

Sperando di non *fare troppa confusione*...
...se hai pi� di una TextBox sulla UserForm:

1) Aggiungi un modulo di classe
(Inserisci-->Modulo di classe)
2) Rinomina il modulo di classe:
(Name): clsTxt
3) Metti questo codice nel modulo
di codice del modulo di classe:

Public WithEvents txt As MSForms.TextBox
Public frm As UserForm

Private Sub txt_KeyDown( _


ByVal KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)
If KeyCode = 13 Then
KeyCode = 0
End If
End Sub

4) Metti questo codice nel modulo di codice
dellla UserForm:

Dim mcoTextBox As New Collection
Dim myTxt As clsTxt

Private Sub UserForm_Initialize()

Dim ctl As MSForms.Control

For Each ctl In Me.Controls
If TypeOf ctl Is MSForms.TextBox Then
Set myTxt = New clsTxt
Set myTxt.txt = ctl
Set myTxt.frm = Me
mcoTextBox.Add myTxt
End If
Next

End Sub

Private Sub UserForm_Terminate()
Set myTxt = Nothing
Set mcoTextBox = Nothing
End Sub

Elimina gli altri eventi KeyDown delle singole
TextBox.

In pratica intercetteremo l'evento KeyDown
di tutte le TextBox in un'unica posizione,
senza dover richiamare lo stesso evento per
ciascuna TextBox.
Inoltre, sai comunque quale TextBox
ha scatenato l'evento se devi, ad esempio,
validare l'invio per una o pi� TextBox, modificando
cos� l'evento nel modulo di classe:

Private Sub txt_KeyDown( _


ByVal KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)

If txt.Name <> "TextBox2" Then


If KeyCode = 13 Then
KeyCode = 0
End If

End If
End Sub

dove se la TextBox non � la TextBox2, annullo
l'invio, altrimenti � abilitato per TextBox2.

Scusa per illungo *pistolotto* e grazie per
l'eventuale attenzione.

Alberto

unread,
Feb 24, 2010, 8:14:18 AM2/24/10
to
> Vorrei che dopo avere scritto il valore in una qualsiasi TB, il focus
> non uscisse dalla stessa premendo enter, ma solo con il tab, oppure al
> clic del mouse su un'altra TB
> ****************************************************
>
> Prova di mettere questo evento
> nel modulo di codice della
> UserForm:
>
> Private Sub TextBox1_KeyDown( _
>     ByVal KeyCode As MSForms.ReturnInteger, _
>     ByVal Shift As Integer)
>     If KeyCode = 13 Then
>         KeyCode = 0
>     End If
> End Sub
>
> Qui per la TextBox1.
> Modifica di conseguenza.
>
> Grazie per l'attenzione.
>
> --
> ---------------------------
> Mauro Gamberini
> Microsoft MVP - Excelhttp://www.riolab.org/http://www.maurogsc.eu/http://social.microsoft.com/Forums/it-IT/excelit/threads

Grazie per l'hint..
Mi pare di notare che il dato inputato non viene considerato concluso
dall'enter ossia succede come se non avessi dato l'enter e stessi
ancora aspettando una ulteriore cifra.
Infatti se digito 10 nella TB, premo enter e poi digito ancora 2 il
numero diventa 102 il che significa che era ancora *aperto* in attesa
della cifra successiva.
E' possibile ottenere che la sequenza 10/enter venga sentita come un
10 e sia quella usata come dato di inizio, non esca dalla cella e se
digito un 2 si cancelli il valore precedente e si riparta daccapo?

Seconda domanda: anche il tab avrà un suo codice ASCII, quindi in
teoria posso controllare qualunque tasto premuto, vero?

Saluti

Alberto G

Mauro Gamberini

unread,
Feb 24, 2010, 9:09:04 AM2/24/10
to
Mi pare di notare che il dato inputato non viene considerato concluso
dall'enter ossia succede come se non avessi dato l'enter e stessi
ancora aspettando una ulteriore cifra.
***********************************

In pratica passo il valore 0 al KeyCode premuto.


E' possibile ottenere che la sequenza 10/enter venga sentita come un
10 e sia quella usata come dato di inizio, non esca dalla cella e se
digito un 2 si cancelli il valore precedente e si riparta daccapo?

Non ho capito, scusa.

Prova a vedere questa:

Private Sub TextBox1_KeyDown( _
ByVal KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)

With Me.TextBox1
If .Text = "10" Then


If KeyCode = 13 Then
KeyCode = 0
End If

End If
End With

End Sub

Ma davvero non ho capito.


Seconda domanda: anche il tab avr� un suo codice ASCII,


quindi in
teoria posso controllare qualunque tasto premuto, vero?

*********************************************

Non � ASCII.
Vedi un po':

Private Sub TextBox1_KeyDown( _
ByVal KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)

MsgBox Chr(KeyCode)
End Sub

Se premi a � sempre 65, sia il maiuscolo che il minuscolo.
Se vuoi vedere il codice ASCII:

Private Sub TextBox1_KeyPress( _
ByVal KeyAscii As MSForms.ReturnInteger)
MsgBox KeyAscii
End Sub

Per la lettera corrispondente modifica:
MsgBox KeyAscii
in
MsgBox Chr(KeyAscii)


Il parametro Shift(in KeyDown)
restituisce 0 se non hai premuto Shift,
1 se lo hai premuto.

Private Sub TextBox1_KeyDown( _
ByVal KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)

MsgBox Chr(KeyCode) & " " & Shift
End Sub


--
---------------------------
Mauro Gamberini

Alberto

unread,
Feb 26, 2010, 8:48:43 AM2/26/10
to
On 24 Feb, 15:09, "Mauro Gamberini"

<maurogscRIMUOV...@RIMUOVEREaliceposta.it> wrote:
> Mi pare di notare che il dato inputato non viene considerato concluso
> dall'enter ossia succede come se non avessi dato l'enter e stessi
> ancora aspettando una ulteriore cifra.
> ***********************************
>
> In pratica passo il valore 0 al KeyCode premuto.
>
> E' possibile ottenere che la sequenza 10/enter venga sentita come un
> 10 e sia quella usata come dato di inizio, non esca dalla cella e se
> digito un 2 si cancelli il valore precedente e si riparta daccapo?
>
> Non ho capito, scusa.
>
> Prova a vedere questa:
>
> Private Sub TextBox1_KeyDown( _
>     ByVal KeyCode As MSForms.ReturnInteger, _
>     ByVal Shift As Integer)
>
>     With Me.TextBox1
>         If .Text = "10" Then
>             If KeyCode = 13 Then
>                 KeyCode = 0
>             End If
>         End If
>     End With
>
> End Sub
>
> Ma davvero non ho capito.
>
> Seconda domanda: anche il tab avrà un suo codice ASCII,

>  quindi in
> teoria posso controllare qualunque tasto premuto, vero?
> *********************************************
>
> Non è ASCII.

> Vedi un po':
>
> Private Sub TextBox1_KeyDown( _
>     ByVal KeyCode As MSForms.ReturnInteger, _
>     ByVal Shift As Integer)
>     MsgBox Chr(KeyCode)
> End Sub
>
> Se premi a è sempre 65, sia il maiuscolo che il minuscolo.

> Se vuoi vedere il codice ASCII:
>
> Private Sub TextBox1_KeyPress( _
>     ByVal KeyAscii As MSForms.ReturnInteger)
>         MsgBox KeyAscii
> End Sub
>
> Per la lettera corrispondente modifica:
>     MsgBox KeyAscii
> in
>     MsgBox Chr(KeyAscii)
>
> Il parametro Shift(in KeyDown)
> restituisce 0 se non hai premuto Shift,
> 1 se lo hai premuto.
>
> Private Sub TextBox1_KeyDown( _
>     ByVal KeyCode As MSForms.ReturnInteger, _
>     ByVal Shift As Integer)
>     MsgBox Chr(KeyCode) & " " & Shift
> End Sub
>
> --
> ---------------------------
> Mauro Gamberini


Grazie per il codice e scusa per il ritardo con il quale rispondo, ma
le priorità del lavoro non sempre le decido io ...
Ho aggiunto tutto quello che hai indicato, anche se non posso dire di
averlo ancora capito del tutto.
Quello invece che intendevo io è questo:
ho una qualsiasi delle TB,
inizio a digitarci dentro la prima cifra (nel mio esempio era 1),
parte l'evento keydown, e l'IF non parte essendo diverso dal 13
(enter)
digito la seconda cifra (ne mio esempio lo zero, idem l'IF non parte
do Enter e mi scatta l'IF che lo blocca e passa invece un bello zero
(il che significa comando nullo, come non avessi digitato niente).
il risultato finale è che l'input di dati è ancora *aperto* (non so se
mi spiego), se infatti adesso pigio il tasto 2, il numero diventa 102,
come se lo avessi digitato in sequenza senza premere l'enter.
Quello che mi prefiggevo di raggiungere era invece
digito 10, dò enter, l'input si blocca, ma non esco dalla cella, al
prossimo numero che digito qui (il 2 del mio esempio) il 10 sparisce e
riparto a digitare un numero diverso, una sorta di correzione
immediata, insomma.

Come si fa questo (se si può)?
Saluti

Alberto G

Alberto

unread,
Feb 26, 2010, 8:58:33 AM2/26/10
to
> > Microsoft MVP - Excelhttp://www.riolab.org/http://www.maurogsc.eu/http://social.microsoft....

>
> Grazie per il codice e scusa per il ritardo con il quale rispondo, ma
> le priorità del lavoro non sempre le decido io ...
> Ho aggiunto tutto quello che hai indicato, anche se non posso dire di
> averlo ancora capito del tutto.
> Quello invece che intendevo io è questo:
> ho una qualsiasi delle TB,
> inizio a digitarci dentro la prima cifra (nel mio esempio era 1),
> parte l'evento keydown, e l'IF non parte essendo diverso dal 13
> (enter)
> digito la seconda cifra (ne mio esempio lo zero, idem l'IF non parte
> do Enter e mi scatta l'IF che lo blocca e passa invece un bello zero
> (il che significa comando nullo, come non avessi digitato niente).
> il risultato finale è che l'input di dati è ancora *aperto* (non so se
> mi spiego), se infatti adesso pigio il tasto 2, il numero diventa 102,
> come se lo avessi digitato in sequenza senza premere l'enter.
> Quello che mi prefiggevo di raggiungere era invece
> digito 10, dò enter, l'input si blocca, ma non esco dalla cella, al
> prossimo numero che digito qui (il 2 del mio esempio) il 10 sparisce e
> riparto a digitare un numero diverso, una sorta di correzione
> immediata, insomma.
>
> Come si fa questo (se si può)?
> Saluti
>
> Alberto G

Certo che questo metodo è potentissimo..
Allora lo zero corrisponde a 96, il nove a 105, l'enter a 13 ed il tab
al 9
Se io modifico il ciclo dentro il modulo di classe (dimenticavo di
spiegare che nell TB posso accettare solo valori numerici) ho già
fatto anche la convalida della digitazione...

Alberto G

Alberto

unread,
Feb 26, 2010, 9:08:25 AM2/26/10
to

Rettifico, i numeri del tastierino numerico sono da 96 a 105, ma se li
digito da sopra le lettere sono:
zero = 48 nove = 57

Alberto G

Mauro Gamberini

unread,
Feb 26, 2010, 9:21:12 AM2/26/10
to
> Se io modifico il ciclo dentro il modulo di classe (dimenticavo di
> spiegare che nell TB posso accettare solo valori numerici) ho gi�

> fatto anche la convalida della digitazione...
>

Risolvi *solo* met� del problema.
Hai valutato il copia/incolla?
Fai una ricerchina in Google
sull'inserimento nelle TextBox
di Visual Basic di valori solo numerici.

--
---------------------------
Mauro Gamberini


__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 4898 (20100226) __________

Alberto

unread,
Feb 26, 2010, 9:23:46 AM2/26/10
to

Però mi nasce un altro problema: come gestire il numero decimale.
Dovrei sapere se sul PC sul quale sto girando l'utente ha selezionato
il punto o la virgola come impostazione dei decimali e abilitarlo di
conseguenza...
Forse per il controllo della digitazione è meglio tornare al metodo
If IsNumeric(TextBox1) = False Then 'se il valore non è un numero
eccetera...
Vero che viene più semplice?

Alberto G

Mauro Gamberini

unread,
Feb 26, 2010, 9:31:37 AM2/26/10
to
> Quello che mi prefiggevo di raggiungere era invece
> digito 10, d� enter, l'input si blocca, ma non esco dalla cella, al

> prossimo numero che digito qui (il 2 del mio esempio) il 10 sparisce e
> riparto a digitare un numero diverso, una sorta di correzione
> immediata, insomma.
>
> Come si fa questo (se si pu�)?
>

Definisci quel 10, per favore.
Sono due cifre qualsiasi o solo il 10?
Domanda stupida, la mia, ma
non fai prima a controllare questi 2
eventi:

Private Sub TextBox1_AfterUpdate()
MsgBox Me.TextBox1.Text
End Sub

Private Sub TextBox1_Change()
MsgBox Me.TextBox1.Text
End Sub

Poi non avr� capito.
Ma ripeto, su Google trovi n x 1000
esempi di come gestire TextBox in Visual Basic.

Inoltre, anche se sono(un po') contrario a
proporre alre cose oltre al vb
in situazioni come questa in cui
c'� gi� difficolt� a comprendere il vb,
hai a disposizione anche le
Regular Expressions.
Qui un bell'esempio di Roberto:

http://excelvba.altervista.org/blog/index.php/Excel-VBA/Espressioni-Regolari-e-Pattern-applicazione-Form.html

--
---------------------------
Mauro Gamberini


__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 4898 (20100226) __________

Alberto

unread,
Feb 26, 2010, 9:35:27 AM2/26/10
to
On 26 Feb, 15:21, "Mauro Gamberini"

<maurogscRIMUOV...@RIMUOVEREaliceposta.it> wrote:
> > Se io modifico il ciclo dentro il modulo di classe (dimenticavo di
> > spiegare che nell TB posso accettare solo valori numerici) ho gi
> > fatto anche la convalida della digitazione...
>
> Risolvi *solo* met del problema.
> Hai valutato il copia/incolla?
> Fai una ricerchina in Google
> sull'inserimento nelle TextBox
> di Visual Basic di valori solo numerici.
>
> --
> ---------------------------
> Mauro Gamberini


eh già, come premo Ctrl per fare il copia incolla da una text box
all'altra, mi da fuori un bel valore 17 e mi va tutto a
massaggiatrici...

Alberto

unread,
Feb 26, 2010, 9:55:52 AM2/26/10
to
On 26 Feb, 15:31, "Mauro Gamberini"
> http://excelvba.altervista.org/blog/index.php/Excel-VBA/Espressioni-R...
>
> --
> ---------------------------
> Mauro Gamberini

il 10 è solo un esempio, digito una cifra, ne digito una seconda, do
enter, digito una terza cifra.

In quanto alle regular expressions, sono d'accordissimo:
c' e' gia' *molta* difficolta' a comprendere il vb appieno...

Saluti
Alberto G


Mauro Gamberini

unread,
Feb 26, 2010, 10:54:34 AM2/26/10
to
> eh gi�, come premo Ctrl per fare il copia incolla da una text box

> all'altra, mi da fuori un bel valore 17 e mi va tutto a
> massaggiatrici...
>

Prova, sperimenta:

Private Sub TextBox1_AfterUpdate()
With Me.TextBox1
If Not IsNumeric(.Text) _
Or Len(.Text) > 2 Then
.Text = ""


End If
End With
End Sub

Private Sub TextBox1_Change()
With Me.TextBox1
If Not IsNumeric(.Text) _
Or Len(.Text) > 2 Then
.Text = ""


End If
End With
End Sub

--

0 new messages