Impossibile mantenere fucos su combobox
Hai un problema con Excel? 
Impossibile mantenere focus su combobox
di beppexile data: 11/01/2016 14:31:44
Buongiorno ragazzi, come da titolo vi vorrei sottoporre una cosa al quanto curiosa: non riesco a mantenere il focus sulla combobox attiva, dopo aver verificato se i dati contenuti sono corretti.
Mi spiego meglio: la combobox in questione è legata alla colonna A del foglio database, dove vi sono presenti circa 1400 voci tutte diverse; per semplificare la scelta della voce, iniziando a digitare il dato, avviene l'autocompletamento della parola; premendo invio dovrebbe avvenire questo:
se il dato inserito corrisponde a uno di quelli dell'elenco, passa il focus alla combo successiva, altrimenti deve rimanere li.
Purtroppo questa seconda parte non avviene.
Qualcuno di voi mi può aiutare?
Posto il codice in questione:
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim valore
Dim lotto
If KeyCode = vbKeyReturn Then
lotto = ComboBox1.Value
On Error Resume Next
valore = Worksheets("DATABASE").Range("A4:A5000").Find(what:=lotto, LookIn:=xlValues).Value
Resume
If ComboBox1.Value = valore Then
ComboBox2.SetFocus
ElseIf ComboBox1.Value <> valore Then
ComboBox1.Cancel = True 'ComboBox1.SetFocus
End If
End If
End Sub |
di patel data: 11/01/2016 20:32:27
difficile rispondere senza provare, dovresti allegare un file di esempio, ma non tutto il progetto altrimenti si fa confusione
di beppexile data: 12/01/2016 09:08:09
Ho allegato il file; praticamente, ho preso il progetto originale ed ho cancellato tutto quello che non serviva, lasciando inalterata la parte di codice che mi interessava.
Partendo dalla Combo1, se si inizia a digitare un lotto presente in elenco, mano a mano si autocompleta;
se si preme invio quando il lotto è presente (anche a metà della digitazione), il focus passa alla Combo2, e fin qui tutto ok;
se invece si digita un lotto non presente nell'elenco e si preme invio, vorrei che il cursore rimanga sulla combo1, ma questo non avviene, infatti passa sempre alla combo2. Perché?
di patel data: 12/01/2016 12:57:36
imposta la proprietà tabstop del combo2 a false e prova la macro seguente
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim valore, c As Range, lotto
If KeyCode = vbKeyReturn Then
lotto = ComboBox1.Value
Set c = Worksheets("DATABASE").Range("A4:A5000").Find(what:=lotto, LookIn:=xlValues)
If Not c Is Nothing Then
ComboBox2.SetFocus
End If
End If
End Sub |
di beppexile data: 12/01/2016 13:23:18
Grande patel, adesso funziona!! Grazie mille... ne ho imparata un'altra!
di Cucù data: 12/01/2016 13:25:35
Cioa Patel, se posso permettermi ho fatto solo 2 piccole correzioni (quisquiglie) alla tua proposta_
Con osservanza
Cucù
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim valore As Range, lotto As Variant
If KeyCode = vbKeyReturn Then
lotto = ComboBox1.Value
Set valore = Worksheets("DATABASE").Range("A4:A5000").Find(lotto, LookIn:=xlValues, lookat:=xlWhole)
If Not valore Is Nothing Then
ComboBox2.SetFocus
End If
End If
End Sub |
di beppexile data: 12/01/2016 13:44:05
Grazie anche a cucù...
Vorrei però capire esattamente una cosa; so che quello che sto per chiedervi è banale per voi, ma a me serve per assimilare bene il concetto.
L'istruzione:
If Not valore Is Nothing Then
ComboBox2.SetFocus
se ho capito bene vuol dire letteralmente: Se non trovi il valore non eseguire il setfocus su combo2?
Perché ho sempre avuto il problema con i vari Find del mio progetto quando non trovano nulla di corrispondente, e vanno perennemente in errore.... come soluzione avevo trovato il On Error Resume Next
di beppexile data: 12/01/2016 14:01:41
Nuovo problema: visto che sulla mia userform ci sono diverse combo, textbox e altro, tutte con una sequenza di tabulazione impostata, ho aggiunto un'altra combo per fare delle prove.
Il risultato è stato che il focus anziché rimanere sulla combo1, si è portato alla combo3.
A questo punto voi mi direte: metti il tabstop a false anche le altre....
Ok, ma a questo punto il tasto tab non funzionerebbe più, e a me dalla combo2 in poi serve che funzioni.
Soluzioni?
di patel data: 12/01/2016 15:33:03
cit.
se ho capito bene vuol dire letteralmente: Se non trovi il valore non eseguire il setfocus su combo2?
poiché 2 negazioni affermano significa se lo trovi esegui il setfocus
di beppexile data: 13/01/2016 12:06:11
Se può interessare ho fatto un'ulteriore prova: visto che il cursore si portava sulla combo3 ho sfuttato l'evento enter della combo 3 per verificare nuovamente il dato inserito sulla combo1, per fargli portare il focus sulla 1 qual'ora il lotto fosse errato. Il risultato è che il cursore continua a fare quel che gli va, e passa alla combo4!
di Cucù data: 13/01/2016 14:09:50
Nuovo problema: visto che sulla mia userform ci sono diverse combo, textbox e altro
Questo accade perchè generalmente non viene data una panoramica chiara e completa del problema che si trova ad affrontare...
Io nel tuo caso risolverei così... (sostituisci quello che avevi prima)
Cucù
Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If ComboBox1.ListIndex < 0 Then
MsgBox "Valore non trovato, scegli tra quelli presenti!", vbCritical
Cancel = True
ComboBox1.DropDown
End If
End Sub |
di beppexile data: 13/01/2016 16:30:26
Era proprio quello che volevo, grazie mille cucù!
Ovviamente grazie anche a patel!
Vuoi Approfondire?