Excel Userform: ciclo su controlli

Anonimo
2023-01-31T17:35:04+00:00

Buongiorno,

ho creato una Userform, in Excel, con alcune Textbox corrispondenti alle colonne di un foglio (diciamo A,B,C,D).

Dovrei inserire i dati in questa Userform per poi riportarli nel foglio.

Però con mia sorpresa, mentre il passaggio da un campo all'altro della maschera avviene correttamente con il "tab" (secondo i tabIndex), quando scorro i campi con un codice VBA - del tipo "For each ctl in frm_Mia" - trovo una successione diversa, del tipo "A,B,D,C". Questo è ovviamente scomodo perchè in questo modo devo "riallineare" i campi, prima di riportarli sul foglio.

C'è un qualche parametro che mi sfugge?

Grazie

Ivo

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
2023-02-01T00:59:58+00:00

Ciao Ivo,

Aggiungerei che, senza interventi correttivi, la sequenza dei controlli restituiti dal ciclo ForEach..Next rifletterà l'ordine cronologico in cui i controlli vengono aggiunti alla Userform, indipendentemente dall'ordine TabIndex successivamente assegnato ai controlli.

Questo comportamento, e una soluzione alternativa, sono dimostrati nel mio file prova Ivo20230201.xlsm

che include il seguente codice:

'========>>

Option Explicit

'-------->>

Private Sub CommandButton1_Click()

Dim Ctrl As MSForms.Control 

Dim i As Long 

Dim maxIndex As Long 

Dim oControls\_Dic As Object 

Set oControls\_Dic = CreateObject("Scripting.Dictionary") 

'\\ Add controls to dictionary, key by tabindex property 

For Each Ctrl In Me.controls 

    With Ctrl 

        maxIndex = IIf(maxIndex < .TabIndex, .TabIndex, maxIndex) 

        oControls\_Dic.Add .TabIndex, Ctrl 

    End With 

Next Ctrl 

'\\ Place controls in order 

Debug.Print vbNewLine & "CommandButton1 Results:" 

Debug.Print "\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_" 

For i = 0 To maxIndex 

    With oControls\_Dic 

        If .exists(i) Then 

            If TypeName(.Item(i)) = "TextBox" Then 

                If Not IsEmpty(.Item(i).Value) Then 

                    ActiveSheet.Range("A1").Offset(0, i).Value = CDbl(.Item(i).Value) 

                    Debug.Print .Item(i).Name & vbTab & .Item(i).TabIndex 

                End If 

            End If 

        End If 

    End With 

Next i 

Debug.Print "#############" 

End Sub

'-------->>

Private Sub CommandButton2_Click()

Dim Ctrl As MSForms.Control 

Debug.Print vbNewLine & "For Each ...Next Results:" 

Debug.Print "\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_" 

Debug.Print 

For Each Ctrl In Me.controls 

    If TypeName(Ctrl) = "TextBox" Then 

        Debug.Print Ctrl.Name & vbTab & Ctrl.TabIndex 

    End If 

Next Ctrl 

Debug.Print "#############" 

End Sub

'<<========

