Creare matrice da altra matrice
Hai un problema con Excel? 
Creare matrice da altra matrice
di sirelancillotto (utente non iscritto) data: 29/12/2012 12:35:23
Buongiorno,
con un esempio spiegherò di cosa ho bisogno.
Sul foglio1 ho una matrice, ad esempio 5x5. Sulla colonna 4 di tale matrice ho celle contenenti un valore numerico intero positivo.
Vorrei che sul foglio2 venga creata automaticamente una matrice Nx5 le cui righe siano quelle corrispondenti al valore non nullo della colonna 4.
Data la seguente matrice:
(foglio 1)
qwe | asd | zxc | 0 | qwe
asd | dfg | ewr | 1 | fgh
qwe | asd | zxc | 4 | qwe
qwe | asd | zxc | 0 | qwe
asd | dfg | tyu | 2 | fgh
Voglio il risultato:
(foglio 2)
asd | dfg | ewr | 1 | fgh
qwe | asd | zxc | 4 | qwe
asd | dfg | tyu | 2 | fgh
Fattibile?
di Vecchio Frac data: 29/12/2012 14:02:33
Fattibile, sicuro.
Con un poco di codice VBA, e volendo anche senza (bisogna pensarci su un attimo però).
Come sei messo a infarinatura di VBA? e di che versione Excel stiamo parlando?
Hai fatto qualche tentativo? hai provato a metter giù un algoritmo in parole tue per la soluzione?
Spesso basta scrivere cosa vogliamo ottenere (i passaggi del ragionamento) per semplificarci le cose... tradurre il pseudo linguaggio in codice eseguibile è un passo tutto sommato di minor difficoltà.
di sirelancillotto (utente non iscritto) data: 29/12/2012 14:52:50
Ciao. ho risolto trovando il vettore indici relativi alle caselle interessate (vedere file allegato) senza scomodare VB
Esiste un modo più snello?
di Vecchio Frac data: 29/12/2012 15:10:09
Molto bene.
La mia soluzione, pure senza codice, prevedeva questa istruzione:
=SE($D2>0;INDICE($A2:$E2;1;RIF.COLONNA()-7);"")
posizionata in H, a cui veniva tolto 7 per raggiungere la colonna A, ripetuta per le successive colonne fino ad ottenere la sequenza corretta di tutit i campi.
La tua soluzione è naturalmente più corretta e flessibile.
Ora devo chiudere, ma con poche righe di codice si può ottenere un risultato altrettanto valido.
di sirelancillotto (utente non iscritto) data: 29/12/2012 15:11:50
Mi spiego meglio per "snellire".
la matrice che devo lavorare è in realtà 200x5 quindi la funzione =CONCATENA non si addice perfettamente visto che questa funzione può comprendere un numero minore (di 200) di celle, e quindi dovrei utilizzare più =CONCATENA in "serie".
Esiste una funzione che mi permette di concatenare un'intera colonna?
di sirelancillotto (utente non iscritto) data: 29/12/2012 15:19:07
Altro problema!
Il metodo non funziona per un numero di righe maggiore di 11, infatti alla se sul =CONCATENA ottengo il valore 12 non se sia 1 e 2 oppure 12.
uff
di Vecchio Frac data: 29/12/2012 21:28:28
Ecco qui un breve codice per fare quello che chiedi:
se la tabella è in A1 del foglio1, ricopierà le sole righe con valore > 0 nel foglio2 a partire da A1.
Option Explicit
Sub estrai()
Dim cella As Range, i As Integer
i = [COUNT(foglio2!A:A)]
For Each cella In Foglio1.[A1].CurrentRegion.Rows
If cella.Cells(1).Offset(, 3) > 0 Then
i = i + 1
cella.EntireRow.Copy Foglio2.Cells(i, 1).EntireRow
End If
Next
End Sub |
di sirelancillotto (utente non iscritto) data: 30/12/2012 17:03:15
Grazie, per il codice, sembra l'unica possibilità!
di Vecchio Frac data: 30/12/2012 18:23:37
Se non è l'unica, è perlomeno la più rapida che mi è venuta in mente :)
di sirelancillotto (utente non iscritto) data: 02/01/2013 12:46:12
Torno a farti una domanda...
e se volessi copiare le celle dalla A15 in poi? Come dovrei modificare il codice?
di sirelancillotto (utente non iscritto) data: 02/01/2013 12:50:06
Mi correggo, la domanda è questa:
Se volessi copiare a partire dalla riga relativa alla cella A15 del Foglio1 e incollare sul Foglio2 a partire dalla cella A20 ?
di Vecchio Frac data: 02/01/2013 13:39:18
Ecco qui, con qualche lieve ma importante modifica.
Consideriamo le celle dalla riga A15 in poi e copiamo nel foglio2 a partire dalla i-esima riga + 19, considerando che se nel foglio2 esistono già dei dati, lanciando la macro si accodano a quelli preesistenti (i tiene il conto di quante righe già compilate ci sono nel foglio2).
Option Explicit
Sub estrai()
Dim cella As Range, i As Integer, j As Integer
j = [COUNTA(foglio1!A:A)]
i = [COUNTA(foglio2!A:A)]
For Each cella In Range("A15:A" & j).Rows
If cella.Cells(4) > 0 Then
i = i + 1
cella.EntireRow.Copy Foglio2.Cells(19 + i, 1).EntireRow
End If
Next
End Sub |
di sirelancillotto (utente non iscritto) data: 02/01/2013 13:55:13
Ciao e grazie di nuovo per la risposta.
Inserendo il codice ho errore runtime 1004
Qui: For Each cella In Range("A15:A" & j).Rows
Non ho capito cosa significa "(i tiene il conto di quante righe già compilate ci sono nel foglio2)".
Prima di andare avanti volevo chiarire che la "matrice" di dati (ad esempio 60x5) nel foglio1 con il primo dato nella cella A15 deve essere copiata nel foglio2 a partire dalla cella A20. "Sopra" non ci sono altri dati, semmai altre scritte.
di Vecchio Frac data: 02/01/2013 16:10:18
Ho tolto la spunta da "risolta" così possiamo continuare :)
Ho anche modificato il codice perchè se ci sono scritte prima di A15 queste non devono entrare nel conteggio.
Non dovresti più ricevere il messaggio di errore.
Option Explicit
Sub estrai()
Dim cella As Range, i As Integer, j As Integer
j = Foglio1.Cells(Foglio1.Columns(1).Cells.Count, 1).End(xlUp).Row
i = Foglio2.Cells(Foglio2.Columns(1).Cells.Count, 1).End(xlUp).Row
If i < 19 Then i = 19
For Each cella In Range("A15:A" & j).Rows
If cella.Cells(, 4) > 0 Then
cella.EntireRow.Copy Foglio2.Cells(i, 1).EntireRow
i = i + 1
End If
Next
End Sub |
di sirelancillotto (utente non iscritto) data: 20/01/2013 23:40:26
Ciao e grazie per la risposta.
Adesso mi sembra che funzioni correttamente. Farò un po' di test e se riscontro qualche problema ti farò sapere.
Vorrei aggiungere un'altra cosa e cioè sul Foglio2 sotto l'ultima riga "incollata" dal Foglio1 vorrei riportare la dicitura "Totale" e il totale espresso in numeri (valore già calcolato in un'altra cella).
Vuoi Approfondire?