web-dev-qa-db-fra.com

Excel: formules pour convertir des données entre colonne / ligne / matrice

Existe-t-il des formules pour convertir les données d'une colonne en matrice ou en ligne? Et pour convertir de/vers d'autres combinaisons?

Qu'en est-il d'un cas encore plus complexe: remodeler une matrice de largeur W en largeur N * W?

Il y a quelques questions similaires ou connexes. J'ai répondu à certains d'entre eux, marqués d'un *. Je continue de mettre à jour cette liste, à mesure que de nouvelles questions similaires (ou égales) sont ajoutées:

Formatage des données: colonnes en lignes *

Déplacer le contenu d'une colonne vers 3 colonnes *

comment diviser une colonne en deux colonnes en fonction des conditions dans Excel *

écriture d'une macro pour transposer 3 colonnes en 1 ligne

Excel VBA transpose avec des caractères

Transposition mathématique dans Excel

Comment transformer une table "matrice" en une ligne pour chaque entrée dans Excel

Convertir des colonnes avec plusieurs lignes de données en lignes avec plusieurs colonnes dans Excel.

Comment utiliser VBA pour remodeler les données dans Excel *

Tri de trois colonnes en six, triées horizontalement par nom de famille à l'aide d'Excel *

divisez les données dans une colonne en plusieurs colonnes dans Excel

Déplacer les données de plusieurs colonnes vers une seule ligne *

Certaines des réponses semblent "évolutives" vers quelque chose de plus englobant. Est-ce possible?

Les exemples de formats à convertir de/vers sont:

Colonne

1
2
3
4
5
6
7
...

Rangée

1   2   3   4   5   6   7   ...

Matrice (avec une étendue de 4 colonnes ici)

1   2   3   4
5   6   7   8
...
10
sancho.s

L'idée est de donner ici quelque chose qui peut probablement être utilisé avec des adaptations mineures aux questions énumérées ci-dessus, qui peuvent également servir de référence pour de futures questions connexes.

Les fonctions essentielles à utiliser sont INDEX ou OFFSET. Les avantages et les inconvénients de chacun seront donnés après des exemples explicites, en référence à la figure. Il montre plusieurs plages avec leurs noms définis (en italique dans ce qui suit). Tous les noms définis peuvent être remplacés par des références absolues directes aux cellules correspondantes.

enter image description here

1. Colonne à matrice

Le span (en C1) donne le nombre de colonnes. alors matrix_data_top_left (D1 ici) contient

=INDEX(col_data,(ROW()-ROW(matrix_data_top_left))*span+(COLUMN()-COLUMN(matrix_data_top_left)+1),1)

qui est ensuite copié dans le reste de matrice_données. Notez que la copie également dans D5 donne une erreur, car la formule résultante fait référence à une cellule à l'extérieur col_data (A1: A16). Le même résultat est obtenu en matrix_data2_top_left (I1) avec

=OFFSET(col_data_top,(ROW()-ROW(matrix_data2_top_left))*span+(COLUMN()-COLUMN(matrix_data2_top_left)),0)

et copier de la même manière dans matrix_data2. Notez que la copie également dans I5 renvoie 0, pas une erreur.

OFFSET a l'avantage de ne nécessiter qu'une seule cellule comme référence de base (col_data_top), afin d'étendre la plage de données source avec d'autres données n'a pas besoin de redéfinir la plage de données source dans la formule, il suffit de copier-coller dans une plage cible étendue. D'un autre côté, étendre la plage de données source à l'aide de INDEX nécessite d'abord de la mettre à jour dans la formule (en modifiant la plage si elle est utilisée explicitement), puis de copier-coller dans une plage cible étendue. L'utilisation d'un nom défini est plus polyvalente à cet effet, car la redéfinition col_data suffit ici (et cela peut être fait après avoir étendu la plage cible). En raison de cette même propriété, INDEX fournit une sorte de vérification automatique des limites sur la plage source, ce que OFFSET ne fait pas.

2. Matrice à colonne

col_data2_top contient

=INDEX(matrix_data2,INT((ROW()-ROW(col_data2_top))/span)+1,MOD(ROW()-ROW(col_data2_top),span)+1)

et col_data3_top

=OFFSET(matrix_data2_top_left,INT((ROW()-ROW(col_data3_top))/span),MOD(ROW()-ROW(col_data3_top),span))

Les deux formules sont copiées vers le bas. Les mêmes différences entre INDEX et OFFSET existent.

3. Matrice à ranger

Puisque OFFSET ne donne pas d'erreurs, les formules restantes l'utiliseront. L'adaptation de INDEX dans le sens indiqué ci-dessus est facile. row_data_left contient

=OFFSET(matrix_data_top_left,INT((COLUMN()-COLUMN(row_data_left))/span),MOD(COLUMN()-COLUMN(row_data_left),span))

puis copié à droite.

4. Colonne à ligne

row_data2_left contient

=OFFSET(col_data_top,COLUMN()-COLUMN(row_data2_left),0)

à nouveau copié vers la droite.

PS: La formule =TRANSPOSE(... fonctionne dans ce cas, et il doit être entré sous forme de formule de tableau (avec ctrl+shift+enter). Nevertheles, il pourrait être souhaitable d'éviter les formules matricielles .

5/6. Ligne vers colonne/matrice

Il est très facile à obtenir dans ce sens. Par exemple., col_data_top contient

=OFFSET(row_data_left,0,ROW()-ROW(col_data_top))

et copiez.

7. Transposition matricielle

Pour entrer matrix_data3 (non représenté sur la fig.) la transposition de matrix_data2, il suffit d'utiliser matrix_data3_top_left, avec la formule

=OFFSET(matrix_data2_top_left,COLUMN()-COLUMN(matrix_data3_top_left),ROW()-ROW(matrix_data3_top_left))

et copié dans une plage cible appropriée.

8. Remodelage de la matrice

Nous voulons remodeler une matrice en une matrice plus large: matrix_data4, avec N4 lignes et M4 colonnes (largeur4), en matrix_data5, avec N5= N4/R lignes et M5= M4xR colonnes (largeur5), avec [~ # ~] r [~ # ~] (rep5) le nombre de répétitions (matrices non représentées sur la fig.) Ensuite, utilisez

=OFFSET(matrix_data4_top_left,(ROW()-ROW(matrix_data5_top_left))*rep5+INT((COLUMN()-COLUMN(matrix_data5_top_left))/width4),MOD((COLUMN()-COLUMN(matrix_data5_top_left)),width4))

Maintenant, nous voulons remodeler une matrice en une matrice plus étroite: matrix_data4, avec N4 lignes et M4 colonnes (largeur4), en matrix_data6, avec N6= N4xS lignes et M6= M4/S colonnes (largeur6), avec [~ # ~] s [~ # ~] (split6) le nombre de divisions (matrices non représentées sur la fig.) Ensuite, utilisez

=OFFSET(matrix_data4_top_left,INT((ROW()-ROW(matrix_data6_top_left))/split6),MOD((ROW()-ROW(matrix_data6_top_left)),split6)*width4+(COLUMN()-COLUMN(matrix_data6_top_left)))
20
sancho.s