Gestione dinamica del nome di una ComboBox

Anonimo
2015-03-07T20:27:03+00:00

In un foglio ho 49 ComboBox alimentate dinamicamente da intervalli del foglio

Le ComboBox si chiamano  da cb_01 fino a cb_49

Ho la necessità di ridefinire dinamicamente le proprietà di queste ComboBox.

ad esempio:

Sheets("FOGLIO").cb_01.ListFillRange = "b3:c" & n

questa istruzione FUNZIONA e mi aggiorna l'intervallo su cui poggia la ComboBox

Ma quando tento di inserire dinamicamente il nome della ComboBox nascono i problemi

ho provato con queste istruzioni, ma nessuna funziona

Sheets("FOGLIO").ComboBox(""cb_0" & b").ListFillRange = "b3:c" & n

Nome_combo= "cb_0" & b

Sheets("FOGLIO").ComboBox("Nome_combo").ListFillRange = "b3:c" & n

Come posso fare ?

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
2015-03-10T07:10:54+00:00

Ciao Francesco LE ROSE,

è datato (anche il Visual Basic che usiamo noi lo è) ma è l'unico testo che mi sento di indicare:

Francesco Balena

Programming Microsoft® Visual Basic® 6.0

Penso si riesca ancora a trovare, e non a caro prezzo, l'edizione italiana (Mondadori Informatica) della quale qualche anno fa (2009?) è stata pubblicata una edizione speciale per il decimo anniversario dell'uscita.

Tolta la parte che parla specificamente dell'ambiente di sviluppo Visual Basic 6.0, che noi non usiamo, tutto ciò che riguarda il linguaggio e la sua particolare implementazione degli oggetti, che ti interessa, è sviscerata con notevole cura.

La risposta è stata utile?

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2015-03-09T04:39:46+00:00

Ciao Francesco LE ROSE. (Ciao Norman!)

Francesco, ti eri espresso benissimo. Solo non hai eseguito gli esempi, di Norman e mio. Quando ti viene proposta una soluzione non basta leggerla, bisogna anche sperimentarla e eseguirla passo passo e ispezionare i valori che assumono le variabili. Solo così si riesce a capire a fondo ciò che viene proposto. 

Ora ti ripropongo il mio esempio, in due versioni con commenti, spero significativi. Falli girare in una Cartella di lavoro nuova, con almeno due ComboBox.

' Module: Modulo1

'

Option Explicit

' Uso didattico. È evidenziata la gerarchia degli oggetti.

'

Public Sub Test1()

Const cstrWsh = "Foglio1"

Const cstrCboPrefix = "cb_"

Const cstrCboFormat = "00"

Dim wbk         As Excel.Workbook

Dim wsh         As Excel.Worksheet

Dim olef        As Excel.OLEFormat

Dim oleo        As Excel.OLEObject

Dim cbo         As MSForms.ComboBox

Dim strCboName  As String

Dim i           As Long

Dim n           As Long

    Set wbk = Application.ThisWorkbook

    Set wsh = wbk.Worksheets.Item(cstrWsh)

    ' Ora definisco 'dinamicamente' il nome di una ComboBox

    ' che nel tuo progetto si chiamano "cb_" + un numero

    ' di due cifre. In questo caso uso la numero 2:

    '

    i = 2

    strCboName = cstrCboPrefix & Format$(i, cstrCboFormat)

    Debug.Print "'"; strCboName; "'"

    Set olef = wsh.Shapes.Item(strCboName).OLEFormat

    Set oleo = olef.Object

    Set cbo = oleo.Object

    n = 5

    oleo.ListFillRange = "B3:C" & n

    Debug.Print "'"; oleo.ListFillRange; "'"

    Set cbo = Nothing

    Set oleo = Nothing

    Set olef = Nothing

    Set wsh = Nothing

    Set wbk = Nothing

End Sub

' Uso normale.

'

Public Sub Test2()

Const cstrWsh = "Foglio1"

Const cstrCboPrefix = "cb_"

Const cstrCboFormat = "00"

