Transformer une matrice carrée en matrice colonne

sophie

XLDnaute Nouveau
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
 

pierrejean

XLDnaute Barbatruc
Re : Transformer une matrice carrée en matrice colonne

Bonjour sophie

Salut Philippe

Ma version (peut-etre un peu plus rapide sur un grand tableau)

Range("A1:E5") et Range("G1") a adapter
 

Pièces jointes

  • Sophie.xlsm
    21.1 KB · Affichages: 92
  • Sophie.xlsm
    21.1 KB · Affichages: 76
  • Sophie.xlsm
    21.1 KB · Affichages: 78

job75

XLDnaute Barbatruc
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:

klin89

XLDnaute Accro
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

  • Sophie.xls
    42.5 KB · Affichages: 44
  • Sophie.xls
    42.5 KB · Affichages: 43
  • Sophie.xls
    42.5 KB · Affichages: 56
Dernière édition:

job75

XLDnaute Barbatruc
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.
 

job75

XLDnaute Barbatruc
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+
 

Discussions similaires

Réponses
22
Affichages
874

Statistiques des forums

Discussions
312 492
Messages
2 088 893
Membres
103 982
dernier inscrit
krakencolas