Combobox multicolonna non contigue

Anonimo
2017-10-10T08:02:10+00:00

Buongiorno a tutti,

avrei bisogno di una macro in cui una Combobox (ActiveX)  su una UserForm mi visualizzi i dati di alcune colonne.

es: la Combobox dovrebbe visualizzare i dati delle colonne da B2,C2,G2,H2,I2 a scendere.

A B C D E F G H I L M
Codice Grado Ruolo Categoria Specialità Qualifica Posizione di Stato Cognome Nome Matricola Nome Cognome e Matricola
a d g l o
b e h m p
c f i n q
1 4 7 10 13
2 5 8 11 14
3 6 9 12 15

potete aiutarmi.

Grazie e buona giornata.

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-10-10T15:32:08+00:00

Ciao Danilo,

Grazie per l'attenzione. Il codice è quello giusto.

Bene!

Non vorrei farti perdere ulteriore tempo, ma ho un problema.

cerco di fare questo inserimento nella cella A50, es: Sheets("Foglio1").Range("A50") = Me.Combobox1.Text

ma mi inserisce solo la prima voce (B2), come posso fare per immettere le ulteriori voci delle colonne C2,G2,H2,I2?

Per restituire i valori di una data riga di un controllo ComboBox (o ListBox) con più colonne, sarebbe necessario gestire l'array di valori de quella riga! La proprietà Value di un tale controllo ComboBox restituirebbe solo il valore di una singola colonna, ovvero la colonna precisata dalla proprietà BoundColumn del controllo. Per default questa sarebbe la prima colonna. Per vedere un esempio di un modo di restituire i valori della scelta riga del controllo vedi la procedura cbCopiaDati  nel codice qui sotto e, per provarlo, premi il pulsante Copia Dati nella Userform2 del mio file di prova aggiornato.

Come si  visualizzano tutte le voci nella Combobox1?

Se avessi utilizzato un controllo ListBox, come suggerito da me e come dimostrato nel file che avevo caricato, vedresti le voci automaticamemrnte. Nel caso della tua ComboBox, prova a premere la freccia di discesa.

Ho copiato il codice e al momento non ho l'opportunità di scaricare il file che hai postato.

Per curiosità, è possibile avere un esempio di come caricare la Combobox con il secondo approccio di cui parlavi?

Crea una seconda Userform, Userform2, con un controllo ListBox, e due pulsanti denominati cbCopiaDati e cbEsci, In un modulo standard, incolla il seguente codice:

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

Option Explicit

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

Public Sub MostraUserform()

    UserForm2.Show vbModeless

End Sub

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

Public Function LastRow(SH As Worksheet, _

                        Optional Rng As Range, _

                        Optional minRow As Long = 1, _

                        Optional sPassword As String)

    Dim bProtected As Boolean

    With SH

        If Rng Is Nothing Then

            Set Rng = .Cells

        End If

        bProtected = .ProtectContents = True

        If bProtected Then

            .Unprotect Password:=sPassword

        End If

    End With

    On Error Resume Next

    LastRow = Rng.Find(What:="*", _

                       after:=Rng.Cells(1), _

                       Lookat:=xlPart, _

                       LookIn:=xlFormulas, _

                       SearchOrder:=xlByRows, _

                       SearchDirection:=xlPrevious, _

                       MatchCase:=False).Row

    On Error GoTo 0

    If LastRow < minRow Then

        LastRow = minRow

    End If

    If bProtected Then

        SH.Protect Password:=sPassword, _

                   UserInterfaceOnly:=True

    End If

End Function

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

Nel modulo di codice della seconda Userform, incolla il seguente codice:

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

Option Explicit

Dim WB As Workbook

Dim SH As Worksheet

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

Private Sub cbCopiaDati_Click()

    Dim destSH As Worksheet

    Dim destRng As Range

    Dim vArr As Variant

    Dim LRow As Long

    Const sFoglio2 As String = "Foglio2"

    Set destSH = WB.Sheets(sFoglio2)

    With destSH

        LRow = LastRow(destSH, .Columns("A:A"))

        Set destRng = .Range("A" & LRow + 1)

    End With

    With Me.ListBox1

        vArr = Application.Index(.List, .ListIndex + 1, 0)

    End With

    destRng.Resize(1, UBound(vArr)).Value = vArr

End Sub

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