Dim wbk         As Excel.Workbook

Dim wsh         As Excel.Worksheet

Dim oleo        As Excel.OLEObject

Dim strCboName  As String

Dim i           As Long

Dim n           As Long

    Set wbk = Application.ThisWorkbook

    Set wsh = wbk.Worksheets.Item(cstrWsh)

    ' Ora definisco... (Vedi commento in Test1)

    '

    i = 2

    strCboName = cstrCboPrefix & Format$(i, cstrCboFormat)

    Debug.Print "'"; strCboName; "'"

    Set oleo = wsh.Shapes.Item(strCboName).OLEFormat.Object

    n = 5

    oleo.ListFillRange = "B3:C" & n

    Debug.Print "'"; oleo.ListFillRange; "'"

    Set oleo = Nothing

    Set wsh = Nothing

    Set wbk = Nothing

End Sub

La risposta è stata utile?

0 commenti Nessun commento

12 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2015-03-08T09:53:32+00:00

    Ciao Francesco,

    In alternativa, se i nomi delle ComboBox sono nella forma di cb1 ... cbn, forse potresti provare:

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

    Option Explicit

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

    Public Sub Demo2()

        Dim WB As Workbook

        Dim SH As Worksheet

        Dim i As Long, n As Long

        Dim oleObj As OLEObject

        Dim sStr As String

        Const sPrefisso As String = "cb"                                        '<<==== Modifica

        Set WB = ThisWorkbook

        Set SH = WB.Sheets("Foglio1")

    n = 2                                                                              '<<==== Modifica

        For Each oleObj In SH.OLEObjects

            If oleObj.progID = "Forms.ComboBox.1" Then

            sStr = oleObj.Name

            sStr = Replace(sStr, sPrefisso, "")

                i = n + CLng(sStr)

                oleObj.ListFillRange = "B1:B" & i

            End If

        Next oleObj

    End Sub

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

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2015-03-08T08:36:36+00:00

    Ciao Francesco,

    In un foglio ho 49 ComboBox alimentate dinamicamente da intervalli del foglio

    Le ComboBox si chiamano  da cb_01 fino a cb_49

    Ho la necessità di ridefinire dinamicamente le proprietà di queste ComboBox.

    ad esempio:

    Sheets("FOGLIO").cb_01.ListFillRange = "b3:c" & n

    questa istruzione FUNZIONA e mi aggiorna l'intervallo su cui poggia la ComboBox

    Ma quando tento di inserire dinamicamente il nome della ComboBox nascono i problemi

    ho provato con queste istruzioni, ma nessuna funziona

    Sheets("FOGLIO").ComboBox(""cb_0" & b").ListFillRange = "b3:c" & n

    Nome_combo= "cb_0" & b

    Sheets("FOGLIO").ComboBox("Nome_combo").ListFillRange = "b3:c" & n

    Come posso fare ?

    Se ho capito bene la tua esigenza, prova qualcosa del genere:

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

    Option Explicit

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

    Public Sub Demo()

        Dim WB As Workbook

        Dim SH  As Worksheet

        Dim n As Long

        Dim oleObj As OLEObject

        Set WB = ThisWorkbook

        Set SH = WB.Sheets("Foglio1")

    n = 2 '<<==== Modifica

        For Each oleObj In SH.OLEObjects

            If oleObj.progID = "Forms.ComboBox.1" Then

                n = n + 1

                oleObj.ListFillRange = "B1:B " & n

            End If

        Next oleObj

    End Sub

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

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2015-03-08T08:32:11+00:00

    Ciao Francesco LE ROSE,

    sperimenta il codice seguente nel modulo Visual Basic del Foglio di lavoro(Worksheet):

    Public Sub Test()

    Dim cb  As Excel.OLEFormat

    Dim n   As Long

        n = 5

        Set cb = Me.Shapes.Item("cb_01").OLEFormat

        With cb.Object

          .ListFillRange = "B3:C" & n

        End With

        Set cb = Nothing

    End Sub

    La risposta è stata utile?

    0 commenti Nessun commento