Récupération de données

  • Initiateur de la discussion Initiateur de la discussion FAB80170
  • 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 !

F

FAB80170

Guest
Bonsoir,

J'"aimerais"... pouvoir récupérer certaines données stockées en colonnes (GEN_PNEU),
vers des données stockées en lignes, avec des valeurs uniques (COM_DIM).
Mon problème est de pouvoir récupérer toutes les données (GEN_PNEU) en fonction de COD_FPNEU / COM_DIM / NM1_MAR. J'ai mis des polices de couleurs différentes pour "essayer" d'être le plus clair possible; ce qui n'est pas gagné !

Par avance merci, pour toutes aides ou explicatifs.
 
Encore MERCIIIIIIIIIIII !!!

C'est tout simplement génial !!!!


> De mon coté, je dois surveiller de ne sélectionner que des lignes ayant le même "COD_FPNEU" (exemple TOU.E) en colonne A,
car si ce dernier est différent (exemple TOU.H), la macro remonte des EAN n'appartenant pas à "COD_FPNEU" "COM_DIM" "NM1_MAR".
> Je me suis rendu compte aussi que parfois, j'avais 4 "GEN_PNEU" pour la même dimension et la même marque; j'aurais du prévoir ce cas de figure au préalable.

Allez encore merci et bonne soirée à vous.
 
Encore MERCIIIIIIIIIIII !!!

> De mon coté, je dois surveiller de ne sélectionner que des lignes ayant le même "COD_FPNEU" (exemple TOU.E) en colonne A,
car si ce dernier est différent (exemple TOU.H), la macro remonte des EAN n'appartenant pas à "COD_FPNEU" "COM_DIM" "NM1_MAR".
Lorsque la cellule de la colonne 6 (F)et la ligne correspondante sont vides , à la première saisie de GEN_PNEU celle_ci est occupée :
ligne de code : If Cells(k, 6) = "" Then Cells(k, 6) = Cells(i, 1)
Ainsi il faudrait mettre d'autres colonnes pour pouvoir mettre sur la même ligne d'autres COD_FPNEU

Peux-tu me donner un exemple afin de faire un test pas à pas de la macro
> Je me suis rendu compte aussi que parfois, j'avais 4 "GEN_PNEU" pour la même dimension et la même marque; j'aurais du prévoir ce cas de figure au préalable.

En effet, la macro doit être modifié pour cette situation !
Peux-tu m'envoyer un fichier avec un maxi de GEN_PNEU qu'il y aura afin de parer à cet inconvénient !
bonne soirée !
 
Dernière édition:
Bonjour JBARDE,

La macro avec les 6 GEN_PNEU fonctionne à merveille, voir Feuil2 du classeur avec un COD_FPNEU unique. Mon cas est traité. Parfait.

Concernant les données présentent dans la colonne A (COD_FPNEU), j'ai créé la Feuil2 (2), où se trouvent l'ensemble des données avec des données COD_FPNEU multiples; pour la dimension 155/60R15 74T, cellule G14, la macro renvoi le code EAN 8808563405315 pour la marque HANKOOK, alors que celle ci n'existe pas pour la donnée "TOU.E" de la colonne A (COD_FPNEU). Le code EAN renvoyé provient de la cellule
D2094 la donnée "TOU.H" de la colonne A (COD_FPNEU).
J'espère avoir été clair dans mon explication ...
Par avance merci et Bon courage.
 
Re,
Comme je l'ai dit dans mon poste #18 :
Lorsque la cellule de la colonne 6 (F)et la ligne correspondante sont vides , à la première saisie de GEN_PNEU celle_ci est occupée :
ligne de code : If Cells(k, 6) = "" Then Cells(k, 6) = Cells(i, 1)
Ainsi il faudrait mettre d'autres colonnes pour pouvoir mettre sur la même ligne d'autres COD_FPNEU

Je vais devoir mettre des colonnes supplémentaires pour mettre UTI.E - 4X4.E - TO.TS etc..... et de ce fait décaler dans ma macro les colonnes actuelles !

Bonne journée !
 
Re,
Voilà, nécessaire fait (voir feuille Feuil2 (2))!
de la colonne F à la colonne R les données de COD_FPNEU sont inscrire avec en priorité celles qui apparaissent en premier ( je ne peux faire autrement )
Ainsi à la ligne 14 TOU.E apparait en 1er pour les lignes 35 - 36 - 37
et TOU.H pour la ligne 2094

De plus, dans la macro j'ai changé le nombre de ligne (1048576 lignes) adapté pour Excel 2007 et plus !
Sinon, il faudra mettre 65536 à la place de 1048576

