Répartir d'un onglet vers plusieurs onglets selon critères

Bonjour à tous,

voici mon problème.

Je possède un ensemble de données dans l'onglet Feuil1 de mon fichier excel (voir fichier joint).

La colonne C de cet onglet comporte plusieurs valeurs à partir de la 12e ligne (des codes service à 4 chiffres).

Je souhaiterai via une macro, que toutes mes données de l'onglet Feuil1 soient copiées dans des onglets en fonction de la valeur du code service (chaque ligne de données se retrouverait donc dans l'onglet du service correspondant).

Merci d'avance pour votre aide.

Voici une ébauche de code adaptée pour mon cas, mais qui me renvoi une erreur au niveau du "With Sheets(Tablo(J))"

Sub Répartition()
Dim DLig As Long
Dim Mondico As Object
Dim Tablo
Dim J As Long
Dim Ws As Worksheet

  Application.ScreenUpdating = False
  Set Ws = ActiveSheet

  ' Partie distribution des infos
  Set Mondico = CreateObject("Scripting.Dictionary")
  DLig = Range("A" & Rows.Count).End(xlUp).Row
  For J = 12 To DLig
    Mondico(Range("C" & J).Value) = Range("C" & J).Value
  Next J
  Tablo = Mondico.Items

  For J = 0 To UBound(Tablo)
    If FeuilleExiste(CStr(Tablo(J))) = False Then
      Sheets.Add after:=Sheets(Sheets.Count)
      ActiveSheet.Name = Tablo(J)
    End If
    With Sheets(Tablo(J))
      Ws.Range("A12:D" & DLig).AutoFilter field:=2, Criteria1:=Tablo(J)
      Ws.Range("A12:D" & DLig).SpecialCells(xlCellTypeVisible).Copy .Range("A2")
    End With
  Next J
  Ws.Select
  Ws.Range("A12:D" & DLig).AutoFilter
End Sub

Function FeuilleExiste(nom As String) As Boolean
  On Error Resume Next
  FeuilleExiste = Sheets(nom).Name <> ""
  On Error GoTo 0
End Function
294classeur1.zip (4.13 Ko)

Salut,

Les données à reporter sont ajoutées aux données déjà en place dans les feuilles 2105 et 6360 ou elles les remplacent ?

Peux-tu avoir des références en colonne C autres que 2105 et 6360 ? Si oui, je présume qu’il faut créer - par la macro - les feuilles correspondantes manquantes ?

Tes données de la Feuil1 sont supprimées lorsqu’elles sont reportées ou elles restent en place ? Si elles ne sont pas supprimées, on en fait quoi la prochaine fois que la macro est lancée ?

A te relire.

Salut à tous les deux,

mais qui me renvoi une erreur au niveau du "With Sheets(Tablo(J))"

le code te renvoie une erreur car ta valeur Tablo(J) est un nombre.

Tu lui demandes la 2105e feuille de ton classeur et non la feuille nommée 2105.

tu as bien cerné le problème plus haut, dans ton code en déclarant Tablo(J) en tant que string... tu dois faire pareil ici

