3 votes

Consolidation des données des colonnes aux lignes

J'ai une feuille de calcul :

Company 1 | ID1
Company 1 | ID2
Company 1 | ID3
Company 2 | ID4
Company 2 | ID5
Company 2 | ID6
Company 3 | ID7
Company 3 | ID8
Company 3 | ID9

J'ai besoin de combiner chaque entreprise en une seule ligne, avec tous leurs identifiants en colonnes à droite. Il peut y avoir un nombre différent d'identifiants par entreprise.

Le résultat final serait le suivant :

Company 1 | ID1 | ID2 | ID3
Company 2 | ID4 | ID5 | ID6
Company 3 | ID7 | ID8 | ID9

Comment pourrais-je y parvenir ? De préférence avec VBA.

2voto

robinCTS Points 4277

Cette solution à formule unique suppose que chaque entreprise a le même nombre de lignes :

Worksheet Screenshot

Entrez la formule suivante dans D2 et ctrl-enter/copy-paste/fill-down&right dans le reste du tableau :

=""&INDEX($A:$B,ROW($D$2)+3*INT(ROW()-ROW($D$2))+MAX(0,COLUMN()-COLUMN($D$2)-1),2-(COLUMN()=COLUMN($D$2)))

Notez que cette formule fonctionnera pour n'importe quel nombre (identique) de lignes pour chaque entreprise, et s'adaptera correctement si des lignes ou des colonnes sont ajoutées/supprimées.

Cependant, la formule sera rompue si le tableau dans lequel elle se trouve est copié/coupé et collé ailleurs. Le site $D$2 doivent être modifiées pour correspondre à la cellule de données supérieure gauche du nouvel emplacement du tableau, afin que celui-ci fonctionne à nouveau correctement.


S'il y a un nombre variable de lignes pour chaque entreprise, la formule unique requise est la suivante :

=IFERROR(IF(COLUMN()=COLUMN($D$2),""&INDEX($A:$A,MATCH(D1,$A:$A,0)+COUNTIF($A:$A,D1)),INDEX(INDEX($B:$B,MATCH($D2,$A:$A,0)):INDEX($B:$B,MATCH($D2,$A:$A,0)+COUNTIF($A:$A,$D2)-1),COLUMN()-COLUMN($D$2))),"")

Worksheet Screenshot

1voto

robinCTS Points 4277

Voici une alternative VBA :

'============================================================================================
' Module     : <any standard module>
' Version    : 0.1.0
' Part       : 1 of 1
' References : N/A
' Source     : https://superuser.com/a/1335738/763880
'============================================================================================
Option Explicit

Public Sub UnPivot()
       Dim ¡ As Long

  Const s_SourceColumns As String = "A:B"
  Const s_TargetColumn As String = "D"
  Const b_HasHeader As Boolean = True

  Dim lngSourceRows As Long
  lngSourceRows = ActiveSheet.Columns(s_SourceColumns).Cells(Rows.Count, 1).End(xlUp).Row + CLng(b_HasHeader)
  Dim varSource As Variant
  varSource = ActiveSheet.Columns(s_SourceColumns).Resize(RowSize:=lngSourceRows + 1).Offset(RowOffset:=-CLng(b_HasHeader)).Value2
  Dim idxNewCompany As Long: idxNewCompany = LBound(varSource, 1)
  Dim strNewCompany As String: strNewCompany = varSource(idxNewCompany, 1)
  Dim varUnPivotedData() As Variant
  ReDim varUnPivotedData(1 To lngSourceRows)
  varUnPivotedData(1) = strNewCompany
  Dim celNextTargetStart As Range
  Set celNextTargetStart = ActiveSheet.Columns(s_TargetColumn).Resize(RowSize:=1).Offset(RowOffset:=-CLng(b_HasHeader))
  Application.ScreenUpdating = False
  For ¡ = LBound(varSource, 1) To UBound(varSource, 1) - 1
    varUnPivotedData(¡ - idxNewCompany + 2) = varSource(¡, 2)
    If varSource(¡ + 1, 1) <> strNewCompany Then
      ReDim Preserve varUnPivotedData(1 To ¡ - idxNewCompany + 2)
      celNextTargetStart.Resize(ColumnSize:=UBound(varUnPivotedData)).Value2 = varUnPivotedData
      Set celNextTargetStart = celNextTargetStart.Offset(RowOffset:=1)
      idxNewCompany = ¡ + 1
      strNewCompany = varSource(idxNewCompany, 1)
      ReDim varUnPivotedData(1 To lngSourceRows)
      varUnPivotedData(1) = strNewCompany
    End If
  Next ¡
  Application.ScreenUpdating = True

End Sub

Il suffit de modifier les constantes en haut du code pour s'adapter à votre situation.

-1voto

Rajesh Sinha Points 8611

enter image description here

Comment cela fonctionne :

  • Sélectionnez A2:A11 et nommez la plage SOCIÉTÉ .
  • Sélectionnez B2:B11 et nommez la plage IDs .
  • Écrivez cette formule de tableau dans la cellule C2 pour générer une liste unique de sociétés :

    {=INDEX($A$2:$A$11, MATCH(0, COUNTIF($C$1:C1, $A$2:$A$11), 0))}

N.B. Terminez la formule écrite ci-dessus avec Ctrl+Shift+Enter et le remplir.

  • Écrivez cette formule de tableau dans la cellule D2, terminez par Ctrl+Shift+Enter y remplir à droite puis en bas.

    {=IFERROR(INDEX(IDs,SMALL(IF(Company=$C2,ROW(IDs)-MIN(ROW(IDs))+1),COLUMNS($C$2:C2))),"")}

Note,

  • Cette formule fonctionnera sans problème, dans le cas où il y a un nombre variable d'identifiants pour chaque entreprise.

  • Vous obtenez la liste des Ids en colonnes comme indiqué dans la capture d'écran.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X