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-09T14:11:56+00:00

    L'ho provato e funziona a meraviglia!!!!

    Ho usato qualcosa di simile a questo

     Const cstrWsh = "FOGLIO"

     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 = 1

         strCboName = cstrCboPrefix & Format$(i, cstrCboFormat)

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

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

         Set oleo = olef.Object

         Set cbo = oleo.Object

       '====>  oleo.ListRow = 4   <====

        oleo.ListFillRange = "b3:c" & n_R + 2

         Set cbo = Nothing

         Set oleo = Nothing

         Set olef = Nothing

         Set wsh = Nothing

         Set wbk = Nothing

    Funziona PERFETTAMENTE e già questo mi permette di usare poche righe di codice invece di quasi 500

    Ho però tentato di modificare anche la ListRow  usando la riga  ==>  oleo.LisRrow = 4         <====

    ma mi  da l'errore di Runtime 438  "Proprietà o metodo non supportato dall'oggetto"

    E vista la vostra gentilezza chiedo qualche link a guide online di VBA. Ho programmato per 36 anni in assembler, cobol ed rpg ed ora che sono in pensione mi diverto molto col VBA solo che non sono riuscito a trovare delle guide valide e procedo molto a tentoni...

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2015-03-09T00:06:01+00:00

    Ciao Francesco,

    Mi dovete perdonare ma è la prima volta che uso la Community e mi sono espresso male

    L'intervallo della FillListRow riesco a gestirlo bene;

    quello che non riesco a gestire è il nome della combobox che voglio cambiare

    Forse non hai capito lo scopo del mio codice d'esempio!

    Comunque, per individuare tutte le ComboBox, forse ti sarebbe più chiaro un esempio del seguente tipo:

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

    Option Explicit

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

    Public Sub Demo3()

        Dim WB As Workbook

        Dim SH As Worksheet

        Dim n As Long

        Dim oleObj As OLEObject

        Set WB = ThisWorkbook

        Set SH = WB.Sheets("Foglio1")

        For Each oleObj In SH.OLEObjects

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

                n = n + 1

                Call MsgBox(Prompt:="Il nome della ComboBox # " _

                                  & n & " = " & oleObj.Name, _

                            Buttons:=vbInformation, _

                            Title:="ComboBox " & n)

            End If

        Next oleObj

    End Sub

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

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2015-03-08T20:41:39+00:00

    Mi dovete perdonare ma è la prima volta che uso la Community e mi sono espresso male

    L'intervallo della FillListRow riesco a gestirlo bene;

    quello che non riesco a gestire è il nome della combobox che voglio cambiare

    La riscrivo così:

    Sheets("FOGLIO").ComboBox(""cb_0" & N").ListFillRange = "b3:c5"    NON funziona

    oppure

    Nome_combo= "cb_0" & N    dove N è il nr del combobox che voglio variare 

    Sheets("FOGLIO").ComboBox("Nome_combo").ListFillRange = "b3:c5"  NON funziona

    se N è = 8 ed io scrivo

    Sheets("FOGLIO").cb_08.ListFillRange = "b3:c5"

    tutto funziona.

    Vi ringrazio dell'attenzione. Devo dire che non mi aspettavo tanta cortesia e sollecitudine.

    Grazie

    La risposta è stata utile?

    0 commenti Nessun commento