Macro pour repositionner des valeurs sur la bonne ligne

Bonjour,

J'ai besoin d'un petit coup de pouce SVP.

J'ai une base fixe de produits alimentaires "Mercuriale initiale" en colonne BCD avec un numéro de lot en colonne B

J'importe une nouvelle base de produits alimentaires "nouvelle mercuriale" en colonne FGH avec le numéro de lot en colonne F

Je souhaiterais un tri de la "nouvelle mercuriale" (FGH) de facon à repositionner les numéros de lot identiques sur la meme ligne que la "mercuriale initiale"(BCD)

Si le numéro de lot de la "nouvelle mercuriale" (FGH) ne correspond à aucune valeur de la "mercuriale initiale"(BCD), alors déplacer la ligne de la colonne FGH dans la première ligne vide de la colonne FGH.

Merci d'avance pour votre aide

Bonjour,

Je vais peut être dire une bétise mais ayant vu que les produits de la première mercuriale étaient classés par ordre croisant en ce qui concerne leur numéro de lot, j'ai donc sélectionné les cellules (F3:H172) et ai demandé un tri par classement croissant, et sauf erreur de ma part j'ai obtenu un classement qui selon moi correspond à ta demande
Est ce bien cela que tu désires ?

Bonjour Jacky,

Merci Jacky pour ton observation. Ce n'est pas uniquement un tri à réaliser. Pour cette exemple, la liste de nombres est identique mais ce n 'est pas toujours le cas Je vais essayer d'etre plus précis

Par exemple une macro qui démarre de la cellule B1 puis elle recherche cette valeur dans la colonne F.

si la valeur est trouvé en F2: alors je selectionne F2+G2+H2, couper et coller ces valeurs en F1 ( Cellule trouvé dans colonne F, on copie les 2 cellules à droite) et sans supprimer les valeurs si F1 n'est pas vide.

Si valeur non trouvé : Je descends la valeur de la colonne F à la premiere ligne vide.

Bonjour diabolo162, Jacky 🙂

En fait, tu veux aligner tes données en te basant sur le n• de lot.

S'il n'y a pas de correspondances , on repousse les lignes en bas de tableau.

Dans ce cas, tu peux utiliser un dictionnaire, voire 2 boucles imbriquées pour tester les correspondances et procéder à l'alignement.

Tu alimentes une variable tableau des non-correspondances via un "ReDim Preserve" que tu restitues à la suite des correspondances.

Tout ça de mon téléphone portable 😛

klin89

Merci Klin pour la reformulation. Je pense que tu as bien cerné ma demande

re,

J'ai une proposition à te faire, elle vaut ce qu'elle peut valoir
Dis moi si ça peut te convenir

Private Sub CommandButton1_Click()
Dim lot1, lot2, der1, der2, I, K, J As Long

der1 = Cells(Rows.Count, 2).End(xlUp).Row
der2 = Cells(Rows.Count, 6).End(xlUp).Row

    For I = 3 To der2
    lot2 = Cells(I, 6)
        For K = 3 To der1
            lot1 = Cells(K, 2)
                If lot2 = lot1 Then Cells(K, 1) = K
        Next K
    Next I
    For J = 3 To Cells(Rows.Count, 6).End(xlUp).Row
       ' MsgBox J
        If Cells(J, 1) = "" Then Range(Cells(J, 6), Cells(J, 8)).Copy: Cells(J, 6).Select: ActiveSheet.Paste: Range(Cells(J, 6), Cells(J, 8)).Delete: 
    Next J

End Sub

Bonjour Jacky,

Merci pour ta proposition de macro, je teste et lors de son execution et je comprends que ta macro identifie les numéros de lot situé en colonne F qui sont sans correspondance avec les n° de lot de la colonne B en ajoutant une série de nombre en colonne A.

Cependant il me faudrait un alignement de la colonne F entre les N° de lot de la colonne B et F qui se correspondent et si un numero de lot de la colonne F ne correspond pas, la macro doit déplacer vers le bas de la colonne Fsur la première ligne vide ce nouveau numéro de lot ( Or ta proposition de macro supprime le n° de lot de la colonne F)

