La conversione di Più Righe in Singola Pila a Colonna in Excel

Ho questa enorme di dati di Quota di Mercato dei vari marchi che assomiglia a questo:

1111 2222 3333 4444
5555      7777 8888
9999 0001 0002
0004 0005 0006 0007

Cosa macro codice può essere utilizzato per ottenere l’output di:

1111
2222
3333
4444
5555
<emptyCell>
7777
8888
9999
0001
0002
<emptyCell>
0004
0005
0006
0007

Le celle Vuote devono essere considerate.

Inoltre, c’è una possibilità per ottenere l’output in un altro Foglio ?

qual è la differenza tra la produzione e i dati grezzi? Si dovrebbe essere più specifico su come i dati grezzi e come si desidera guardare dopo l’applicazione la macro.
si dovrebbe mostrare ciò che hai provato finora, in modo da non duplicare il lavoro già fatto. Idealmente, ti basta loop attraverso ogni riga, per poi passare a quello successivo. Come fai a sapere quando sei alla fine di una riga, invece?
Ci possono essere 2 cella vuota accanto all’altra?
Sono le righe che tutti hanno una larghezza fissa di 4?
stackoverflow.com/questions/14298522/…

OriginaleL’autore Ankur Chandel | 2013-01-22

4 Replies
  1. 6

    Cambiato INDEX per meno di un processore versione

    nella riga 1 di qualsiasi foglio che si desidera copiare i dati:

    =INDEX($A$1:$D$4,INT((ROW()-1)/4)+1,MOD(ROW()-1,4)+1)

    copia questo in giù, e una volta zeri cominciano a comparire, si sono alla fine. (Questo è l’unico problema – celle vuote diventi zero con questo. se si desidera conservare gli spazi vuoti troppo, allora avete bisogno di questo:

    =IF(ISBLANK(INDEX($A$1:$D$4,INT((ROW()-1)/4)+1,MOD(ROW()-1,4)+1)),””,INDEX($A$1:$D$4,INT((ROW()-1)/4)+1,MOD(ROW()-1,4)+1))

    )

    se non a partire dalla prima riga, quindi modificare il ROW() per ROW()-X dove X è il numero di righe più in basso, dall’alto (cioè 1 per riga 2, 2 per la riga 3, 799 per riga 800)

    Se ci sono un diverso numero di colonne, cambiare il 4 per il numero appropriato

    Stavo per rispondere allo stesso modo, ma annullato a causa di la tua risposta: +1! Unica modifica che vorrei fare: Utilizzare INDEX invece di OFFSET – consegnare lo stesso risultato, ma non è volatile e quindi molto più veloce dopo il primo calcolo correre!!!
    bel pensiero. Ho fissato la mia formula INDICE
    Non voglio dire che questa è una formula in forma di matrice, e deve essere inserito utilizzando la combinazione di tasti Ctrl+Maiusc+Invio metodo… mi sbaglio?
    questa non è una formula in forma di matrice. Esso utilizza un calcolo della riga corrente per scoprire dove ottenere i dati. INDEX vi permetterà di indicare la posizione in un array, molto simile a una matrice vba

    OriginaleL’autore SeanC

  2. 1

    Modificato da SeanC risposta (grazie buddy) per trasformarsi in un generalizzato utilizzo in modo che le persone con altri gamma di dimensioni e di partenza, le cellule possono utilizzare:

    Sostituire ‘$GAMMA$’ con riferimenti all’intervallo
    Sostituire ‘$CELLA$’ con riferimento alla prima cella della colonna di output:

    =INDEX( $RANGE$ ,INT((ROW()-ROW( $CELL$ ))/COLUMNS( $RANGE$ ))+1,MOD(ROW()-ROW( $CELL$ ),COLUMNS( $RANGE$ ))+1)

    Trascinarlo verso il basso. Naturalmente, assicurarsi che sia $GAMMA$ e $CELLA$ sono fissati con ‘$’ segni sulla riga e di colonna.

    (RIGA()-RIGA($CELLA$)) inizia a 0, mentre la RIGA() nella prima colonna inizia a 1, quindi dovrebbe essere (RIGA()-RIGA($CELLA$) + 1) Edit: ora ho notato che ha -1 che è stato rimosso, quindi il mio commento non è valido
    Molto bello! Ho sostituito $Gamma$ e $Cella$ con nomi di intervallo, ora hanno questo come un bel programma di utilità di formula senza personalizzazione necessario

    OriginaleL’autore Rob360

  3. 1
    Sub Makealist()
    
    Application.ScreenUpdating = False
    
    Dim rng As Range
    ' Destination of List
    Worksheets("SomeWorksheet1").Activate
    Worksheets("SomeWorksheet1").Range("SomeRange1").Select
    
    ' Range to Convert to list
    Set rng = Worksheets("SomeWorksheet2").Range("SomeRange2")
    
    ' Makes sure that all "Blank cells are really Blank"
    For Each c In rng.Cells
        If Len(c) = 0 Then
            c.Value = ""
        End If
    Next
    
    ' Creates the list
    For Each c In rng.Cells
        If IsEmpty(c.Value) = False Then
            Selection.Value = c.Value
            Selection.Offset(1, 0).Select
        End If
    Next
    
    Application.ScreenUpdating = True
    
    End Sub

    OriginaleL’autore Ethan Edens

  4. 0

    Supponendo che il tuo range A1:D4, qui è una macro VBA che può fare (basta mettere il valore in colonna E).

    Sub RangeToColumn()
    
    Dim varray As Variant
    Dim i As Long, j As Long, k As Long
    
    Application.ScreenUpdating = False
    k = 1
    
    varray = Range("A1:D4").value
    For i = 1 To UBound(varray, 1)
        For j = 1 To UBound(varray, 2)
            Cells(k, 5).value = varray(i, j)
            k = k + 1
        Next
    Next
    
    Application.ScreenUpdating = True
    
    End Sub

    Si potrebbe ottenere qualcosa in più e utilizzare il dizionario in oggetto e trasporre la matrice su una colonna, ma questo è più semplice, e il dizionario in oggetto non funziona su Mac. Si potrebbe anche usare “Range(“E” & k)” invece di “Cells(k, 5)” ma le Cellule() è leggermente più veloce in quanto non richiede la concatenazione.

    Si prega di notare che la disattivazione di aggiornamento dello schermo, questo verrà eseguito molto più velocemente.

    OriginaleL’autore aevanko

Lascia un commento