Condividi tramite

Evento DropDown in ComboBox

Anonimo
2017-11-23T17:26:43+00:00

Questa volta faccio io una domanda :D

Ho una userform come questa in immagine:

che presenta due combobox una di seguito all'altra.

Tramite l'evento Enter faccio in modo che al momento in cui viene selezionata la prima combobox la lista delle voci venga automaticamente estesa (tramite il metodo DropDown).

Lo stesso avviene per la seconda combobox.

Però se mi sposto da una combobox all'altra tramite il TAB (o MAISC+TAB per tornare indietro) nella combo successiva il "DropDown" non riesce e la lista non si apre.

Ho capito che dipende dal fatto che è aperta la lista della precedente combo e con il TAB non viene chiusa.

Se invece mi sposto digitando il il Maisc poiché con la prima digitazione la lista viene chiusa e con la seconda avviene lo spostamento al controllo successivo la lista della seconda combobox si apre.

Io ho provato a vedere se esista la possibilità di far comparire la lista anche nello spostamento tramite TAB ma non sono riuscito.

Qualcuno sa se c'è un modo per fare ciò?

ciao

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2017-11-24T19:42:31+00:00

Ciao Casanmaner,

Ciao Norman,

dicevo di comportamenti strani della tastiera con l'uso di SendKeys.

Ed ecco infatti che alternativamente entrando ed uscendo dalle combo si attiva o disattiva il tastierino numerico :)

Maledetto SendKeys!!! :D :D :D

Ebbene, butta via il metodo SendKeys, ingrato!   

Il problema dell'attivazione/disattivazione del tasterino numerico potrebbe essere 

gestito utilizzando delle chiamate API.

Comunque, credo che sia di gran luogo preferibile affrontare i problemi alla radice. Pertanto, prova a sostituire il tuo codice nel modulo di codice della Userform con la seguente versione che, a me, risolve il tuoi problemi originari del non funzionamento del comando Dropdown e non tocca lo stato NumLock:

'=========>>

Option Explicit

Dim ArrayClienti() As Variant

Dim ArrayCausali() As Variant

'--------->>

Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _

                              ByVal Shift As Integer)

    If KeyCode = vbKeyTab Then

        KeyCode = 0

        ComboBox2.SetFocus

        ComboBox2.DropDown

    End If

End Sub

'--------->>

Private Sub ComboBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _

                              ByVal Shift As Integer)

    If KeyCode = vbKeyTab Then

        If Shift = 0 Then

            TextBox3.SetFocus

        ElseIf Shift = 1 Then

            ComboBox1.SetFocus

            ComboBox1.DropDown

        End If

    End If

End Sub

'--------->>

Private Sub ComboBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _

                              ByVal Shift As Integer)

    If KeyCode = vbKeyTab Then

        KeyCode = 0

        ComboBox1.SetFocus

        ComboBox1.DropDown

    End If

End Sub

'--------->>

Private Sub CheckBox2_Click()

    TextBox4.SetFocus

End Sub

'--------->>

Private Sub CommandButton2_Click()

    Unload Me

End Sub

'--------->>

Private Sub UserForm_Initialize()

    Const iMaxListRows As Long = 30

    With Me

        With .ComboBox1

            .AddItem "CLIENTE A"

            .AddItem "CLIENTE B"

            .AddItem "CLIENTE C"

            .MatchEntry = fmMatchEntryComplete

            .ListRows = Application.Min(.ListCount, iMaxListRows)

        End With

        With .ComboBox2

            .AddItem "ATTIVITÀ 1"

            .AddItem "ATTIVITÀ 2"

            .AddItem "ATTIVITÀ 3"

            .MatchEntry = fmMatchEntryComplete

            .ListRows = Application.Min(.ListCount, iMaxListRows)

        End With

    End With

End Sub

'--------->>

Private Sub ComboBox1_Enter()

    With ComboBox1

        .DropDown

    End With

End Sub

'--------->>

Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    With Me.ComboBox1

        If .Value <> "" Then

            If .MatchFound = False Then Cancel = True: Exit Sub

        End If

    End With

End Sub

'--------->>

Private Sub ComboBox2_Enter()

    With ComboBox2

        .DropDown

    End With

End Sub

'--------->>

Private Sub ComboBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    With Me.ComboBox2

        If .Value <> "" Then

            If .MatchFound = False Then Cancel = True

        End If

    End With