Je remets mon fichier avec des explications plus détaillées

Bonjour Diabolo,

Avant de me replonger dans ton projet je vais faire un petit bilan de ce que je t'ai proposé, chose que j'aurais du faire quand j'ai envoyé ma proposition

1) je cherche les correspondances entre les lots 1 (colonne B) et les lots 2 (colonne F) . Je passe en revue, l'un après l'autre, les lots 2 et regarde si un lot 1 lui correspond. Si c'est le cas je le signale en inscrivant dans la colonne A le numéro de la ligne correspondante à ce lot 2. J'aurais pi tout simplement mettre un "x" au lieu du numéro de ligne.

2) je passe en revue le contenu des cellules de la colonne A. Si une cellule est vide c'est qu'il n'y a aucune correspondance entre le lot 1 et le lot 2 donc il faut le "rejeter" en fin de colonnes F, G et H et le supprimer là où il se trouve actuellement. voila pourquoi

Or ta proposition de macro supprime le n° de lot de la colonne F

mais avant d'être supprimé il est bien "rejeté" en fin de la colonne F, G et H

        If Cells(J, 1) = "" Then Range(Cells(J, 6), Cells(J, 8)).Copy: Cells(J, 6).Select: ActiveSheet.Paste: Range(Cells(J, 6), Cells(J, 8)).Delete: 

mon erreur est donc située sur cette ligne, je vais voir cela
Toutefois essaie avec

        If Cells(J, 1) = "" Then Range(Cells(J, 6), Cells(J, 8)).Copy: Cells(der2, 6).Select: ActiveSheet.Paste: Range(Cells(J, 6), Cells(J, 8)).Delete: 'rg = rg + 1

A ce soir

Jacky

Re à tous,

Tu peux le faire via un dictionnaire, restitution sur une autre feuille.

Je n'ai gardé que 6 colonnes de la feuille source (2 blocs de 3 colonnes), ne sachant pas trop quelles colonnes il fallait restituer.

Option Explicit
Sub test1()
    Dim a, i As Long, ii As Long, iii As Long, dico As Object
    Set dico = CreateObject("Scripting.Dictionary")
    dico.CompareMode = 1
    With Sheets("Feuil2").Range("a1").CurrentRegion
        a = .Value2
        For ii = 1 To UBound(a, 2) Step 3
            For i = 2 To UBound(a, 1)
                If a(i, ii) <> "" Then
                    If Not dico.exists(a(i, ii)) Then
                        ReDim w(1 To UBound(a, 2))
                    Else
                        w = dico(a(i, ii))
                    End If
                    For iii = 1 To 3
                        w(iii + IIf(ii = 1, 0, 3)) = _
                        a(i, iii + IIf(ii = 1, 0, 3))
                    Next
                    dico(a(i, ii)) = w
                End If
            Next
        Next
    End With
    If Not Evaluate("isref('Alignement'!a1)") Then Sheets.Add(, Sheets(Sheets.Count)).Name = "Alignement"
    With Sheets("Alignement")
        With .Cells(1)
            .CurrentRegion.Clear
            .Resize(, UBound(a, 2)).Value = Application.Index(a, 1, 0)
            .Offset(1).Resize(dico.Count, UBound(a, 2)).Value = Application.Index(dico.items, 0, 0)
            With .CurrentRegion
                .Font.Name = "calibri"
                .Font.Size = 10
                .VerticalAlignment = xlCenter
                .Borders(xlInsideVertical).Weight = xlThin
                .BorderAround Weight:=xlThin
                With .Rows(1)
                    .HorizontalAlignment = xlCenter
                    .Font.Size = 11
                    .BorderAround Weight:=xlThin
                    .Interior.ColorIndex = 43
                End With
                .Columns(3).NumberFormat = Sheets("Feuil2").[C2].NumberFormat
                .Columns(6).NumberFormat = Sheets("Feuil2").[C2].NumberFormat
                .Columns.AutoFit
            End With
        End With
    End With
    Set dico = Nothing
