Grazie
Alberto G
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.
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.
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
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
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
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
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
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 4898 (20100226) __________
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
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:
--
---------------------------
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 4898 (20100226) __________
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...
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
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
--