Transformer une matrice carrée en matrice colonne

  • Initiateur de la discussion Initiateur de la discussion sophie
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

S

sophie

Guest
Bonjour à tous,

Je suis face à un problème. Je souhaiterais pouvoir transformer une matrice carrée (format : 186*186) en une matrice colonne. Je joins ci-dessous un exemple du résultat auquel je souhaiterais aboutir. J'ai cherché sur les forums mais les solutions que j'ai pu trouver ne me donnent pas le résultat que je recherche, où sinon je ne les applique pas correctement.

Je vous remercie d'avance pour votre aide.

Forme actuelle de ma matrice :
__A B C D
A 0 0 4 6
B 0 0 1 0
C 0 0 0 0
D 1 0 0 1

Forme recherchée
A A 0
A B 0
A C 4
A D 6
B A 0
B B 0
B C 1
B D 0
C A 0
C B 0
ect
 
Re : Transformer une matrice carrée en matrice colonne

Bonsoir sophie, Philippe, [Edit] Pierre,

Voyez cette fonction VBA, à placer dans un Module standard :

Code:
Function VecteurColonne(t)
Dim Lb&, Ub&, h&, v(), i&, j&, n&
t = t 'si t est un Range
Lb = LBound(t, 2): Ub = UBound(t, 2)
h = (UBound(t) - LBound(t) + 1) * (Ub - Lb + 1)
ReDim v(1 To h, 1 To 1)
For i = LBound(t) To UBound(t)
  For j = Lb To Ub
    n = n + 1
    v(n, 1) = t(i, j)
  Next
Next
VecteurColonne = v
End Function
Pour l'utiliser sur une matrice 186 x 186, créez un tableau sur la plage A2:GD187, nommez une feuille "Restitution" et lancez cette macro :

Code:
Sub Test()
Dim t, vecteur
t = [A2:GD187] 'matrice 186 x 186, plage à adapter
vecteur = VecteurColonne(t)
With Sheets("Restitution")
  .Range("A2:A" & .Rows.Count) = "" 'RAZ
  .[A2].Resize(UBound(vecteur)) = vecteur
  .Activate
End With
End Sub
A+
 
Dernière édition:
Re : Transformer une matrice carrée en matrice colonne

Bonsoir le forum,

Ma contribution :
VB:
Option Explicit
Sub Transpose()
Dim a, b(), i As Long, j As Long, n As Long
    Application.ScreenUpdating = False
    With Range("A1").CurrentRegion
        a = .Value
        ReDim b(1 To (UBound(a, 1) - 1) * (UBound(a, 2) - 1), 1 To 3)
        For i = 2 To UBound(a, 1)
            For j = 2 To UBound(a, 2)
                n = n + 1
                b(n, 1) = a(i, 1)
                b(n, 2) = a(1, j)
                b(n, 3) = a(i, j)
            Next
        Next
        With .Offset(, .Columns.Count + 1).Resize(n, 3)
            .CurrentRegion.Clear
            .Value = b
            .BorderAround Weight:=xlThin
            .Borders(xlInsideVertical).Weight = xlThin
            .HorizontalAlignment = xlCenter
        End With
    End With
    Application.ScreenUpdating = True
End Sub
on peut remplacer :
VB:
ReDim b(1 To (UBound(a, 1) - 1) * (UBound(a, 2) - 1), 1 To 3)
par
VB:
x = .Offset(1, 1).Resize(.Rows.Count - 1, .Columns.Count - 1).Cells.Count
ReDim b(1 To x, 1 To 3)
klin89
 

Pièces jointes

Dernière édition:
Re : Transformer une matrice carrée en matrice colonne

Bonjour le fil, le forum,

Je n'avais pas compris qu'il fallait traiter aussi les titres des lignes et colonnes.

Heureusement ce n'est pas difficile à modifier :

Code:
Function MatriceColonne(t)
Dim Lb1&, Ub1&, Lb2&, Ub2&, mat(), i&, j&, n&
t = t 'si t est un Range
Lb1 = LBound(t): Ub1 = UBound(t)
Lb2 = LBound(t, 2): Ub2 = UBound(t, 2)
ReDim mat(1 To (Ub1 - Lb1) * (Ub2 - Lb2), 1 To 3)
For i = Lb1 + 1 To Ub1
  For j = Lb2 + 1 To Ub2
    n = n + 1
    mat(n, 1) = t(i, Lb2)
    mat(n, 2) = t(Lb1, j)
    mat(n, 3) = t(i, j)
  Next
Next
MatriceColonne = mat
End Function
Code:
Sub Test()
Dim t, matrice
t = [A1:GD186] 'matrice 186 x 186, plage à adapter
matrice = MatriceColonne(t)
With Sheets("Restitution")
  .[A:C] = Empty 'RAZ
  .[A1].Resize(UBound(matrice), 3) = matrice
  .Activate
End With
End Sub
Bonne journée.
 
Re : Transformer une matrice carrée en matrice colonne

Re,

Voici les durées d'exécution sur Win XP - Excel 2003 pour un tableau 255 x 255 (A1:IU255) rempli de 1 :

- pierrejean => 3,1 secondes

- klin89 et job75 => 1,1 seconde, le procédé étant le même.

Je ne teste pas la macro de Philippe car elle travaille sur des cellules...

A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
5
Affichages
839
Réponses
6
Affichages
305
  • Question Question
Microsoft 365 CSV en EXCEL
Réponses
1
Affichages
178
Réponses
15
Affichages
656
Retour