Il est évident que plus il y aura de données plus le calcul sera long !
bonne journée
 

Pièces jointes

Dernière édition:
Re,
Devant la difficulté de différencier les COD_FPNEU avec les COM_DIM et NM1_MAR, j'ai fait en sorte de la colonne F à R de repérer les COD_PNEU avec le N° de ligne correspondant à la colonne A !
Ainsi par exemple de F6 à H6 :
TOU.E - TOU.E Lg14 - TOU.E Lg 16 correspondent à : (Lg=Ligne)
TOU.E Lg14 >>>TOU.E 145/60R13 66T HANKOOK 8808563313139(ligne 14) &
TOU.E>>>TOU.E 145/60R13 66T HANKOOK 8808563382333 (ligne 15)

TOU.E Lg12 >>>TOU.E 135/80R13 70T MAXXIS 4717784201061

j'espére que cela conviendra !
bonne soirée !
 

Pièces jointes

Bonsoir JBARBE, FAB80170, le forum 🙂

A tester :
VB:
Option Explicit
Sub test()
Dim a, w(), x(), i As Long, n As Long, t As Long, y
Dim dico As Object, pos As Byte, couleurs()
    couleurs = VBA.Array(36, 40, 22)
    Set dico = CreateObject("Scripting.Dictionary")
    dico.CompareMode = 1
    a = Sheets("feuil1").Range("a1").CurrentRegion.Value
    n = 1
    With CreateObject("Scripting.Dictionary")
        .CompareMode = 1
        For i = 2 To UBound(a, 1)
            If Not .exists(a(i, 2)) Then
                n = n + 1
                .Item(a(i, 2)) = n
            End If
            If Not dico.exists(a(i, 3)) Then
                ReDim w(1 To 3)
                ReDim x(1 To UBound(a, 1), 1 To 5)
                Set w(1) = CreateObject("Scripting.Dictionary")
                w(1).CompareMode = 1
                w(3) = 0
            Else
                w = dico(a(i, 3))
                x = w(2)
            End If
            w(1)(a(i, 2)) = w(1)(a(i, 2)) + 1
            x(.Item(a(i, 2)), w(1)(a(i, 2))) = a(i, 4)
            pos = w(1)(a(i, 2))
            If pos > w(3) Then
                x(1, w(1)(a(i, 2))) = "GEN_PNEU " & pos
            End If
            w(2) = x
            w(3) = Application.Max(w(3), pos)
            dico(a(i, 3)) = w
        Next
        y = .keys
    End With
    'restitution
    Application.ScreenUpdating = False
    With Sheets("Feuil2").Cells(1)
        .CurrentRegion.Clear
        With .Offset(1)
            .Value = "COM_DIM"
            .Interior.ColorIndex = 43
        End With
        With .Offset(2).Resize(UBound(y) + 1)
            .Value = Application.Transpose(y)
        End With
        t = 1: n = 0
        For i = 0 To dico.Count - 1
            With .Offset(, t)
                .Value = dico.keys()(i)
                With .Resize(, dico.items()(i)(3))
                    .HorizontalAlignment = xlCenterAcrossSelection
                    .BorderAround Weight:=xlThin
                    .Interior.ColorIndex = couleurs(n)
                    n = n + 1
                    If n > UBound(couleurs) Then n = 0
                End With
            End With
            With .Offset(1, t)
                With .Resize(UBound(y) + 2, dico.items()(i)(3))
                    .NumberFormat = "@"
                    .Value = dico.items()(i)(2)
                End With
            End With
            t = t + dico.items()(i)(3)
        Next
        With .CurrentRegion
            .VerticalAlignment = xlCenter
            .BorderAround Weight:=xlThin
            .Borders(xlInsideVertical).Weight = xlThin
            .Font.Name = "calibri"
            .Rows(1).Font.Size = 12
            .Rows(2).BorderAround Weight:=xlThin
            With .Offset(1).Resize(.Rows.Count - 1)
                .HorizontalAlignment = xlCenter
                .Font.Size = 9
            End With
            .Columns(1).ColumnWidth = 16
            With .Offset(, 1).Resize(, .Columns.Count - 1)
                .Columns.ColumnWidth = 17
            End With
        End With
        .Parent.Activate
    End With
    Application.ScreenUpdating = True
End Sub
Je n'ai pas tenu compte de la colonne 1, je peaufinerai plus tard
klin89
 

Pièces jointes

Dernière édition:
Bonsoir à tous, bonsoir klin89,