Voilà ton code corrigé (si j'ai bien compris ce que tu voulais faire)

Sub Répartition()
Dim DLig As Long
Dim Mondico As Object
Dim aa As String
Dim J As Long
Dim Tablo

Application.ScreenUpdating = False

  ' Partie distribution des infos
Set Mondico = CreateObject("Scripting.Dictionary")

With Sheets("Feuil1")
    DLig = .Range("A" & Rows.Count).End(xlUp).Row

    For J = 12 To DLig
        Mondico(.Range("C" & J).Value) = .Range("C" & J).Value
    Next J

    Tablo = Mondico.Items
End With

  For J = 0 To Mondico.Count - 1
    If FeuilleExiste(CStr(Tablo(J))) = False Then
      Sheets("Feuil1").Copy after:=Sheets(Sheets.Count)
      aa = Tablo(J)
      ActiveSheet.Name = Tablo(J)
      Range("2:11").Delete

        With Sheets(aa)
            .Select
            .Rows("1:1").AutoFilter
            .Range("A2:D" & DLig).AutoFilter Field:=3, Criteria1:=aa 'Dlig correspond à la dernière ligne de la feuille 1
        End With
    End If

  Next J
Application.ScreenUpdating = True
End Sub

Function FeuilleExiste(nom As String) As Boolean
  On Error Resume Next
  FeuilleExiste = Sheets(nom).Name <> ""
  On Error GoTo 0
End Function
Yvouille a écrit :

Salut,

Les données à reporter sont ajoutées aux données déjà en place dans les feuilles 2105 et 6360 ou elles les remplacent ?

C'était un exemple pour vous montrer le résultat de ce que doit faire la macro....à savoir répartir dans autant d'onglet que de code de service différent. Sauf qu'effectivement je projète d'avoir déjà créé les onglets "code service" avec des graphes pré-paramétrés etc. La macro ne fait que chercher les données et les répartir dans les onglets déjà créés et portant le nom de chaque service.

Yvouille a écrit :

Peux-tu avoir des références en colonne C autres que 2105 et 6360 ? Si oui, je présume qu’il faut créer - par la macro - les feuilles correspondantes manquantes ?

En l'occurrence non, ça pourrait renvoyer une erreur par exemple.

Yvouille a écrit :

Tes données de la Feuil1 sont supprimées lorsqu’elles sont reportées ou elles restent en place ? Si elles ne sont pas supprimées, on en fait quoi la prochaine fois que la macro est lancée ?

Je suis plutôt partant pour que les données restent...puisque cela me permettra de faire des graphes sur les données de l'ensemble.

Game Over a écrit :

Salut à tous les deux,

mais qui me renvoi une erreur au niveau du "With Sheets(Tablo(J))"

le code te renvoie une erreur car ta valeur Tablo(J) est un nombre.

Tu lui demandes la 2105e feuille de ton classeur et non la feuille nommée 2105.

tu as bien cerné le problème plus haut, dans ton code en déclarant Tablo(J) en tant que string... tu dois faire pareil ici

Merci beaucoup pour tes corrections. Malheureusement le résultat n'est pas exactement ce que je recherche. En effet ton code copie l'intégralité des données dans les onglets et effectue un filtre...or je souhaite qu'il y ait un réel dispatching pour qu'il n'y ait que des données liées à un seul code à chaque fois dans chaque onglet.

comme ça ?

Sub Répartition()
Dim DLig As Long, DCol As Integer
Dim Mondico As Object
Dim aa As String, bb As String
Dim J As Long
Dim Tablo

Application.ScreenUpdating = False

  ' Partie distribution des infos
Set Mondico = CreateObject("Scripting.Dictionary")

With Sheets("Feuil1")
    DLig = .Range("A" & Rows.Count).End(xlUp).Row
    DCol = Cells(1, Columns.Count).End(xlToLeft).Column
    For J = 12 To DLig
        Mondico(.Range("C" & J).Value) = .Range("C" & J).Value
    Next J

    Tablo = Mondico.Items

    For J = 0 To Mondico.Count - 1
        aa = Tablo(J)
        If FeuilleExiste(CStr(Tablo(J))) = False Then
            Sheets.Add after:=Sheets(Sheets.Count)
            ActiveSheet.Name = (aa)
            .Range(.Cells(1, 1), .Cells(1, DCol)).Copy Destination:=ActiveSheet.Range("A1")
        ElseIf FeuilleExiste(aa) = True And Not IsEmpty(Sheets(aa).Range("A2")) Then
            Sheets(aa).Range("A2:D" & DLig).ClearContents
        End If
    Next J

    For k = 12 To DLig
    bb = .Cells(k, 3)
    .Range(.Cells(k, 1), .Cells(k, DCol)).Copy Destination:=Sheets(bb).Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
    Next k
End With

Application.ScreenUpdating = True
End Sub

    Function FeuilleExiste(nom As String) As Boolean
      On Error Resume Next
      FeuilleExiste = Sheets(nom).Name <> ""
      On Error GoTo 0
    End Function

ça a l'air de fonctionner parfaitement

je ferai différents tests dans les jours à venir et vous confirmerai ça.

Un grand merci à vous!

Après test, je m'aperçois que le code effectue le dispatching différemment qu'espéré.

Comme je l'ai précisé un peu plus haut dans un de mes posts, les différents onglets services sont déjà créés à l'avance dans mon fichier excel, et contiennent chacun des données pré-existantes dans la matrice A1:Dx (les en-têtes en ligne 1 et des formules en lignes 2 à 11 inclus).

Quand je lance ma macro, je souhaite que mes données (de la matrice A12:Dx de mon onglet général) soient dispatchées au même endroit dans les onglets service (dans la matrice A12:Dx).

Je ne sais pas si je suis bien clair. Sinon merci de me faire reformuler.

Merci d'avance. Bien à vous.

si j'ai bien compris, il te suffit de changer cette ligne

.Range(.Cells(1, 1), .Cells(1, DCol)).Copy Destination:=ActiveSheet.Range("A1")

par celle ci

.Range(.Cells(1, 1), .Cells(11, DCol)).Copy Destination:=ActiveSheet.Range("A1")

Malheureusement non cela ne fonctionne pas. Les données de la matrice A12:Dx de l'onglet général sont dispatchées directement en ligne 1 dans les onglets service, et non en ligne 12...ce qui écrase les données pré-existantes des matrices A1:D11 de mes onglets service.

comme ça, c'est un peu abstrait... remplace

.Range(.Cells(k, 1), .Cells(k, DCol)).Copy Destination:=Sheets(bb).Range("A" & Rows.Count).End(xlUp).Offset(1, 0)

par

.Range(.Cells(k, 1), .Cells(k, DCol)).Copy Destination:=Sheets(bb).Range("A12").End(xlUp).Offset(1, 0)

Si ce n'est pas ça, poste un exemple avec ce que tu obtiens et ce que tu souhaites obtenir

Ce n'est malheureusement pas ça.

Voici le fichier contenant l'onglet général "Feuil1"...en lançant la macro celle-ci créée deux onglets service 2105 et 6360 (que j'ai renommé par la suite 2105resultatmacro et 6360resultatmacro pour bien faire la différence avec ce que je recherche 2105recherché 6360recherché).

22classeur1.xlsm (25.45 Ko)

Je pense que c'est ça :

(à tester)

Merci infiniment, ça a l'air de fonctionner!

Rechercher des sujets similaires à "repartir onglet onglets criteres"