End Sub
.Columns(3).NumberFormat = "_(* #,##0.00 €_);_(* (#,##0.00 €);_(* ""-""??€_);_(@_)"

klin89

Bonjour Klin89, Jacky,

Merci pour votre aide et bravo pour votre travail formidable.

Klin89, le résultat de la macro semble parfait… je la testerai mieux aujourd'hui et je te tiens informer

Jacky, merci beaucoup pour ton investissement et le résultat arrivait aussi très proche de ce que je souhaitais

Bonjour Klin89,

Je souhaiterais développer l'utilisation du fichier car les prix évoluent tous les trimestres...

Si je crée un 3eme "N°de lot, produit, prix" en GHI, est ce possible de générer un alignement en prenant en compte cette fois ci les colonnes DI (Feuil2)?

et dans la feuil ("Alignement"), de décaler vers la droite et cela à l'infini en laissant une colonne vide (lol)

Je remets le fichier pour plus de détails

Re diabolo162,

vois ceci :

Option Explicit
Sub test2()
    Dim a, w, i As Long, ii As Long, iii As Byte, dico As Object
    Set dico = CreateObject("Scripting.Dictionary")
    dico.CompareMode = 1
    With Sheets("Feuil2").Range("a1").CurrentRegion
        a = .Value2
        For ii = 1 To UBound(a, 2) Step 3
            For i = 3 To UBound(a, 1)
                If a(i, ii) <> "" Then
                    If Not dico.exists(a(i, ii)) Then
                        ReDim w(1 To UBound(a, 2) + 3)
                    Else
                        w = dico(a(i, ii))
                    End If
                    For iii = 1 To 3
                        Select Case ii
                        Case 1
                            w(iii) = a(i, iii)
                        Case 4
                            w(iii + 4) = a(i, iii + 3)
                        Case 7
                            w(iii + 8) = a(i, iii + 6)
                        End Select
                    Next
                    dico(a(i, ii)) = w
                End If
            Next
        Next
    End With
    Application.ScreenUpdating = False
    If Not Evaluate("isref('Alignement1'!a1)") Then Sheets.Add(, Sheets(Sheets.Count)).Name = "Alignement1"
    With Sheets("Alignement1")
        .UsedRange.Clear
        With .Cells(1)
            .Resize(, UBound(a, 2) + 3).Value = [{"","2024","","","","2025","","","","2026","",""}]
            .Offset(1).Resize(, UBound(a, 2) + 3).Value = _
            [{"N° de lot","Produits","Prix","","N° de lot","Produits","Prix","","N° de lot","Produits","Prix",""}]
            .Offset(2).Resize(dico.Count, UBound(a, 2) + 3).Value = Application.Index(dico.items, 0, 0)
            With .Resize(dico.Count + 2, UBound(a, 2) + 3)
                .Font.Name = "calibri"
                .Font.Size = 10
                .VerticalAlignment = xlCenter
                .Borders(xlInsideVertical).Weight = xlThin
                .BorderAround Weight:=xlThin
                With .Rows("1:2")
                    .HorizontalAlignment = xlCenter
                    .Font.Size = 11
                    .BorderAround Weight:=xlThin
                    .Interior.ColorIndex = 45
                End With
                .Columns(3).NumberFormat = "_(* #,##0.00 €_);_(* (#,##0.00 €);_(* ""-""??€_);_(@_)"
                .Columns(7).NumberFormat = "_(* #,##0.00 €_);_(* (#,##0.00 €);_(* ""-""??€_);_(@_)"
                .Columns(11).NumberFormat = "_(* #,##0.00 €_);_(* (#,##0.00 €);_(* ""-""??€_);_(@_)"
                .Columns.AutoFit
            End With
        End With
    End With
    Set dico = Nothing
    Application.ScreenUpdating = True
End Sub

klin89

Merci Klin89

Je te remercie!!! C'est parfait

Rechercher des sujets similaires à "macro repositionner valeurs bonne ligne"