Reçu le message privé de FAB80170 Aujourd'hui ( 01/12/16 à 15 h 20 ):

Bonjour JBADE.

Je n'avais pas encore testé, gestion du temps compliquée ...

Là, c'est fait ! C'est super génial !!!

MILLE MERCI / BRAVO / IMMENSE RESPECT !!!!!!!!!!!!!!


Ce n'est pas pour me donner des fleurs mais pour indiquer que le problème est clos !
bonne soirée !
 
Re FAB80170,

Suite à la remarque du post #17, le code réajusté
VB:
Option Explicit
Sub test()
Dim a, w(), x(), i As Long, n As Long, t As Long, txt As String, e
Dim dico As Object, pos As Byte, couleurs()
    couleurs = VBA.Array(36, 40, 22)
    Set dico = CreateObject("Scripting.Dictionary")
    dico.CompareMode = 1
    a = Sheets("Feuil1").Range("a1").CurrentRegion.Value
    n = 1
    With CreateObject("Scripting.Dictionary")
        .CompareMode = 1
        For i = 2 To UBound(a, 1)
            txt = Join$(Array(a(i, 1), a(i, 2)), Chr(2))
            If Not .exists(txt) Then
                n = n + 1
                .Item(txt) = n
            End If
            If Not dico.exists(a(i, 3)) Then
                ReDim w(1 To 3)
                'attention à la 2ème dimension
                ReDim x(1 To UBound(a, 1), 1 To 10)
                Set w(1) = CreateObject("Scripting.Dictionary")
                w(1).CompareMode = 1
                w(3) = 0
            Else
                w = dico(a(i, 3))
                x = w(2)
            End If
            w(1)(txt) = w(1)(txt) + 1
            x(.Item(txt), w(1)(txt)) = a(i, 4)
            pos = w(1)(txt)
            If pos > w(3) Then
                x(1, w(1)(txt)) = "GEN_PNEU " & pos
            End If
            w(2) = x
            w(3) = Application.Max(w(3), pos)
            dico(a(i, 3)) = w
        Next
        ReDim b(1 To .Count, 1 To 2)
        n = 0
        For Each e In .keys
            n = n + 1
            b(n, 1) = Split(e, Chr(2))(0)
            b(n, 2) = Split(e, Chr(2))(1)
        Next
    End With
    'restitution
    Application.ScreenUpdating = False
    With Sheets("Feuil2").Cells(1)
        .CurrentRegion.Clear
        With .Offset(1)
            .Value = "COD_FPNEU"
            .Interior.ColorIndex = 43
        End With
        With .Offset(1, 1)
            .Value = "COM_DIM"
            .Interior.ColorIndex = 44
        End With
        With .Offset(2).Resize(UBound(b, 1), UBound(b, 2))
            .Value = b
        End With
        t = 2: n = 0
        For i = 0 To dico.Count - 1
            With .Offset(, t)
                .Value = dico.keys()(i)
                With .Resize(, dico.items()(i)(3))
                    .HorizontalAlignment = xlCenterAcrossSelection
                    .BorderAround Weight:=xlThin
                    .Interior.ColorIndex = couleurs(n)
                    n = n + 1
                    If n > UBound(couleurs) Then n = 0
                End With
            End With
            With .Offset(1, t)
                With .Resize(UBound(b, 1) + 1, dico.items()(i)(3))
                    .NumberFormat = "@"
                    .Value = dico.items()(i)(2)
                End With
            End With
            t = t + dico.items()(i)(3)
        Next
        With .CurrentRegion
            .VerticalAlignment = xlCenter
            .BorderAround Weight:=xlThin
            .Borders(xlInsideVertical).Weight = xlThin
            .Font.Name = "calibri"
            .Rows(1).Font.Size = 11
            .Rows(2).BorderAround Weight:=xlThin
            With .Offset(1).Resize(.Rows.Count - 1)
                .HorizontalAlignment = xlCenter
                .Font.Size = 9
            End With
            .Columns(1).ColumnWidth = 12
            With .Offset(, 1).Resize(, .Columns.Count - 1)
                .Columns.ColumnWidth = 16
            End With
        End With
        .Parent.Activate
    End With
    Set dico = Nothing
    Application.ScreenUpdating = True
End Sub
klin89
 
Bonjour kling89, JBARRE.

Pardonnes ce retour tardif;
Le code renvoi le même nombre de lignes et de données que la macro de JBARRE.
Je vais contrôler le contenu et reviens vers toi dès que possible (début de semaine).

Un grand merci à vous !!!

Bon week-end.

Bien cordialement.
 
- 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
15
Affichages
681
Retour