Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2013 Reorganiser des donnes sur 3 colonnes en matrice

Aussie_Thomas

XLDnaute Nouveau
Bonjour,
Je dispose d'une feuille avec trois colonnes A, B et C, representant des coordonnees geographiques X,Y,Z qui representent une surface.
Je souhaite pouvoir reorganiser ces donnees sur une autre feuille pour avoir:
- X en colonne A
- Y en ligne 1
- Z qui sont recuperes automatiquement de ma feuille de base, en fonction de la ligne et la colonne ou l'on se trouve.

Je souhaite eviter de passer par une macro.

Ici la table que j'ai (j'ai plusieurs centaines de milliers de chiffres).


Ici comment je veux les trier:


Merci d'avance pour vos lumieres.
 

Pièces jointes

  • upload_2018-5-31_14-26-9.png
    6.8 KB · Affichages: 34
  • upload_2018-5-31_14-28-12.png
    2.5 KB · Affichages: 30

Paritec

XLDnaute Barbatruc
Bonjour Aussiethomas le forum
pas de fichier alors en voilà un qui est du même style, (mais moi je ne referai pas ton tableau c'est sûr)
a+
Papou
 

Pièces jointes

  • Aussithomas.xlsm
    28.2 KB · Affichages: 27

Paritec

XLDnaute Barbatruc
Re Aussiethomas le forum
Re Bonjour Aussiethomas tu penses que ta pièce jointe de 18,6 MO c'est bien sérieux?????
moi avec ma connexion internet dans 2 heures c'est pas fini et j'ai pas de temps à perdre
voilà par rapport à ta première demande
a+
papou
 

Pièces jointes

  • Aussithomas V1.xlsm
    28.5 KB · Affichages: 31

Paritec

XLDnaute Barbatruc
Bonjour Aussithomas le forum
Voilà tu mets cette macro dans ton fichier dans un module simple et tu lances la macro
et surtout tu t'armes de patience car 1084000 lignes à traiter !!!!!
je te joins cette macro car ton fichier ne possède pas une seule ligne vide et comme dans ma première macro je cherchais la première ligne vide en remontant cela n'allait pas, mais avec cette macro c'est OK, mais là patience, à mon avis tu es parti pour minimum 1 heure de traitement
a+
Papou
VB:
'Macro Faite par Pascal RICHARD Paritec le 30/05/2018
Option Explicit

Sub copie()
    Dim aa, i&, a&, bb, d As Object, n&, cc, dd, t$
    Set d = CreateObject("Scripting.Dictionary")
    t = Timer
    With Feuil1
        aa = .Range("A2:C" & Rows.Count)
    End With
    For i = 1 To UBound(aa)
        If aa(i, 1) <> "" And Not d.exists(aa(i, 1)) Then d.Add aa(i, 1), aa(i, 1)
    Next i
    bb = d.keys()
    d.RemoveAll
    For i = 1 To UBound(aa)
        If aa(i, 2) <> "" And Not d.exists(aa(i, 2)) Then d.Add aa(i, 2), aa(i, 2)
    Next i
    cc = d.keys()
    ReDim dd(1 To UBound(bb) + 2, 1 To UBound(cc) + 2)
    For i = 0 To UBound(bb)
        dd(i + 2, 1) = bb(i)
    Next i
    For i = 0 To UBound(cc)
        dd(1, i + 2) = cc(i)
    Next i
    For i = 2 To UBound(dd)
        For a = 2 To UBound(dd, 2)
            For n = 1 To UBound(aa)
                If dd(i, 1) = aa(n, 1) And dd(1, a) = aa(n, 2) Then
                dd(i, a) = aa(n, 3): Exit For
                End If
            Next n
        Next a
    Next i
    Feuil2.Cells.Clear
    Feuil2.Range("A6").Resize(UBound(dd), UBound(dd, 2)) = dd
    MsgBox "Traitement Terminé en " & Format(Timer - t, "0.00 secondes")
End Sub
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour Aussie_Thomas, Papou,
là patience, à mon avis tu es parti pour minimum 1 heure de traitement
Mais non, avec cette macro :
Code:
Sub Remplissage()
Dim dur, t, ub&, d As Object, i&, X, Y, j%, n&, v$
t = Feuil1.[A1].CurrentRegion
ub = UBound(t)
Set d = CreateObject("Scripting.Dictionary")
dur = Timer
For i = 2 To UBound(t)
    If (i - 2) Mod 1000 = 0 Then _
    Application.StatusBar = "Préparation " & Format(i / ub, "0.0%") & " - " & Format((Timer - dur) / 86400, "hh:mm:ss"): DoEvents
    d(t(i, 1) & " " & t(i, 2)) = t(i, 3)
Next
dur = Timer
X = Feuil2.[A7:A1004]: Y = Feuil2.[B6:CVV6]: ub = UBound(X) 'à adapter si nécessaire
ReDim t(1 To ub, 1 To UBound(Y, 2))
For j = 1 To UBound(Y, 2)
    For i = 1 To ub
        n = n + 1
        If (n - 1) Mod 1000 = 0 Then _
        Application.StatusBar = "Remplissage " & Format(n / ub / UBound(Y, 2), "0.0%") & " - " & Format((Timer - dur) / 86400, "hh:mm:ss"): DoEvents
        v = X(i, 1) & " " & Y(1, j)
        If d.exists(v) Then t(i, j) = d(v)
Next i, j
Feuil2.[B7].Resize(ub, UBound(Y, 2)) = t 'restitution
End Sub
- la phase de préparation (création du Dictionary) prend 2 minutes

- le remplissage du tableau des résultats prend un peu moins de 10 minutes chez moi.

L'affichage de l'avancement dans la barre d'état fait prendre patience.

A+
 
Dernière édition:

Paritec

XLDnaute Barbatruc
Bonjour Job le forum
bah moi a franchement parlé j'ai testé sur 10000 lignes pour contrôle du résultat.
Mais à mon sens cela aurait du être plus long que ce que tu dis, en tout état de cause long ou court la macro ne servira qu'une seule fois alors!!!
bonne journée
a+
Papou
 

job75

XLDnaute Barbatruc
Bonjour Aussie_Thomas, Papou, bcharef, le forum,

@ Papou, je ne vois pas pourquoi la macro ne servirait qu'une fois, elle sert après toute modification de la feuille source.

@ bcharef, le TCD est sûrement une bonne solution mais ce n'est pas vraiment le problème posé.

Enfin j'ai modifié la macro du post #6 en utilisant d.exists :
Code:
        v = X(i, 1) & " " & Y(1, j)
        If d.exists(v) Then t(i, j) = d(v)
Le remplissage du tableau t s'effectue plus rapidement car il y a beaucoup de cellules vides.

Bonne journée.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…