2012-01-19 5 views
6

Ho aggiunto un ListBox a un SHEET (non a un "UserForm") L'ho fatto usando il mouse. Ho fatto clic sull'icona piccola Hammer and Wrench.Come faccio a fare riferimento a un oggetto di controllo, su un foglio di lavoro, usando un nome di variabile?

Questo ListBox sembra essere facilmente riferimento utilizzando il codice come questo:

ListBox1.Clear 

o

ListBox1.AddItem("An option") 

Tuttavia, ho tre di queste ListBoxes (nome, convenientemente, ListBox1, ListBox2, e ListBox3) e voglio scrivere una funzione per popolare con dati di array, come questo:

Call populate_listbox(ListBox2, designAreaArray) 

Se il primo argomento è il nome della casella di riepilogo, il secondo è i dati.

Ma non so come inviare "ListBox2" correttamente o farvi riferimento correttamente all'interno della funzione.

Ad esempio:

Dim controlName as string 
controlName = "ListBox1" 

non funziona, anche se definisco la funzione come segue:

Sub populate_listbox(LB As ListBox, dataArray As Variant) 
    Dim i As Integer: i = 0 
    For i = LBound(dataArray, 2) + 1 To UBound(dataArray, 2) ' Skip header row 
     LB.AddItem (dataArray(index, i)) 
    Next i 
End Sub 

Chiaramente traduce in un errore di tipo di dati mis-abbinato. Ho provato a definire "controlName" come ListBox, ma non ha funzionato neanche ...

Anche se forse è il mio riferimento alla listBox che non è corretto. Ho visto modi in tanti a fare riferimento a un oggetto di controllo ...

MSForms.ListBox. 
ME.ListBox 
Forms.Controls. 
Worksheet.Shapes. 

la lista potrebbe continuare un on, e niente ha funzionato per me.

risposta

6

Prova questo:

Dim cMyListbox As MSForms.ListBox 

Set cMyListbox = Sheet1.ListBox1 '// OR Worksheets("YourSheetName").Listbox1 

cMyListbox.AddItem("An option") 

Inoltre è possibile popolare una casella di riepilogo senza dover scorrere l'array, provate questo:

Dim cMyListbox As MSForms.ListBox 
Dim vArray As Variant 

Set cMyListbox = Sheet1.ListBox1 

vArray = Range("A1:A6").Value 
cMyListbox.List = vArray 
+0

Grazie. Ho modificato la mia risposta per justnS e ho impostato la mia variabile (cMyListbox) come indicato sopra, e la combinazione ha funzionato. Grazie per il suggerimento per quanto riguarda il riempimento della lista, anche. – Symmitchry

+0

No prob, contento che abbia funzionato per te. – Reafidy

3

Cambiare la firma sub a corrispondere a questo:

Sub populate_listbox(LB As MSForms.ListBox, dataArray As Variant)

Ora puoi passarlo come se fossi provato originariamente.

NOTA: funziona solo se è stata utilizzata la versione "ActiveX" della casella di riepilogo. Suppongo che lo sia perché sei in grado di chiamare ListBox1 direttamente da un modulo.

PS: i controlli ActiveX sono membri fuori dell'oggetto foglio padre. Quindi se hai la listbox1 sul foglio1, puoi anche chiamarla come Sheet1.ListBox1 così non ti confondi se ti ritroverai con più fogli con più listbox. Inoltre, potresti voler cambiare il nome solo per renderlo più facile per te stesso.

+0

Grazie per la risposta. Ho modificato la mia dichiarazione variabile per risposta di Reafidy e modificato il mio sub secondo il tuo, e ora funziona. – Symmitchry