Condividi:        

trasporre righe in una sola colonna

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

trasporre righe in una sola colonna

Postdi miko » 17/07/13 19:22

salve,
come da titolo, sto cercando di trasferire i valori contenuti in alcune righe in una sola colonna,
nel mio caso la colonna A e poi da questa riportare in colonna C i valori unici;
il range oggetto della trasposizione è del tipo come in figura:
(ho nascosto alcune righe per il ridimensionamento dell'immagine,
ma la riga iniziale è la riga 8, mentre non è nota la riga finale)

Immagine

il codice che ho usato è strutturato come segue:
Codice: Seleziona tutto
Option Base 1
Sub TRASPONI()
Dim ws1 As Worksheet, ws3 As Worksheet
Dim UC As Long, UR As Long
Dim c As Range
Dim MyArray As Variant

Set ws1 = Sheets("Foglio1")
Set ws3 = Sheets("Foglio3")
With ws3
.Cells.ClearContents
End With
With ws1
  For Each c In .Range("C8", .Range("C" & Rows.Count).End(xlUp))
    UC = .Cells(c.Row, Columns.Count).End(xlToLeft).Column
    MyArray = .Range(.Cells(c.Row, 3), .Cells(c.Row, UC))
    UR = ws3.Cells(Rows.Count, 1).End(xlUp).Row
    ws3.Range("A" & UR + 1 & ":A" & UR + 5).Value = Application.Transpose(MyArray)
    Erase MyArray
  Next c
End With
  With ws3
    .Range("A2:A" & .Cells(Rows.Count, 1).End(xlUp).Row).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range("C2"), Unique:=True
  End With
ws3.Select
End Sub

la macro funziona se considero un range senza discontinuità del tipo C8-G15;
ma se aggiungo le colonne H e J, identiche a quelle in giallo, modificando opportunamente
le istruzioni del codice interessate al cambiamento, ottengo un risultato errato in quanto in colonna A
sono riportati tutti i valori del range uno di seguito all'altro, mentre in colonna C, che contiene i valori unici
ottengo il risultato riportato in figura:

Immagine

nella quale si nota la presenza del numero 5, colore rosso, già presente ad inizio colonna,
che non viene considerato valore unico
e della successiva cella vuota,colore giallo.
comprendo la presenza della cella vuota dovuta alla presenza della colonna vuota nel range di partenza,
e non so come eliminare questo risultato inopportuno, ma non comprendo la presenza del numero 5, considerato 2 volte;
tra l'altro è pure il solo numero doppione che viene inserito in colonna C nonostante ci siano altri doppioni,
colonne H e J.
come devo modificare il codice per ottenere la trasposizione delle righe e con valori unici in colonna?
ciao e grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Sponsor
 

Re: trasporre righe in una sola colonna

Postdi Anthony47 » 18/07/13 03:09

L' uso dei Filtro, normale o avanzato, presuppone che la prima riga dell' intervallo contenga l' intestazione di colonna; quindi in col C il primo "5" e' l' intestazione, il secondo e' il valore unico 5 considerato come dato.
Potresti rimediare inserendo una etichetta in A1 di Foglio3 e poi calcolare i valori unici con
.Range("A1:A" & .Cells(Rows.Count, 1).End(xlUp).Row).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range("C1"), Unique:=True
Per quanto riguarda la cella vuota, probabilmente non e' "vuota" ma magari contiene uno spazio o una formula che restituisce un valore nullo.
Con questa macro crei in col C del foglio di Output i valori unici presenti nella tua tabella, solo se sono numerici
Codice: Seleziona tutto
Sub MikUniq()
Dim myVArr, InSh As String, OutSh As String, IRan As String, LastC As Long, LastH As Long
'
InSh = "Foglio3"    '<< Il foglio con la tabella iniziale
IRan = "C8"         '<< L' inizio (alto-Sx) della tabella
OutSh = "Foglio4"   '<< Il foglio dove in col C sara' creata la lista di Unici
'
LastH = Sheets(InSh).Cells(Sheets(InSh).Range(IRan).Row, Columns.Count).End(xlToLeft).Column
LastC = Cells(Rows.Count, "C").End(xlUp).Row
myVArr = Sheets(InSh).Range(IRan).Resize(LastC - 7, LastH - 2).Value
Sheets(OutSh).Range("C:C").ClearContents
For Each pippo In myVArr
    If Application.WorksheetFunction.CountIf(Sheets(OutSh).Range("C:C"), pippo) = 0 Then
        If IsNumeric(pippo) Then Sheets(OutSh).Cells(Rows.Count, "C").End(xlUp).Offset(1, 0) = pippo
    End If
