Trier et copier une liste d'articles

Bonjour,

Je fais à nouveau appel à vous, car je cherche à résoudre le problème suivant :

J'ai une liste d'articles assez longue (onglet 'Balance') et je souhaite qu'ils se recopient automatiquement dans les onglets E, F, G et H en fonction de leur référence (E, F, G ou H).

Actuellement, j'ai fait une macro qui filtre, copie et colle les données (en rouge) dans les onglets.

Cependant, c'est assez lourd et difficile à gérer, car en réalité j'ai de nombreuses données et onglets.

Y a-t-il une possibilité d'automatiser cette "affectation" sans devoir exécuter une macro ?

D'avance merci pour votre aide toujours précieuse !

8classeur1.xlsx (11.26 Ko)

Bonsoir,

Actuellement, j'ai fait une macro qui filtre, copie et colle les données (en rouge) dans les onglets. On aurait aimé voir cette macro.

Je vous propose une, dites-moi si elle plus rapide que la vôtre.

Sub Repartition()
    Dim f1 As Worksheet, f2 As Worksheet
    Dim DerLig_f1 As Long, DerLig_f2 As Long, Der_Ref As Long, i As Long, NbLig As Long
    Application.ScreenUpdating = False
    Set f1 = Sheets("Balance")
    f1.Select
    DerLig_f1 = f1.Range("A" & Rows.Count).End(xlUp).Row
    Range("D2:D" & DerLig_f1).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("L1"), Unique:=True
    Der_Ref = f1.Range("L" & Rows.Count).End(xlUp).Row
    If f1.AutoFilterMode = False Then f1.Range("A2:E2").AutoFilter
    For i = 2 To Der_Ref
        Feuille = f1.Cells(i, "L")
        Set f2 = Sheets(Feuille)
        DerLig_f2 = f2.Range("J" & Rows.Count).End(xlUp).Row
        f1.Range("A2:E" & DerLig_f1).AutoFilter Field:=4, Criteria1:=f1.Cells(i, "L")
        NbLig = f1.Range("_FilterDataBase").SpecialCells(xlCellTypeVisible).Count - 1
        f1.Range("_FilterDataBase").Offset(1, 0).Resize(NbLig + 2, 5).SpecialCells(xlCellTypeVisible).Copy f2.Range("J" & DerLig_f2 + 1)
    Next i
    f1.Columns(12).ClearContents
    Set f1 = Nothing
    Set f2 = Nothing
End Sub

Cdlt

Merci beaucoup, c'est effectivement beaucoup plus rapide que ce que j'avais essayé de faire !

N'y a-t-il pas une solution, peut-être en VBA, pour que les données se recopient en temps réel dans les onglets, sans devoir lancer une macro ?

Cordialement.

Bonjour,

Oui bien sûr, par exemple en faisant un double-clic sur l'une des cellules des colonnes A à D, cela ne recopiera que la ligne concernée.

Macro à copier dans le module de la feuille "Balance":

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim f1 As Worksheet, f2 As Worksheet
    Dim F_Fest As Long, DerLig_f2 As Long
    If Not Intersect(Target, Range("A3:D10000")) Is Nothing And Target.Value <> "" Then
        F_Dest = Cells(Target.Row, "D")
        Set f1 = Sheets("Balance")
        Set f2 = Sheets(F_Dest)
        DerLig_f2 = f2.Range("J" & Rows.Count).End(xlUp).Row
        Range(f1.Cells(Target.Row, "A"), f1.Cells(Target.Row, "E")).Copy f2.Cells(DerLig_f2 + 1, "J")
    End If
    Set f1 = Nothing
    Set f2 = Nothing
End Sub

On peut aussi faire que: la recopie s'effectue juste à près avoir saisi le prix:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim f1 As Worksheet, f2 As Worksheet
    Dim F_Fest As Long, DerLig_f2 As Long
    If Not Intersect(Target, Columns(5)) Is Nothing And Target.Value <> "" Then
        F_Dest = Cells(Target.Row, "D")
        Set f1 = Sheets("Balance")
        Set f2 = Sheets(F_Dest)
        DerLig_f2 = f2.Range("J" & Rows.Count).End(xlUp).Row
        Range(f1.Cells(Target.Row, "A"), f1.Cells(Target.Row, "E")).Copy f2.Cells(DerLig_f2 + 1, "J")
    End If
    Set f1 = Nothing
    Set f2 = Nothing
End Sub

Cdlt

Top, merci !

On s'approche de la solution.

Le problème que j'y vois encore, c'est que si l'utilisateur double-clic plusieurs fois sur la même cellule, les données se recopient plusieurs fois.

Peut-être en faisant que les données se recopient une fois la référence introduite en colonne D, car cela correspondrait à notre méthode de travail (colonne D complétée en dernier) ?

