riportare dati da tabella



  • riportare dati da tabella
    di macrovb (utente non iscritto) data: 10/12/2015 16:43:10

    salve, ho la solita tabella piena di dati nel foglio1
    nel foglio 2 vorrei riportare le classi diametriche della colonna d in ogni cella (in senso orizzontale).
    Il problema è che nella tabella grezza i dati della colonna si ripetono, ma a me basta che siano citati una sola volta nel foglio 2.
    la tabella ha dati variabili quindi mi servirebbe una macro per fare questa operazione "al momento" e non una sola volta.

    allego un file di esempio che spero possa rendere piu chiaro il mio problema

    grazie in anticipo




  • di alfrimpa data: 10/12/2015 17:51:19

    Ciao macrovb

    Prova l'allegato file macrovb.xlsm dove è inserita la sottostante macro che dovrebbe fare quello che hai chiesto.

    Fai delle prove e fai sapere.

    Alfredo
     
    Sub CreaElencoUnivoco()
     Dim CL As Range, Intervallo As Range, Elenco As New Collection
     Dim numval As Integer
     Dim i As Integer
     Application.ScreenUpdating = False
     Worksheets("Foglio1").Select
     Set Intervallo = Range("d21", Range("d2").End(xlDown))
     On Error Resume Next
     For Each CL In Intervallo
        Elenco.Add CL.Value, CStr(CL.Value)
     Next CL
     On Error GoTo 0
     numval = Elenco.Count
     Worksheets("foglio2").Activate
     Range("a2:z2").ClearContents
     For i = 1 To numval
        Cells(2, i) = Elenco(i)
     Next i
     Application.ScreenUpdating = True
     End Sub
    






  • di alfrimpa data: 10/12/2015 22:30:06

    Ciao macrovb

    Ti allego altro file (macrovb1.xlsm) dove, a differenza del precedente, i valori vengono riportati sulla riga 2 del foglio2 in ordine crescente.

    Ti riporto sotto le macro.

    Anche qui fai molte prove per essere sicuri del corretto funzionamento e fai sapere.

    Ovviamente la macro da lanciare è la Sub CreaElencoUnivoco()

    Alfredo 
     
    Sub CreaElencoUnivoco()
     Dim CL As Range, Intervallo As Range, elenco As New Collection
     Dim numval As Integer
     Dim I As Integer
     Dim k As Integer
     Dim J As Integer
     Application.ScreenUpdating = False
     Worksheets("Foglio1").Select
     Set Intervallo = Range("d21", Range("d2").End(xlDown))
     On Error Resume Next
     For Each CL In Intervallo
        elenco.Add CL.Value, CStr(CL.Value)
     Next CL
     On Error GoTo 0
     numval = elenco.Count
     Worksheets("foglio2").Activate
     Range("a2:z2").ClearContents
     For k = 1 To elenco.Count - 1
        For J = k + 1 To elenco.Count
            If elenco(k) > elenco(J) Then Swap elenco, k, J
        Next J
     Next k
     For I = 1 To numval
        Cells(2, I) = elenco(I)
     Next I
     Application.ScreenUpdating = True
     End Sub
     
    Sub Swap(ByVal elenco As Collection, ByVal k As Long, ByVal J As Long)
    elenco.Add elenco(J), , , k
    elenco.Add elenco(k), , , J + 1
    elenco.Remove k
    elenco.Remove J
    End Sub
    






  • di Macrovb (utente non iscritto) data: 10/12/2015 22:30:20

    Grazie mille, domani provo e ti faccio sapere!



  • di macrovb (utente non iscritto) data: 12/12/2015 14:52:53

    ciao, sto provando la macro dell'esempio ... sembra andare tutto bene con le varie prove... piu in la aggiorno a casomai segnalo come risolta ;)


    buon w_end



  • di macrovb (utente non iscritto) data: 12/12/2015 15:29:29

    Allora dopo varie prove nell'esempio da te postato ho provato a rifare la macro su un altro foglio (giusto per capirla meglio);
    Non ho capito però alcune righe del tu codice:

    riga1-Set Intervallo = Range("d21", Range("d2").End(xlDown))

    riga2-For I = 1 To numval
    Cells(2, I) = elenco(I)
    Next I
    Application.ScreenUpdating = True


    sotto invece allego il codice con le mie modifiche (solamente il nome dei fogli e l'intervallo dove incollare i risultati. Ho modificato pure la riga 1 (quella postata sopra) inserendo la lettera della colonna dove sono presenti i dasti da riportare (non d ma g)


    cliccando sul button si passa al foglio report ma le celle rimangono bianche senza aver riportato i dati
     
    
    Option Explicit
    
    Sub Triangoloisoscele5_Click()
    Dim CL As Range, Intervallo As Range, elenco As New Collection
     Dim numval As Integer
     Dim I As Integer
     Dim k As Integer
     Dim J As Integer
     Application.ScreenUpdating = False
     Worksheets("DATI").Select
     Set Intervallo = Range("g21", Range("g2").End(xlDown))
     On Error Resume Next
     For Each CL In Intervallo
        elenco.Add CL.Value, CStr(CL.Value)
     Next CL
     On Error GoTo 0
     numval = elenco.Count
     Worksheets("REPORT").Activate
     Range("a20:D20").ClearContents
     For k = 1 To elenco.Count - 1
        For J = k + 1 To elenco.Count
            If elenco(k) > elenco(J) Then Swap elenco, k, J
        Next J
     Next k
     For I = 1 To numval
        Cells(2, I) = elenco(I)
     Next I
     Application.ScreenUpdating = True
    
    End Sub
    
    Sub Swap(ByVal elenco As Collection, ByVal k As Long, ByVal J As Long)
    elenco.Add elenco(J), , , k
    elenco.Add elenco(k), , , J + 1
    elenco.Remove k
    elenco.Remove J
    End Sub
    



  • di alfrimpa data: 12/12/2015 18:37:24

    Ciao macrovb

    Ti ho allegato file (macrovb2.xlsm) dove ho apportato una piccola correzione al codice e le modifiche da te indicate (come da macro nel riquadro sotto).

    Ho anche inserito una forma sul foglio REPORT cui ho associato la macro e mi pari riporti correttamente i dati dal foglio DATI colonna G.

    Quanto alle tue domande cerco di spiegare

    1) Questa istruzione Set Intervallo = Range("g2", Range("g2").End(xlDown)) imposta nella variabile di tipo Range Intervallo la zona da cui prendere i dati.

    2) numval è una variabile numerica dove memorizzo il numero degli elementi della Collection elenco (sai cosa sono le Collection?)

    3) con questa istruzione Cells(2, I) = elenco(I) dico alla macro di scrivere sulla riga 2 colonna per colonna sino a quella definita da numval gli elementi della Collection elenco

    4) Con Next I si chiude un precedente ciclo For

    5) Con Application.ScreenUpdating = True viene riabilitato l'aggiornamento dello schermo in precedenza disabilitato con Application.ScreenUpdating = False

    Io non so se tu riuscirai a comprendere queste mie indicazioni (dipende dal tuo livello di conoscenza del VBA) ma ho cercato di essere il meno criptico possibile (se hai domande chiedi pure nella speranza che sappia risponderti, perché non è detto che ne sia capace).

    Va anche detto che il tuo problema poteva risolversi forse più semplicemente con la seguente procedura.

    1) Con il Filtro dati Avanzato copiare in altra parte del foglio i dati univoci dal foglio DATI;
    2) Fare l'ordinamento crescente di tale zona
    3) Fare un Copia/Incolla/Trasponi di detti dati sull'intervallo di destinazione finale

    magari registrando tali operazioni con il registratore macro ed avere il relativo codice ovviamente poi da adattare.

    Alfredo

    P.S. Io avevo preso in considerazione la colonna D perché tu nel tuo primo post avevi parlato di classi diametriche che sono appunto nella colonna D.
     
     
    Sub CreaElencoUnivoco()
     Dim CL As Range, Intervallo As Range, elenco As New Collection
     Dim numval As Integer
     Dim I As Integer
     Dim k As Integer
     Dim J As Integer
     Application.ScreenUpdating = False
     Worksheets("DATI").Select
     Set Intervallo = Range("G2", Range("G2").End(xlDown))
     On Error Resume Next
     For Each CL In Intervallo
        elenco.Add CL.Value, CStr(CL.Value)
     Next CL
     On Error GoTo 0
     numval = elenco.Count
     Worksheets("REPORT").Activate
     Range("a2:z2").ClearContents
     For k = 1 To elenco.Count - 1
        For J = k + 1 To elenco.Count
            If elenco(k) > elenco(J) Then Swap elenco, k, J
        Next J
     Next k
     For I = 1 To numval
        Cells(2, I) = elenco(I)
     Next I
     Application.ScreenUpdating = True
     End Sub
     
    Sub Swap(ByVal elenco As Collection, ByVal k As Long, ByVal J As Long)
    elenco.Add elenco(J), , , k
    elenco.Add elenco(k), , , J + 1
    elenco.Remove k
    elenco.Remove J
    End Sub






  • di macrovb (utente non iscritto) data: 14/12/2015 09:56:09

    sembra essere ok alfre, ora provo a ricreare la stesa macro per altri campi/tabelle.... grazie mille e buone feste!



  • di macrovb (utente non iscritto) data: 17/12/2015 15:52:53

    CIAO a tutti, considerando sempre l'esempio postato da me e da alfre giorni fa, è possibile ottenere la stessa macro anche se alcune celle della colonna da riportare sono vuote???


    grazie



  • di macrovb (utente non iscritto) data: 17/12/2015 15:55:12

    ho allegato l ultimo file postato modificato ( ho cancellato alcuni valori delle celle interessate)



  • di alfrimpa data: 17/12/2015 15:58:19

    Cioè stai chiedendo se la macro funziona ugualmente (ossia restituisce risultati corretti) pur in presenza di celle vuote nella colonna in esame?

    Tu hai provato a cancellare qualche valore nella colonna e vedere cosa succede?

    Alfredo





  • di macrovb (utente non iscritto) data: 17/12/2015 15:59:51

    ciao Alfredo, si ho provato a cancellare qualche valore .... vengono riportati, nel fg 2, solo i valori presenti prima della cella cancellata



  • di alfrimpa data: 17/12/2015 16:14:22

    Scusa macrovb ma nella colonna G del foglio DATI non ci sono valori duplicati diversamente dalla colonna D (classi diametriche) che avevi indicato in precedenza.

    Ed infatti in mancanza di valori duplicati la macro non è che abbia molto senso; basta fare un copia, incolla speciale e trasponi (o sono io che mi perdo qualcosa?)

    Quanto al problema che hai sollevato ora non saprei; i database (tabelle), di norma, devono essere completi e quindi non avere "buchi".

    Riesci a spiegare meglio quello che devi fare?

    Alfredo





  • di macrovb (utente non iscritto) data: 17/12/2015 16:20:52

    si Alfredo, la colonna interessata è la D.

    Mi sono accorto che alcune celle della colonna D (in un altro file) non hanno valori; applicando la macro i valori sotto la cella vuota non mi vengono riportati.
    Qualcuno saprebbe come ovviare a tale problema?

    grazie



  • di alfrimpa data: 17/12/2015 16:38:23

    Allora il tutto si ridurrebbe a:

    1) copia dei dati in altra parte del foglio
    2) rimozione dei duplicati
    3) ordinamento dei valori rimasti
    4) copia/incolla speciale/trasponi sul foglio REPORT

    Se usi il registratore di macro avrai anche il codice

    Ovviamente tale procedura va bene anche nel caso non ci siano celle vuote.

    Alfredo