Next pippo
End Sub

Personalizza le righe marcate << e mandala in esecuzione.
Se ti serve anche l' elenco lineare in col A bisognera' aggiungere un paio di righe.

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

Re: trasporre righe in una sola colonna

Postdi miko » 19/07/13 18:51

buona sera,
hai individuato uno dei 2 problemi:
L' uso dei Filtro, normale o avanzato, presuppone ...

infatti inserendo l'intestazione in cella A1 e l'istruzione in grassetto nella mia macro viene eliminato il doppione;
rimane il problema della cella vuota che ai miei controlli appare vuota,
non ci sono formule od altro, sia nel range di partenza che in quello di destinazione;
ho provato ad usare la stessa macro in una nuova cartella e compare sempre la cella vuota.
allora userò il tuo codice, che tra l'altro è più compatto ed evita l'uso del filtro.
a tale proposito ti chiedo 2 leggere modifiche che non sono riuscito ad elaborare;
la tua macro attuale inserisce in colonna C, valori unici, considerando i valori del range di partenza
colonna dopo colonna;
mi servirebbe invece che si considerassero riga dopo riga;
ai fini dei valori unici ciò non è poi importante, ma dovendo usare la stessa macro per trasporre un altro range
mi necessità che i valori sia prelevati per righe successive.
la seconda modifica, che hai già anticipato,
Se ti serve anche l' elenco lineare in col A bisognera' aggiungere un paio di righe

anche in questo caso, per il motivo precedente, considerando i valori riga dopo riga.
saluti e grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: trasporre righe in una sola colonna

Postdi Anthony47 » 20/07/13 16:06

In questo caso la macro diventa:
Codice: Seleziona tutto
Sub MikUniq2()
Dim myVArr, InSh As String, OutSh As String, IRan As String, LastC As Long, LastH As Long
'
InSh = "Foglio3"    '<< Il foglio con la tabella iniziale
IRan = "C8"         '<< L' inizio (alto-Sx) della tabella
OutSh = "Foglio4"   '<< Il foglio dove in col C sara' creata la lista di Unici
'
LastH = Sheets(InSh).Cells(Sheets(InSh).Range(IRan).Row, Columns.Count).End(xlToLeft).Column
LastC = Cells(Rows.Count, "C").End(xlUp).Row
myVArr = Sheets(InSh).Range(IRan).Resize(LastC - 7, LastH - 2).Value
Sheets(OutSh).Range("C:C, A:A").ClearContents
For I = LBound(myVArr, 1) To UBound(myVArr, 1)
    For J = LBound(myVArr, 2) To UBound(myVArr, 2)
    pippo = myVArr(I, J)
    Sheets(OutSh).Cells(Rows.Count, "A").End(xlUp).Offset(1, 0) = pippo
        If Application.WorksheetFunction.CountIf(Sheets(OutSh).Range("C:C"), pippo) = 0 Then
            If IsNumeric(pippo) Then Sheets(OutSh).Cells(Rows.Count, "C").End(xlUp).Offset(1, 0) = pippo
        End If
    Next J
Next I
End Sub
Le istruzioni sono invariate.

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

Re: trasporre righe in una sola colonna

Postdi miko » 12/08/13 18:44

buona sera a tutti,
questa volta credo che il mio ritardo sia giustificato,
ho dovuto formattare il pc per 2 volte consecutive, la prima per un virus che non mi
permetteva la connessione ed altre funzioni, la seconda per un file, un add-in, che non apriva excel e/o il vba e dava continumante errore.
per quanto riguarda l'argomento del topic avevo testato il tuo ultimo codice,
ma non ho avuto la possibilità di informarvi che funziona molto bene ed è anche veloce.
vi è solo un particolare, se nelle colonne A e C di foglio 2 che contiene il risultato vi sono celle piene
la macro funziona qualunque sia il foglio, 1 oppure 2, selezionato;
se viene selezionato il foglio 1 ed il foglio 2 è vuoto e si avvia la macro tutto funziona;
se invece si seleziona il foglio 2 e questo è vuoto si ha errore alla linea:
Codice: Seleziona tutto
.....
myVArr = Sheets(InSh).Range(IRan).Resize(LastC - 7, LastH - 2).Value
.....

a parte questo inconveniente tutto funziona.
grazie e scusa del ritardo.
ciao
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44


Torna a Applicazioni Office Windows


Topic correlati a "trasporre righe in una sola colonna":


Chi c’è in linea

Visitano il forum: Nessuno e 43 ospiti