Popolare una ListBox



  • Popolare una ListBox
    di Raffaele_53 (utente non iscritto) data: 08/10/2013 22:54:02

    Salve, in una Userform dovrei popolare una ListBox con dei valori
    Nel foglio, in colonna A ci sono dei codici, in colonna B delle date.
    Pertanto devo verificare se la data in colonna(B) sia maggiore di Data1 e minore di Data2

    Data1 = CDate("1/" & Combobox2.value & "/" & Combobox1)' Combobox1=Anno,Combobox2=Mese
    Data2 = DateSerial(Year(Data1), Month(Data1) + 1, 0)

    Con una macro semplice potrei farcela, mà non capisco come popolare un Array (credo si chiami cosi) e poi riversarlo della ListBox. Stavo provando con questo che copia tutto nella ListBox.
     
    Dim Righe, Colonne, R, C
     Dim Intervallo As Range 
    With Range("A1").CurrentRegion
    Righe = .Rows.Count - 1
    Colonne = .Columns.Count
    Set Intervallo = .Offset(1, 0).Resize(Righe, Colonne)
     End With
     With ListBox1 
    .Clear
    .ColumnCount = Colonne
    .BoundColumn = 2
    For R = 1 To Righe
    .AddItem
    For C = 1 To Colonne
    .List(R - 1, C - 1) = Intervallo(R, C)
    Next
    Next
     End With



  • di Raffaele_53 (utente non iscritto) data: 08/10/2013 23:04:31

    Sono arrivato qui, mà non so proseguire
     
    Private Sub Combobox1_change()
    Dim Data As Date
    If ComboBox2.Value = "" Then Exit Sub
    Data1 = CDate("1/" & ComboBox2.Value & "/" & ComboBox1.Value)
    Data2 = DateSerial(Year(Data1), Month(Data1) + 1, 0)
    Dim Righe, R, C
    Dim Intervallo As Range
    Righe = Range("A" & Rows.Count).End(xlUp).Row
    C = 2
    With Range("A1").CurrentRegion
    Set Intervallo = .Offset(1, 0).Resize(Righe, C)
     End With
     With ListBox1
    .Clear
    For R = 2 To Righe
    If Cells(R, 2) >= Data1 And Cells(R, 2) <= Data2 Then
    .AddItem
    .List(R - 1, C - 1) = Intervallo(R, C)
    End If
    Next
    End With
    End Sub



  • di Grograman (utente non iscritto) data: 09/10/2013 08:49:16

    Ciao Raffaele!

    Il file è pubblicabile?

    Sia bene che ricreare userform e controlli non è mai divertente



  • di Raffaele_53 (utente non iscritto) data: 09/10/2013 19:51:21

    L'ho allegato, è di un'altro forum, mà non c'è nulla di personale.

    Il tutto perchè vorrei imparare "queste stringhe scritte in memoria"
    Se noti la macro "Trova" mette le stringhe esatte in AD2
    Usando il codice (non mio) Combobox2.change le faccio apparire nella ListBox

    Io credo che lo stesso lavoro che fà la macro "Trova", lo possa fare direttamente ComboBox2_change e mettere i dati in ListBox.



  • di Grograman (utente non iscritto) data: 10/10/2013 08:55:55

    Ciao!

    Mancano le dichiarazioni di variabili, alcune le hai inoltre chiamate come dei controlli/librerie vba ed è sempre sconsigliabile ;)

    Rispiegami bene cosa vuoi ottenere per favore, nel frattempo prova le modifiche elencate sotto:

     
    'Public Data
    Private Sub UserForm_activate()
    'Me.ComboBox1.Value = Year(Date)
    'Me.ComboBox2.Value = Format(Month(Date), "mmmm")
    End Sub
    Private Sub Combobox1_change()
      Dim dtData As Date, dtData1 As Date, dtData2 As Date
      If ComboBox2.Value = "" Then Exit Sub
      dtData1 = CDate("1/" & ComboBox2.Value & "/" & ComboBox1.Value)
      dtData2 = DateSerial(Year(dtData1), Month(dtData1) + 1, 0)
      Dim Righe, R, C
      Dim Intervallo As Range
      Righe = Range("A" & Rows.Count).End(xlUp).Row
      C = 2
      With Range("A1").CurrentRegion
        Set Intervallo = .Offset(1, 0).Resize(Righe, C)
      End With
      With ListBox1
       .RowSource = "" '.Clear
        For R = 2 To Righe
          If Cells(R, 2) >= dtData2 And Cells(R, 2) <= dtData2 Then
            .AddItem
            .List(R - 1, C - 1) = Intervallo(R, C)
          End If
        Next
      End With
    End Sub
    Private Sub ComboBox2_change()
    Dim dtData As Date
    If ComboBox1 = "" Then Exit Sub
    dtData = CDate("1/" & ComboBox2 & "/" & ComboBox1)
    'Call Trova
      Dim Righe, Colonne, R, C
      Dim Intervallo As Range
      With Range("AD1").CurrentRegion
        Righe = .Rows.Count - 1
        Colonne = .Columns.Count
        Set Intervallo = .Offset(1, 0).Resize(Righe, Colonne)
      End With
     With ListBox1
      .RowSource = ""
      .ColumnCount = Colonne
      '.BoundColumn = 2
      .RowSource = Intervallo.Address
      'For R = 1 To Righe
      '.AddItem
      'For C = 1 To Colonne
      '.List(R - 1, C - 1) = Intervallo(R, C)
      'Next
      'Next
     End With
    End Sub
    
    
    'riassunto per la sub trova:
    Option Explicit
    Sub Trova()
      Dim Data As Date, Data1 As Date, Data2 As Date
      Data1 = CDate("1/7/2013")
      Data2 = DateSerial(Year(Data1), Month(Data1) + 1, 0)
      Dim Righe, R, C
      Righe = Range("A" & Rows.Count).End(xlUp).Row
      C = 2
      Range("AD1:AE1000").ClearContents
      For R = 2 To Righe
        If Cells(R, 2) >= Data1 And Cells(R, 2) <= Data2 Then
          Range(Cells(R, 1), Cells(R, 5)).Copy Range("AD" & C & ":AH" & C)
          C = C + 1
        End If
      Next
    End Sub



  • di Raffaele_53 (utente non iscritto) data: 10/10/2013 11:40:55

    Ciao Grograman
    L'ho provato velocemente, lo riprovo stasera con calma (cerco di spiegarmi)

    Se metto l'anno e la combobox2 e vuota deve uscire dal codice (oppure viceversa).

    Siccome ad ogni cambiamento delle (combobox1 o combobox2) dovrà ripopolare la Listbox1.
    Deve azzerare sempre la listbox prima di uscire o proseguire.
    >>>If ComboBox"Y".Value = "" Then Exit Sub' credo risulta insufficente, pertanto pensavo di modificarla in:

    If ComboBox"Y" = "" Then
    ListBox1.RowSource = ""
    Exit Sub
    End If

    Adesso (Tuo codice),quando sia la combobox1 e combobox2 saranno compilate, dovrà eseguire la ricerca delle date in questione.
    Ammettiamo d'aver messo settembre/2013 ci saranno tre risultati (le ho già viste nella listbox).
    Potrebbe essere che abbia sbagliato scelgliendo l'anno o il mese, ricambiando una delle due riesegue il tutto, cancellando prima la listbox e andando a trovare quelle dell'ultima modifica.

    Pertanto se metto anno 2012, dovrebbe cancellare la listbox e apparire due date
    Pertanto se metto anno 2011, dovrebbe cancellare la listbox e non apparire nulla

    Naturalmento lo stesso se cambio il mese.

    Ps. Dopo la modifica sopra non estrae più nulla???
    Rimmesso il Tuo codice non appare più nulla???

    Devo andare lo rivedo stasera, per adesso grazie mille.
    Il calendar presente servirà solo per fare estrazioni giornaliere



  • di Raffaele_53 (utente non iscritto) data: 10/10/2013 15:42:46

    Ho riprovato.
    Le avevo viste perchè ripremendo nuovamente sulla combobox2 mi ha inportato le celle scritte in AD2 (di prova)

    Aprendo il files, inserendo prima il mese settembre nella combobox2.
    Poi nella Combobox1 "2013" non scrive nulla.
    Mi dà errore in .List(R - 1, C - 1) = Intervallo(R, C)



  • di Raffaele_53 (utente non iscritto) data: 11/10/2013 19:45:00

    Risolto
     
    Private Sub Combobox1_change()
      Dim cl As Object
      Dim dtData1 As Date, dtData2 As Date
      If ComboBox2.Value = "" Then Exit Sub
      dtData1 = CDate("1/" & ComboBox2.Value & "/" & ComboBox1.Value)
      dtData2 = DateSerial(Year(dtData1), Month(dtData1) + 1, 0)
      Dim Righe, R, C
      Dim Intervallo As Range
      Righe = Range("A" & Rows.Count).End(xlUp).Row
    Set Intervallo = Range(Cells(2, 2), Cells(Righe, 2))
      ListBox1.Clear
        For Each cl In Intervallo
          If cl >= dtData1 And cl <= dtData2 Then
            ListBox1.AddItem cl.Offset(0, -1)
          End If
        Next
        Set Intervallo = Nothing
    End Sub



  • di mb data: 11/10/2013 20:56:50

    Ciao Raffaele
    ho curiosato nel tuo file per cercare di imparare un po' il funzionamento di vba
    mi spieghi però l'utilità/funzionamento del calendario all'interno della userform quando in effetti la popolazione della list è fatta tramite l'altra selezione??
    grazie forse mi è sfuggito qualche passaggio



  • di Raffaele_53 (utente non iscritto) data: 11/10/2013 21:06:53

    Ciao
    Il problema era trovare le date corrispondenti all'anno e mese delle combobox
    Modificando le due celle del calendar1 (anno+mese) non esegue nulla. Bisogna per forza cliccare su un giorno. A questo punto erano tre i passaggi da compiere e non solamente due. Il calendar1 l'ho lasciato solo perchè se un domani volesse estrare solo quel giorno, lo può fare dal calendar1

    Ho spostato solo la 1 macro se Vuoi sposto anche la altre due.



  • di mb data: 12/10/2013 08:00:16

    buongiorno Raffaele
    saresti molto gentile se posti tutto
    grazie e buon fine settimana



  • di Raffaele_53 (utente non iscritto) data: 12/10/2013 12:51:29

    Allegato



  • di mb (utente non iscritto) data: 12/10/2013 13:47:22

    grazie
    buon pomeriggio