Dans ce cas, si nous corrigeons par la suite la référence introduite en colonne D, est-ce que cela pourrait corriger l'affectation dans l'onglet concerné ?

Cordialement.

Bonjour,

Une autre solution, utilisant le filtre avancé.

Préalable, les onglets ont le même nom que les références.

Le code se déroule lorsqu'on active un des onglets "Référence"

Dans le ThisWorkbook :

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Sh.Name <> "Balance" Then Call Dispatch(Sh.Name)
End Sub

Et dans un module standard :

Sub Dispatch(WsName As String)
Dim Plg As Range
Application.ScreenUpdating = False
With Sheets("Balance")
    Set Plg = .Range("A2:E" & .Cells(Rows.Count, "A").End(xlUp).Row)
    .Range("Z1").Value = .Range("D2").Value: .Range("Z2") = WsName
    Plg.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range("Z1:Z2"), CopyToRange:=Range("J1:N1"), Unique:=False
    .Range("Z1:Z2").Clear
End With
End Sub

Bonne journée

Trop fort, cela correspond exactement à ce que je recherchais !

Un très grand merci pour votre aide !!

Je vais maintenant essayer de comprendre pour adapter à mon fichier :-)

Une bonne journée et encore merci.

PS vive la Bretagne !

Sinon, j'allais vous proposer ceci:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim f1 As Worksheet, f2 As Worksheet
    Dim F_Fest As Long, DerLig_f2 As Long, N° As Long
    If Not Intersect(Target, Range("A3:D10000")) Is Nothing And Target.Value <> "" Then
        F_Dest = Cells(Target.Row, "D")
        N° = Cells(Target.Row, "A")
        Set f1 = Sheets("Balance")
        Set f2 = Sheets(F_Dest)
        DerLig_f2 = f2.Range("J" & Rows.Count).End(xlUp).Row
        'recherche du numéro dans la feuille de destination
        With f2.Range(f2.Cells(1, "J"), f2.Cells(DerLig_f2, "J"))
            Set x = .Find(N°)
            If Not x Is Nothing Then
                Reponse = MsgBox("Cette référence existe déjà, voulez-vous la remplacer?" & Chr(10) & " en cliquant sur OUI, elle sera remplacée " & Chr(10) & " en cliquant sur NON, elle sera ajoutée?", vbYesNo + vbCritical + vbDefaultButton2, "Contrôle des N°")
                If Reponse = vbYes Then
                    Range(f1.Cells(Target.Row, "A"), f1.Cells(Target.Row, "E")).Copy f2.Cells(x.Row, "J")
                Else
                    Range(f1.Cells(Target.Row, "A"), f1.Cells(Target.Row, "E")).Copy f2.Cells(DerLig_f2 + 1, "J")
                End If
            Else
                Range(f1.Cells(Target.Row, "A"), f1.Cells(Target.Row, "E")).Copy f2.Cells(DerLig_f2 + 1, "J")
            End If
        End With
        Range(f1.Cells(Target.Row, "A"), f1.Cells(Target.Row, "E")).Font.Color = RGB(0, 0, 255)
    End If
Sortie:
    Set f1 = Nothing
    Set f2 = Nothing
End Sub

Si la référence existe déjà, une boîte de dialogue s'ouvrira et demandera si on ajoute ou remplace la ligne existante

se plus, à chaque double-clic sur une cellule, l'écriture de la ligne du tableau passe en bleu.

Merci beaucoup, je vais également tester et si je n'arrive pas à adapter l'autre solution, peut-être que j'y parviendrai avec celle-ci.

Bonne journée !

Bonjour,

Vous m'avez grandement aidé hier avec un fichier dans lequel je souhaitais trier des articles (onglet Balance) et les affecter dans des onglets (E, F ,G et H).

J'ai essayer de progresser avec mon fichier, mais je constate que si je crée des onglets supplémentaires, les en-têtes (numéro, type d'article,...) se collent également sur les nouveaux onglets (feuil2, feuil01, 01, 02).

Y a-t-il moyen de ne coller les données que sur les onglets E, F, G et H ?

D'avance un grand merci si vous parvenez à m'aider, car cela dépasse mes compétences :-(

Cordialement.

Chris.

1classeur1-c.xlsm (33.30 Ko)

Merci beaucoup.

Je cherchais une solution "automatique", mais à défaut une macro peut faire l'affaire.

En revanche, il y a un problème lors de la reprise des en-têtes de colonnes qui ne suivent pas correctement.

Cordialement.

Bonjour,

Voilà le fichier corrigé:

Cdlt

Bonjour,

Oui, cela fonctionne ainsi !

Merci beaucoup et une bonne journée.

Cordialement.

Rechercher des sujets similaires à "trier copier liste articles"