Come da titolo, il problema è come "riempire" una combobox coi dati da visualizzare, che non risiedono su un foglio excel, ma credo che il mio problema sia più di "logica del VBA" che altro, nel senso, dovrei capire dove recupera il VBA i dati per "costruire" i suoi elementi grafici.
Il problema nasce all'interno di una macro che, da word:
- fa scegliere un file excel tramite finestra di dialogo e ne ricava l'indirizzo (funzionante);
- di questo file excel, viene letto e memorizzato l'elenco dei fogli (funzionante);
- ora il problema: l'elenco dei fogli deve andare a riempire la combobox, affinchè l'utente scelga il foglio desiderato, e l'area di stampa venga inserita nel file di word.
Pensavo che potessi creare una combobox all'interno della macro, riempirla e poi fare combo.show, ma non è possibile, ho provato a creare una userform con all'interno una combobox, pensando di passargli i dati durante combobox_initialize, ma non posso passargli dati, quindi sono bloccato.
Come faccio a passare alla combobox al momento della sua creazione l'elenco dei fogli che ho precedentemente memorizzato in un array? Nel C++ passerei questo array tramite il costruttore, qui nel VBA, mi pare che questo non sia possibile...
Quindi che logica bisogna seguire?
Allego il file di word che sto utilizzando come prova, e qui il codice della macro
codice:
Sub insertExcel()
Dim wrdApp As Word.Application
Dim wrdDoc As Word.Document
Set wrdApp = GetObject(, "Word.Application")
wrdApp.Visible = True
Set wrdDoc = wrdApp.ActiveDocument '.Documents.Add
Dim s As Variant
Dim Res As Integer
Dim dlgOpen As FileDialog
Set dlgOpen = Application.FileDialog( _
FileDialogType:=msoFileDialogOpen)
dlgOpen.AllowMultiSelect = False
dlgOpen.Filters.Clear
dlgOpen.Filters.Add "Custom Excel Files", "*.xlsm, *.xlsx, *.csv, *.xls"
dlgOpen.FilterIndex = 1
Res = dlgOpen.Show
Dim xlApp As Object
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = False
If Not Res = 0 Then
For Each s In dlgOpen.SelectedItems 'There is only one
With wrdApp
.Selection.TypeText Text:=s 'passaggio fatto solo per verificare che acquisissi correttamente l'indirizzo del file, poi verrà tolto
.Selection.TypeParagraph
End With
xlApp.Workbooks.Open (s)
Next
End If
Dim i As Integer
Dim sheets As Integer
sheets = xlApp.ActiveWorkbook.sheets.Count
Dim fg() As String
ReDim fg(0 To sheets - 1) As String
For i = 0 To xlApp.ActiveWorkbook.sheets.Count - 1
fg(i) = xlApp.ActiveWorkbook.sheets(i + 1).Name
' Dentro "fg" avrò il nome del foglio di lavoro corrente
' quindi posso decidere di riportarlo da qualche parte.
'MsgBox "Nome foglio : " & fg(i)
Next i
Dim combo As ComboBox 'pensavo che potessi poi fare combo.show, ma non è possibile...
'ciclo for tramite il quale pensavo di poter inserire i nomi dei fogli nel combobox, e poi visualizzarlo
For i = 0 To UBound(fg) - 1
MsgBox "fg(" & i & ") " & fg(i)
' combo.AddItem "ciao"
Next
Call UserForm1.Show 'come faccio a passare a combobox1 i dati presenti in fg()?
MsgBox "Finito!"
xlApp.ActiveWorkbook.Close
Set wrdDoc = Nothing
Set dlgOpen = Nothing
Set wrdApp = Nothing
Set xlApp = Nothing
End Sub