Forzare in ordine numerico delle caselle combinate tramite VBA

di il
19 risposte

19 Risposte - Pagina 2

  • Re: Forzare in ordine numerico delle caselle combinate tramite VBA

    13/01/2026 - @Alex ha scritto:

    In questi casi si può usare una Collection

    Ciao Alex! :-)

    Giusto, ma per popolarla ed evitare il ciclo (motivo per il quale è nata la discussione) dovrebbero essere inseriti uno ad uno i controlli nella Collection.

    Quindi a questo punto tanto vale passare il tempo a rinominarsi i controllli! :-D

    Ovviamente è una battuta e, comqunque alla fine, dipende dal numero di controlli di cui stiamo parlando... Se sono solo 8, probabilmente le prestazioni si equivalgono in tutti i casi.

    TheTruster

  • Re: Forzare in ordine numerico delle caselle combinate tramite VBA

    13/01/2026 - TheTruster ha scritto:

    13/01/2026 - @Alex ha scritto:

    In questi casi si può usare una Collection

    Ciao Alex! :-)

    Giusto, ma per popolarla ed evitare il ciclo (motivo per il quale è nata la discussione) dovrebbero essere inseriti uno ad uno i controlli nella Collection.

    Quindi a questo punto tanto vale passare il tempo a rinominarsi i controllli! :-D

    Ovviamente è una battuta e, comqunque alla fine, dipende dal numero di controlli di cui stiamo parlando... Se sono solo 8, probabilmente le prestazioni si equivalgono in tutti i casi.

    TheTruster

    Ciao Mirko, si se rinomini i controlli indicizzandoli come hai suggerito è sicuramente più semplice e funzionale.

    Se non puoi rinominarli invece, e la collection Controls è sostanziosa, qualche centinaio di controlli, allora come mi è capitato di dover gestire con i limiti grafici di Access, la differenza è estremamente importante e visibile, e lavorare con le collection Custom con i raggruppamenti rende molto veloce l'iterazione per le operazioni grafiche in particolare.

  • Re: Forzare in ordine numerico delle caselle combinate tramite VBA

    Ciao, grazie soprattutto dei vostri suggerimenti, sono utili in tutti i sensi e nel caso le caselle ComboBox siano rinominati progressivamente è più che sufficiente ciò che aveva suggerito TheTrueter

    Dim I As Long
    
    For I = 1 To 8   '-> Oppure il numero massimo dei tuoi controlli
        With Me.Controls("cbo" & I)
            .Requery
            If .ListCount <= 1 Then .Value = .ItemData(0)
        End With
    Next I

    Questo è perché vengono inserite automaticamente tutti gli altri valori nella ComboBox altrimenti inserisco manualmente se ci sono più voci.

    Inoltre anche nel caso non volessi rinominare perché ormai sono già strutturati si potrebbe usare attraverso i TAG numerati progressivamente.

        For Each ctl In Me.Controls
        
        For I = n To 8
            If ctl.Tag = I Then
                If ctl.ControlType = acComboBox Then
                    ctl.Requery
                    If ctl.ListCount <= 1 Then ctl = ctl.ItemData(0)
                End If
            End If
        Next I
        
        Next
        Set ctl = Nothing

    In entrambi i casi vanno bene.

    Grazie anche a tutti gli altri che mi avete suggerito.

    Antonio

  • Re: Forzare in ordine numerico delle caselle combinate tramite VBA

    13/01/2026 - BLUES ha scritto:

    ComboBox siano rinominati progressivamente è più che sufficiente ciò che aveva suggerito TheTrueter

    Almeno finché non hai l'esigenza di una combo intermedia... Combo3,5... Combo2,75....

    Come ha suggerito Alex, meglio ridefinire la collection (o un alias).

  • Re: Forzare in ordine numerico delle caselle combinate tramite VBA

    13/01/2026 - @Alex ha scritto:

    In questi casi si può usare una Collection, se non si usa la Key in fase di Add(Item), ovviamente poi per puntare all'item specifico va ciclato ma con i controlli direi che è inutile, è discretamente più performante di un Array.

    Option Compare Database
    Option Explicit
    
    Dim mCCombo As Collection
    
    Private Sub Form_Load()
        Set mCCombo = New Collection
        With mCCombo
            .Add Me!Combo1
            .Add Me!Combo2
            .Add Me!Combo3
            .Add Me!Combo4
        End With
    End Sub

    Poi per usarla:

    Private Sub TestCollection()
        Dim mCbo As Access.Combo
        For Each mCbo In mCCombo
            Debug.Print mCbo.Name
        Next
    End Sub

    Ciao Alex, ho provato anche con questi codici ed è OTTIMO, funziona perfettamente, veloce e anche molto comodo.

    Non so se hai copiato a mano o copia/incolla ma ho dovuto correggere che mi dava l'errore:

    Dim mCbo As Access.ComboBox

    Grazie ancora.

    Antonio

Devi accedere o registrarti per scrivere nel forum
19 risposte