Condividi:        

Capovolgere una matrice

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Capovolgere una matrice

Postdi bafio60 » 03/12/18 19:01

Avrei la necessità di capovolgere una matrice creata con questa istruzione;
Codice: Seleziona tutto
eArr = Range(Range("D4"), Range("H4").End(xlDown)).Value 

ho cercato su google ed ho trovato la funzione =matr.inversa ma non utilizzabile in una macro (almeno credo).
Non posso capovolgere i dati altrimenti avrei risolto velocemente.
Grazie a tutti
Bafio
bafio60
Utente Junior
 
Post: 11
Iscritto il: 09/08/16 18:57

Sponsor
 

Re: Capovolgere una matrice

Postdi Marius44 » 03/12/18 22:23

Ciao
Premetto che credo di non aver capito bene.

Sei certo che la formula indicata ti dia una "matrice utilizzabile"? Cioè, voglio dire, così come è impostata ti darà una vettore di oltre un milione di righe per 5 colonne. E' questo che ti serve?

Quando dici di voler "capovolgere" la matrice cosa intendi esattamente? Fai un esempio concreto.

Ciao,
Mario
Marius44
Utente Senior
 
Post: 655
Iscritto il: 07/09/15 22:00

Re: Capovolgere una matrice

Postdi Anthony47 » 03/12/18 23:50

Dando per scontato che quel che chiedi sia proprio necessario, io proverei con

Codice: Seleziona tutto
Dim nwArr                              'Tra le dichiarazioni iniziali
'
nwArr = Application.WorksheetFunction.Transpose(eArr)

Tuttavia credo che la max dimensione cosi' gestibile sia di 64mila righe (o 64mila colonne); se pensi che la tua eArr possa avere piu' di 64mila righe allora bisogna procedere con un loop

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Capovolgere una matrice

Postdi bafio60 » 04/12/18 14:37

Grazie per le risposte
la matrice in questione è composta al momento da circa 9000 righe per 5 colonne, le righe sono variabili.
Con l'istruzione
Codice: Seleziona tutto
eArr = Range(Range("D4"), Range("H4").End(xlDown)).Value

nel primo record mi trovo la riga più in alto mentre vorrei iniziare da quella più in basso, potrei ordinare tutti i record capovolgendoli prima di scriverli nella matrice e rimetterli nel loro ordine naturale subito dopo ma non mi sembra una soluzione molto elegante.

La soluzione di Antony47 traspone i dati creando la matrice di n x 5, mentre deve essere di 5 x n.
Grazie ancora
Bafio
bafio60
Utente Junior
 
Post: 11
Iscritto il: 09/08/16 18:57

Re: Capovolgere una matrice

Postdi klingklang » 04/12/18 14:41

bafio60 ha scritto:potrei ordinare tutti i record capovolgendoli prima di scriverli nella matrice e rimetterli nel loro ordine naturale subito dopo ma non mi sembra una soluzione molto elegante.

Ciao! A me invece, se è fattibile, sembra una soluzione ottima e certamente preferibile all'alternativa (un ciclo che legge a ritroso ogni riga a partire dall'ultima per popolare l'array).
Enrico
Windows 7 + Office 2016 64bit / Windows 10 + Office 365 32/64bit
Avatar utente
klingklang
Utente Junior
 
Post: 97
Iscritto il: 23/11/18 15:01
Località: San Giovanni in Persiceto

Re: Capovolgere una matrice

Postdi klingklang » 04/12/18 15:33

Comunque il tema mi ha incuriosito e l'ho approfondito un po'. Ti propongo qui un codice che inverte l'ordine delle righe di un array bidimensionale, come quello che hai tu: l'array di origine è "a", quello invertito è "b". Uso altri due array di appoggio (r e c) per ospitare gli indici di riga e colonna da dare come argomenti di Application.Index:

Codice: Seleziona tutto
Sub ReverseArray()
    Dim a, b
    Dim r, c
    Dim i As Long
   
    'Creo una matrice con gli indici di riga invertiti
    ReDim r(1 To UBound(a, 1))
    For i = 1 To UBound(r)
        r(i) = UBound(r) - i + 1
    Next i
   
    'Creo una matrice con gli indici di colonna
    ReDim c(1 To UBound(a, 2))
    For i = 1 To UBound(c)
        c(i) = i
    Next i
   
    b = Application.Index(a, Application.Transpose(r), c)
   
End Sub
Enrico
Windows 7 + Office 2016 64bit / Windows 10 + Office 365 32/64bit
Avatar utente
klingklang
Utente Junior
 
Post: 97
Iscritto il: 23/11/18 15:01
Località: San Giovanni in Persiceto

Re: Capovolgere una matrice

Postdi klingklang » 04/12/18 15:53

Che a questo punto (mi sono proprio appassionato!) può essere trasformata in una Function:

Codice: Seleziona tutto
Function ReverseArray(a As Variant, Optional byRows As Boolean = True) As Variant
    'byRows: True inverte le righe, False inverte le colonne
   
    Dim r, c
    Dim i As Long
   
    'Creo una matrice con gli indici di riga invertiti
    ReDim r(1 To UBound(a, 1))
    For i = 1 To UBound(r)
        If byRows = True Then
            r(i) = UBound(r) - i + 1
        Else
            r(i) = i
        End If
    Next i
   
    'Creo una matrice con gli indici di colonna
    ReDim c(1 To UBound(a, 2))
    For i = 1 To UBound(c)
        If byRows = True Then
            c(i) = i
        Else
            c(i) = UBound(c) - i + 1
        End If
    Next i
   
    ReverseArray = Application.Index(a, Application.Transpose(r), c)
   
End Function


Esempio di codice che inverte un intervallo di celle per righe:
Codice: Seleziona tutto
Sub invertirange()
    Dim rng As Variant
   
    With Worksheets("Foglio1")
        rng = .Cells(1, 1).CurrentRegion
       
        .Cells(1, 8).Resize(UBound(rng, 1), UBound(rng, 2)) = ReverseArray(rng, True)
    End With
   
End Sub


Per colonne:
Codice: Seleziona tutto
Sub invertirange()
    Dim rng As Variant
   
    With Worksheets("Foglio1")
        rng = .Cells(1, 1).CurrentRegion
       
        .Cells(1, 8).Resize(UBound(rng, 1), UBound(rng, 2)) = ReverseArray(rng, False)
    End With
   
End Sub


Per righe e per colonne:
Codice: Seleziona tutto
Sub invertirange()
    Dim rng As Variant
   
    With Worksheets("Foglio1")
        rng = .Cells(1, 1).CurrentRegion
       
        .Cells(1, 8).Resize(UBound(rng, 1), UBound(rng, 2)) = ReverseArray(ReverseArray(rng, False), True)
    End With
   
End Sub
Enrico
Windows 7 + Office 2016 64bit / Windows 10 + Office 365 32/64bit
Avatar utente
klingklang
Utente Junior
 
Post: 97
Iscritto il: 23/11/18 15:01
Località: San Giovanni in Persiceto

Re: Capovolgere una matrice

Postdi bafio60 » 05/12/18 00:13

ciao klingklang
grazie del tuo interessamento ma soprattutto delle tue soluzioni, domani le provo e ti faccio sapere

Bafio
bafio60
Utente Junior
 
Post: 11
Iscritto il: 09/08/16 18:57

Re: Capovolgere una matrice

Postdi Anthony47 » 05/12/18 11:33

Grazie Enrico per la bella proposta!
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Capovolgere una matrice":


Chi c’è in linea

Visitano il forum: Nessuno e 71 ospiti