web-dev-qa-db-fra.com

Excel - Combinez plusieurs colonnes en une seule colonne

J'ai plusieurs listes qui sont dans des colonnes distinctes dans Excel. Ce que je dois faire, c'est combiner ces colonnes de données en une grande colonne. Je me fiche qu'il y ait des entrées en double, mais je veux qu'il saute la ligne 1 de chaque colonne.

Et si ROW1 a des en-têtes de janvier à décembre et que la longueur des colonnes est différente et doit être combinée en une seule grande colonne?

ROW1| 1   2   3    
ROW2| A   D   G    
ROW3| B   E   H    
ROW4| C   F   I

devrait se combiner en

A    
B    
C    
D    
E    
F    
G    
H    
I

La première ligne de chaque colonne doit être ignorée.

10
Akib

Essaye ça. Cliquez n'importe où dans votre plage de données, puis utilisez cette macro:

Sub CombineColumns()
Dim rng As Range
Dim iCol As Integer
Dim lastCell As Integer

Set rng = ActiveCell.CurrentRegion
lastCell = rng.Columns(1).Rows.Count + 1

For iCol = 2 To rng.Columns.Count
    Range(Cells(1, iCol), Cells(rng.Columns(iCol).Rows.Count, iCol)).Cut
    ActiveSheet.Paste Destination:=Cells(lastCell, 1)
    lastCell = lastCell + rng.Columns(iCol).Rows.Count
Next iCol
End Sub
17
Alex P

Vous pouvez combiner les colonnes sans utiliser de macros. Tapez la fonction suivante dans la barre de formule:

= IF (ROW () <= COUNTA (A: A), INDEX (A: A, ROW ()), IF (ROW () <= COUNTA (A: B), INDEX (B: B, ROW () - COUNTA (A: A)), IF (ROW ()> COUNTA (A: C), "", INDEX (C: C, ROW () - COUNTA (A: B)))))) =

L'instruction utilise 3 fonctions IF, car elle doit combiner 3 colonnes:

  • Pour la colonne A , la fonction compare le numéro de ligne d'une cellule avec le nombre total de cellules de la colonne A qui ne sont pas vides. Si le résultat est vrai, la fonction renvoie la valeur de la cellule de la colonne A qui se trouve à la ligne (). Si le résultat est faux, la fonction passe à l'instruction IF suivante.
  • Pour la colonne B , la fonction compare le numéro de ligne d'une cellule avec le nombre total de cellules dans la plage A: B qui ne sont pas vides. Si le résultat est vrai, la fonction renvoie la valeur de la première cellule qui n'est pas vide dans la colonne B. Si elle est fausse, la fonction passe à l'instruction IF suivante.
  • Pour la colonne C , la fonction compare le numéro de ligne d'une cellule avec le nombre total de cellules dans la plage A: C qui ne sont pas vides. Si le résultat est vrai, la fonction renvoie une cellule vide et ne fait plus de calcul. Si faux, la fonction renvoie la valeur de la première cellule qui n'est pas vide dans la colonne C.
9
CristinaP

J'ai créé un exemple de feuille de calcul ici pour savoir comment le faire avec des formules Excel simples et sans utiliser de macros (vous devrez faire vos propres ajustements pour vous débarrasser de la première ligne, mais cela devrait être facile une fois que vous aurez compris comment mon exemple tableur):

https://docs.google.com/a/umich.edu/spreadsheet/ccc?key=0AuSyDFZlcRtHdGJOSnFwREotRzFfM28tWElpZ1FaR2c#gid=

2
Kenny LJ

Je ne sais pas si cela aide complètement, mais j'ai eu un problème où j'avais besoin d'une fusion "intelligente". J'avais deux colonnes, A et B. Je voulais déplacer B uniquement si A était vide. Voir ci-dessous. Il est basé sur une plage de sélection, que vous pourriez utiliser pour décaler la première ligne, peut-être.

Private Sub MergeProjectNameColumns()
    Dim rngRowCount As Integer
    Dim i As Integer

    'Loop through column C and simply copy the text over to B if it is not blank
    rngRowCount = Range(dataRange).Rows.Count
    ActiveCell.Offset(0, 0).Select
    ActiveCell.Offset(0, 2).Select
    For i = 1 To rngRowCount
        If (Len(RTrim(ActiveCell.Value)) > 0) Then
            Dim currentValue As String
            currentValue = ActiveCell.Value
            ActiveCell.Offset(0, -1) = currentValue
        End If
        ActiveCell.Offset(1, 0).Select
    Next i

    'Now delete the unused column
    Columns("C").Select

    selection.Delete Shift:=xlToLeft
End Sub
1
Function Concat(myRange As Range, Optional myDelimiter As String) As String 
  Dim r As Range 
  Application.Volatile 
  For Each r In myRange 
    If Len(r.Text) Then 
      Concat = Concat & IIf(Concat <> "", myDelimiter, "") & r.Text 
    End If 
  Next 
End Function
1
Mark Baker