Avviando la Userform e facendo clic sui i due controlli CommandButton, ottengo il seguente report nella finestra immediata:

   [![](https://learn-attachment.microsoft.com/api/attachments/3ad8137c-58ff-426f-826e-098527ff321d?platform=QnA

Inoltre, compilando i tre controlli TextBox, i loro dati vengono copiati nel intervallo A1:C1 nella sequenza desiderata:

 [![](https://learn-attachment.microsoft.com/api/attachments/3eb6b392-565a-4e50-978b-5df13091fb41?platform=QnA

===

Regards,

Norman

Immagine

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2023-01-31T20:18:19+00:00

Ciao Ivo,

Ecco il file

https://drive.google.com/file/d/13lUqlW58f0Vg64yv85rOmEeVrfeu_qvM/view?usp=sharing

Ho scaricato il tuo file.

Ho selezionato ciascuno dei controlli TextBox, iniziando dall'estrema destra (txtIncidenti) e precedendo in ordine inverso, terminando così con il controllo txtRipartizione. Ho quindi eseguito l'operazione taglia / incolla.

Per testare i risultati, ho lanciato la Userform, ho inserito i valori da 1 a 6 in sequenza nei controlli TextBox

  [![Immagine](https://learn-attachment.microsoft.com/api/attachments/8a92b9b2-bf84-45f7-ace2-58ab901dd61f?platform=QnA

Ho poi fatto clic sul pulsante OK.

In questo modo il tuo codice ha restituito i seguenti valori per gli array DatiFoglio e TabIndexDati:

[![Immagine](https://learn-attachment.microsoft.com/api/attachments/3a4cb99d-58c4-4c50-8ad5-61e3608933af?platform=QnA

Potresti scaricare il mio file di prova Ivo20230131.xlsm

===

Regards,

Norman

Immagine

La risposta è stata utile?

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

11 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2023-01-31T18:38:59+00:00

    Ciao Anna,

    Ciao Ivo Sono AnnaThomas e sarei felice di aiutarti con la tua domanda. In questo forum, siamo consumatori Microsoft proprio come te. L'ordine dei controlli in un form utente è determinato dalla relativa proprietà ZOrder, che determina l'ordine di sovrapposizione dei controlli. Il controllo con il valore ZOrder più basso è in background, mentre il controllo con il valore ZOrder più alto è in primo piano. Per garantire che i controlli vengano elaborati nell'ordine desiderato, è possibile modificare la proprietà ZOrder dei controlli a livello di codice. Ad esempio, è possibile impostare la proprietà ZOrder per ogni controllo in modo che corrisponda al relativo indice di schede, in modo che il controllo con l'indice di tabulazione più basso abbia il valore ZOrder più basso e il controllo con l'indice di tabulazione più alto abbia il valore ZOrder più alto. Ecco un codice di esempio per impostare la proprietà ZOrder di ogni controllo in modo che corrisponda all'indice di schede: Per ogni ctl in frm_Mia.Controls ctl. ZOrder (ctl. TabIndex) Prossimo ctl Spero che questo aiuti ;-), fammi sapere se questo è contrario a ciò di cui hai bisogno, sarei comunque utile per rispondere a più delle tue domande. Migliori saluti AnnaThomas Restituisci alla comunità. Aiuta la persona successiva con questo problema indicando se questa risposta ha risolto il tuo problema. Fare clic su Sì o No nella parte inferiore.

    Potrei sbagliarmi ma non credo che questi controlli di una Userform abbiano una proprietà ZOrder.

    ===

    Regards,

    Norman

    Immagine

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2023-01-31T18:23:17+00:00

    Ciao Ivo

    Sono AnnaThomas e sarei felice di aiutarti con la tua domanda. In questo forum, siamo consumatori Microsoft proprio come te.

    L'ordine dei controlli in un form utente è determinato dalla relativa proprietà ZOrder, che determina l'ordine di sovrapposizione dei controlli. Il controllo con il valore ZOrder più basso è in background, mentre il controllo con il valore ZOrder più alto è in primo piano.

    Per garantire che i controlli vengano elaborati nell'ordine desiderato, è possibile modificare la proprietà ZOrder dei controlli a livello di codice. Ad esempio, è possibile impostare la proprietà ZOrder per ogni controllo in modo che corrisponda al relativo indice di schede, in modo che il controllo con l'indice di tabulazione più basso abbia il valore ZOrder più basso e il controllo con l'indice di tabulazione più alto abbia il valore ZOrder più alto.

    Ecco un codice di esempio per impostare la proprietà ZOrder di ogni controllo in modo che corrisponda all'indice di schede:

    Per ogni ctl in frm_Mia.Controls ctl. ZOrder (ctl. TabIndex) Prossimo ctl

    Spero che questo aiuti ;-), fammi sapere se questo è contrario a ciò di cui hai bisogno, sarei comunque utile per rispondere a più delle tue domande.

    Migliori saluti

    AnnaThomas

    Restituisci alla comunità. Aiuta la persona successiva con questo problema indicando se questa risposta ha risolto il tuo problema. Fare clic su Sì o No nella parte inferiore.

    Questa risposta è stata tradotta automaticamente. Di conseguenza, potrebbero esserci errori grammaticali o espressioni strane.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2023-01-31T18:21:17+00:00

    Ciao Ivo,

    ho creato una Userform, in Excel, con alcune Textbox corrispondenti alle colonne di un foglio (diciamo A,B,C,D).

    Dovrei inserire i dati in questa Userform per poi riportarli nel foglio.

    Però con mia sorpresa, mentre il passaggio da un campo all'altro della maschera avviene correttamente con il "tab" (secondo i tabIndex), quando scorro i campi con un codice VBA - del tipo "For each ctl in frm_Mia" - trovo una successione diversa, del tipo "A,B,D,C". Questo è ovviamente scomodo perchè in questo modo devo "riallineare" i campi, prima di riportarli sul foglio.

    C'è un qualche parametro che mi sfugge?

    Immagine

    Io ho provato con una Userform si questa genere:

    Immagine

    Inizialmente, ho inserito i quattro controlli TextBox (Col A, Col B, Col C e Col D) in sequenza e quindi i corrispondenti valori TabIndex erano 0,1, 2 e 3.

    Ho assegnato il seguente codice al controllo CommandButton:

    Private Sub CommandButton1_Click() 
        Dim Ctrl As MSForms.Control
    
        For Each Ctrl In Me.Controls 
    
            Debug.Print Ctrl.Name & vbTab & Ctrl.TabIndex 
    
        Next Ctrl 
    
    End Sub 
    

    Visualizzando la Userform e facendo clic sul controllo CommandButton, ottengo il seguente output:

     [![Immagine](https://learn-attachment.microsoft.com/api/attachments/056afa8d-f139-436d-bbc4-1ace8339b495?platform=QnA
    

    Modificando i valori della proprietà TabIndex dei 4 controlli TextBox, la stessa operazione ha fornito il seguente output:

      [![Immagine](https://learn-attachment.microsoft.com/api/attachments/0534b3ea-7cf7-46a1-b2c3-dece8f856cf5?platform=QnA
    

    In sintesi, il mio ciclo For Each ..Next scorre i controlli secondo la sequenza delle loro proprietà TabIndex.

    Ti chiederei quindi gentilmente di caricare il file problematico, privo di dati sensibili ma con codice sufficiente per consentire la replica della tua esperienza.

    ===

    Regards,

    Norman

    Immagine

    La risposta è stata utile?

    0 commenti Nessun commento