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

Récupération de données

FAB80170

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

JBARBE

XLDnaute Barbatruc
Re,
J'avais oublié de supprimé sheets("Feuil2").select dans ma macro qui ne permettait pas en cliquant sur le bouton "GO" de faire fonctionner la macro sur n'importe quelle feuille !
bonne soirée !
 

Pièces jointes

  • selection_pneusD.xlsm
    46.8 KB · Affichages: 34

FAB80170

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

JBARBE

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

JBARBE

XLDnaute Barbatruc
Re,
Bon j'ai préparé dans la feuille 2 (6 GEN_PNEU) !
J’espère que cela sera suffisant !
bonne nuit !
 

Pièces jointes

  • selection_pneusE.xlsm
    49.1 KB · Affichages: 37
Dernière édition:

FAB80170

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

JBARBE

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

JBARBE

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

  • selection-pneusF.xlsm
    204.3 KB · Affichages: 29
Dernière édition:

JBARBE

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

  • selection-pneusF.xlsm
    342.9 KB · Affichages: 29

klin89

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

  • FAB80170.xls
    41.5 KB · Affichages: 33
Dernière édition:

JBARBE

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

klin89

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

FAB80170

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

Discussions similaires

Réponses
5
Affichages
338
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…