da matrice a tabella



  • da matrice a tabella
    di Jellyfish data: 23/11/2012 12:50:10

    Ciao a tutti

    ho una matrice e devo ottenerne una tabella piatta...

    Idee???

    vi allego un esempio



  • di Vecchio Frac data: 23/11/2012 15:11:06

    Piatta? stampala su un foglio, vedrai che bella dritta che ti viene ^_^

    Guarda che bella la funzione flatten() :)
    Usa un ciclo For Each per ogni elemento della matrice e lo assegna ad un nuovo vettore a una dimensione.
    I valori vengono scorsi per riga da sinistra a destra e dall'alto in basso.
    Si usa così:
    s = flatten([A1:A10])
    e ottieni un vettore di stringa in base 1 (l'indice di "s" indica un elemento del vettore originale: s(1), s(2), s(...), etc)
     
    Function flatten(r As Range) As Variant
    Dim i As Integer, vect() As String, v As Variant
        ReDim vect(1 To r.Count)
        For Each v In r
            i = i + 1
            vect(i) = v
        Next
        flatten = vect
    End Function






  • di Jellyfish data: 25/11/2012 15:51:13

    mmmm... non ho capito un picchio :(



  • di Vecchio Frac data: 25/11/2012 17:38:59

    Cara la mia Mascotte,
    cosa non hai capito?
    1) la battuta(ccia),
    2) il ragionamento sulla funzione,
    3) il codice della funzione,
    4) cosa fa e come si usa la funzione flatten().

    Scegli un'opzione o anche più :)

    In più, in palio uno zucchero filato a chi altri risponderà a queste domande :D






  • di Jellyfish data: 26/11/2012 00:13:24

    cit --> "assegna ad un nuovo vettore a una dimensione" ---> cioè?

    forse mi manca il concetto di vettore...

    cos'è v?

    Non riusciresti a farmi un esempio sul file che ho allegato?

    Grazie mille
    Jelly

    PS: la battuta è l'unica cosa che ho capito



  • di Vecchio Frac data: 26/11/2012 10:50:19

    Eh già, da come l'avevi messa non l'avevo mica capita :)
    Solo dopo aver analizzato meglio il tuo esempio ci sono arrivato.
    Tu non vuoi semplicemente appiattire un range, vuoi avere una nuova tabella dove - in corrispondenza delle "x" - siano elencati i riferimenti di riga e colonna.
    Ti ho preparato un pezzo di codice che fa questo.
    Si usa così:

    flat range_iniziale, cella_destinazione

    ad esempio riprendendo il tuo file:
    flat [b4:i8], [k11]

    otterrai a partire da K11 i risultati delle corrispondenze trovate, e il bello è che puoi cambiare le intestazioni di riga e colonna e te le troverai nel risultato (ad esempio se invece che 1, 2, 3, 4 nelle colonne metti pere, mele, banane etc ti ritroverai queste etichette).

    Il vettore è semplicemente un array di valori.
    Una dimensione significa che c'è solo un elemento in ogni indice del vettore: s(1)="ciao", s(2)="come", s(3)="stai" ecc. La funzione flatten() semplicemente trasforma una matrice a più dimensioni (come è una selection di Excel, un insieme di righe e colonne) in un'unica sequenza con un elemento solo.
     
    Option Explicit
    
    Sub flat(r_from As Range, r_dest As Range)
    Dim cella As Range, first_found As String, i As Integer, x As String
       
        With r_from
            Set cella = .Find("x")
            If Not (cella Is Nothing) Then
                first_found = cella.Address
                Do
                    r_dest.Offset(i) = r_from(1, cella.Column - r_from.Column + 1) 'lettera di riga
                    r_dest.Offset(i, 1) = r_from(cella.Row - r_from.Row + 1, 1) 'numero di colonna
                    i = i + 1
                    Set cella = .FindNext(cella)
                Loop While Not cella Is Nothing And cella.Address <> first_found
            End If
        End With
        
    End Sub