End Sub

'<<=========

===

Regards,

Norman

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

15 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2017-11-24T05:36:00+00:00

    Ciao Norman,

    posso chiederti con che versione di Excel hai provato?

    Ti incollo di seguito la mia sequenza di screenshot (dal file semplificato) da Excel 2007:

    Apro la UserForm e il cursore è posizionato sulla prima TextBox:

    Mi sposto con il TAB sulla combo CLIENTE (e si apre la lista regolarmente):

    Con il tasto "Freccia giù" seleziono la seconda voce:

    Digito TAB per spostarmi sulla combo CAUSALE ATTIVITÀ ma la lista non si apre:

    Ho anche provato a disabilitare i comandi relativi all'evento Exit delle due combo (in luogo di questo codice potrei impostare per le due combo la proprietà MatchRequired in fase di caricamento della UserForm):

    Ma anche così nel passaggio dalla prima alla seconda combo (o viceversa) la lista non si apre (sia che io selezioni una voce sia che non selezioni nulla:

    Vedi la sequenza dove mi sposto da ADDETTO a CLIENTE e da CLIENTE a CAUSALE ATTIVITÀ:

    Questa mattina provo anche su una macchina con Excel2013 per verificare se non dipenda da Excel2007.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2017-11-24T00:28:49+00:00

    Ciao Casanmaner,

    Più tardi del previsto, perchè ho mangiato con gli amici dopo la partita, ho scaricato il tuo file.

    Sul principio che si dice che un'immagine valga più di mille parole, aggiungo qui di seguito alcuni screenshot, insieme ai miei commenti sinottici pertinenti.

    Apro la userform e trovo il cursore nella TextBox ADDETTO...

      

    Faccio Tab per andare alla prima ComboBox (CLIENTE) ...   

    e, come previsto, il tuo codice apre la lista di clienti ...

       

    Seleziono un cliente e premo il Tab per confermare la mia scelta di cliente e per procedere alla seconda ComboBox (CAUSALE ATTIVITÀ) ...

     

    e, come sperato, e in accordo con il tuo codice, la lista di attività si apre!!!

    Tanto per confermare il funzionamento previsto del codice, a questo punto premo la combinazione di tasti Maisc + Tab per confermare la mia scelta di attività e per tornare alla prima ComboBox. A questo punto, vedo  ...

      

     ... la lista di clienti riaperta!!!   

    Premendo Enter, vedo le mie selezioni di cliente e attività ricordate nelle due ComboBox ...

      

    Ovviamente, se provo il Tab (o Maisc+Tab) senza fare una selezione dalla lista di interesse, la lista nel ComboBox di arrivo non si aprirebbe, cosa del tutto prevedibile dato il tuo codice:

        If .Value <> "" Then

          If .MatchFound = False Then Cancel = True: Exit Sub

        End If

    nelle procedure ComboBox1_ExitComboBox2_Exit.

    Aggiungerei che ho provato il codice sia dalla interfaccia Excel, che seguendo il codice, passo per passo, premendo F8.

    Come si vede, io non riesco a replicare il tuo problema. Pertanto, devo chiederti se il comportamento spiacevole sia replicato, per te, anche con il file semplificato che hai caricato. 

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2017-11-23T17:56:26+00:00

    Ciao Norman,

    ti allego un file di esempio con la sola UserForm dove sono presenti solo l'evento Inizialize per impostare le due combo.

    L'intero file sarebbe problematico perché prende i dati da archivi esterni che se non vengono trovati vengono creati dopo aver chiesto di impstare un percorso e non voglio "sporcarti" il computer :)

    Quando la UserForm viene mostrata vengono creati tre item nelle due combo che sicuramente bastano per far capire la problematica.

    Quando si entra nella prima combo la lista si apre.

    Se ci si sposta, magari anche dopo aver selezionato una voce scorrendo tra quelle visualizzate, con il tab la lista si chiude ma non si apre la lista della combo successiva.

    Ecco il link: Esempio ComboBox

    ciao e goditi la partita (noi purtroppo, almeno per i mondiali, non godremo per un bel po' :) ).

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2017-11-23T17:34:10+00:00

    Ciao Casanmaner,

    Potresti gentilmente caricare un file di esempio_

    Lo guarderò dopo LA partita stasera. 

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento