Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177

    [VBA] Popolare ComboBox

    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
    File allegati File allegati

  2. #2
    Utente di HTML.it L'avatar di patel
    Registrato dal
    Jan 2008
    Messaggi
    1,995
    potresti provare a popolare la combo col metodo additem inserito in un ciclo che scandisce gli elementi dell'array

  3. #3
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Quote Originariamente inviata da patel Visualizza il messaggio
    potresti provare a popolare la combo col metodo additem inserito in un ciclo che scandisce gli elementi dell'array
    Ho superato il blocco relativo al riempimento della combobox1: bastava richiamarla come ComboBox1 e usare .additem

    Ora però ho un'ulteriore difficoltà: alla userform ho aggiunto due pulsanti , commandbutton1 "ok" e commandbutton2 "Annulla".
    Quando clicco commandbutton1, vorrei:
    - recuperare il valore dell'item selezionato nella combobox (funzionante);
    - sfruttare quell'indice per far partire la copia del range "Area_stampa" del foglio desiderato.

    La macro che seleziona il range e lo copia in word è da adattare, ho trovato un esempio in internet e fa questo però da excel verso un nuovo documento word, ma con qualche aggiustatina non dovrei aver grosse difficoltà.
    Il problema sostanziale, che credo sia più di logica del VBA che altro, nella macro sotto riportata, una volta fatto Userform1.show, come faccio a passare alla sub commandbutto1.click l'oggetto xlApp da cui effettuare la copia dell'area di interesse?

    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
        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
        Next i
        For i = 0 To UBound(fg)
            UserForm1.ComboBox1.AddItem fg(i)
        Next
        Call UserForm1.Show
        xlApp.ActiveWorkbook.Close savechanges:=False
        MsgBox "Finito!"
        Set xlApp = Nothing
        Set dlgOpen = Nothing
        Set wrdDoc = Nothing
        Set wrdApp = Nothing
    End Sub
    File allegati File allegati
    Ultima modifica di ing82; 16-03-2021 a 13:24

  4. #4
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Visto che non si aggiorna la discussione, quindi sembra che non abbia risposto, lascio questo messaggio...anche se la risposta è la precedente

  5. #5
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Cambiando un pochino la logica, ottenuto il risultato desiderato.
    Per chi volesse, allego il file funzionante.
    Ciao!
    File allegati File allegati

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.