Private Sub UserForm_Initialize()

    Dim Rng As Range

    Dim arrIn As Variant, arrDati As Variant, arrColonne As Variant

    Dim LRow As Long

    Dim Res As Variant

    Dim i As Long, j As Long, k As Long

    Const sFoglio As String = "Foglio1"

    Const sColonne As String = "2,3,7,8,9"  '\ Colonne B:C, G:I

    Set WB = ThisWorkbook

    Set SH = WB.Sheets(sFoglio)

    With SH

        LRow = LastRow(SH, .Columns("A:A"))

        Set Rng = .Range("A2:I" & LRow)

    End With

    arrIn = Rng.Value

    arrColonne = Split(sColonne, ",")

    ReDim arrDati(1 To UBound(arrIn), 1 To UBound(arrIn, 2) - UBound(arrColonne))

    For i = 1 To UBound(arrIn)

        k = 0

        For j = 1 To UBound(arrIn, 2)

            Res = Application.Match(CStr(j), (arrColonne), 0)

            If Not IsError(Res) Then

                k = k + 1

                arrDati(i, k) = arrIn(i, j)

            End If

        Next j

    Next i

    With Me.ListBox1

        .ColumnCount = UBound(arrDati, 2)

        .ColumnWidths = "70;70;100;85;85"

        .List = arrDati

        .ListIndex = 0

    End With

End Sub

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

Private Sub cbEsci_Click()

    Unload Me

End Sub

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

Potresti scaricare il mio file di prova aggiornato Danilo20171010.xlsm

===

Regards,

Norman

La risposta è stata utile?

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

7 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2017-10-10T17:17:24+00:00

    Ciao Danilo,

    Grazie per la pazienza, so che alcune volte chiedo più del dovuto, e come sempre rimani cortese nei confronti di chi sa molto meno.

    E' sempre un piacere!

    Il codice va benissimo, come sempre soddisfa a pieno l'esigenza.

    Mi fa piacere che tu abbia risolto il problema e ti ringrazio per il cortese riscontro.

    Alla prossima.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2017-10-10T16:47:16+00:00

    Ciao Norman,

    Grazie per la pazienza, so che alcune volte chiedo più del dovuto, e come sempre rimani cortese nei confronti di chi sa molto meno.

    Il codice va benissimo, come sempre soddisfa a pieno l'esigenza.

    Un caloroso grazie e buona serata. :-)

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2017-10-10T13:29:44+00:00

    Buongiorno Norman,

    Grazie per l'attenzione. Il codice è quello giusto.

    Non vorrei farti perdere ulteriore tempo, ma ho un problema.

    cerco di fare questo inserimento nella cella A50, es: Sheets("Foglio1").Range("A50") = Me.Combobox1.Text

    ma mi inserisce solo la prima voce (B2), come posso fare per immettere le ulteriori voci delle colonne C2,G2,H2,I2?

    Come si  visualizzano tutte le voci nella Combobox1?

    Ho copiato il codice e al momento non ho l'opportunità di scaricare il file che hai postato.

    Per curiosità, è possibile avere un esempio di come caricare la Combobox con il secondo approccio di cui parlavi?

    :-)grazie.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2017-10-10T09:35:14+00:00

    Ciao Danilo,

    avrei bisogno di una macro in cui una Combobox (ActiveX)  su una UserForm mi visualizzi i dati di alcune colonne.

    es: la Combobox dovrebbe visualizzare i dati delle colonne da B2,C2,G2,H2,I2 a scendere.

    Forse ti converebbe un oggetto ListBox

    In ogni caso, per un modo semplice, nel modulo di codice della Userform, prova qualcosa del genere:

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

    Option Explicit

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

    Private Sub UserForm_Initialize()

        Dim WB As Workbook

        Dim SH As Worksheet

        Dim Rng As Range

        Dim arrIn As Variant

        Dim LRow As Long

        Const sFoglio As String = "Foglio1"

        Set WB = ThisWorkbook

        Set SH = WB.Sheets(sFoglio)

        With SH

            LRow = LastRow(SH, .Columns("A:A"))

            Set Rng = .Range("B2:I" & LRow)

        End With

        With Me.ListBox1

            .ColumnCount = Rng.Columns.Count

            .ColumnWidths = "70;70;0;0;0;100;85;85"

            .ColumnHeads = True

            .RowSource = Rng.Address(External:=True)

            .ListIndex = 0

        End With

    End Sub

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

    Private Sub CommandButton1_Click()

        Unload Me

    End Sub

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

    Se volessi utilizzare invece un oggetto ComboBox, nel codice qui sopra, sostituisci il comando

              With Me.ListBox1

    con:

               With Me.ComboBox1

    Un approccio alternativo sarebbe quello di creare un array con solo i dati delle colonne di interesse e poi caricare l'oggetto ListBox/ComBox con l'array con in comando del genere:

               Me.ListBox1.List= ArrDati

    Con il primo approccio si nasconde tutte le colonne tranne quelle di interesse e si può vedere le intestazione delle colonne dentro il controllo; nel caso del secondo approccio, si carica il controllo solo con le colonne di interesse, ma sarebbe necessario urilizzare degli oggetti Label per indentificare le colonne,

    Potresti scaricare il mio file di prova Danilo20171010.xlsm

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento