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
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
...
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.
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)))