[Résolu] Copier automatiquement des lignes vers des onglets

kevin.sd

XLDnaute Nouveau
Bonjour à tous,

Voilà, j'ai un fichier avec plusieurs milliers de lignes et qui sont toutes regroupées par une référence pour la ville (ID Ville)

attachment.php


Je voudrais en fait, avec une macro, que toutes les lignes avec l'ID Ville "Avranches" aillent dans un onglet Avranches (un onglet qui se crée tout seul avec ce nom), que toutes les lignes avec l'ID Ville "Bayeux" aillent dans un onglet Bayeux, et ainsi de suite pour le reste des villes.

Y aurait-il une macro pour faire ça ? Je m'en remets à votre expertise !

Merci d'avance !
 

Pièces jointes

  • Villes.jpg
    Villes.jpg
    33.4 KB · Affichages: 206
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Copier automatiquement des lignes vers des onglets

Bonsoir Kevin, bonsoir le forum,

Plutôt qu'un instantané de l'onglet pourquoi ne pas fournir un exemple ! Ça nous éviterait de le créer nous-même pour vérifier la solution qu'on te propose... Il existe une
Lien supprimé du forum il serait bon que tu la lises !
Sinon, je te propose le code ci-dessous :
Code:
Sub Macro1()
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim dico As Object 'déclare la variable dico (DICtiOnnaire)
Dim cel As Range 'déclare la varialbe cel (CELlule)
Dim temp As Variant 'déclare la variable temp (tableau TEMPoraire)
Dim o As Object 'déclare la variable o (Onglet)
Dim dest As Range 'déclare la variable dest (cellule de DESTination)


With Sheets("Feuil1") 'prend en compte l'onglet "Feuil1" (à adapter à ton cas)
    dl = .Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne A
    Set pl = .Range("K2:K" & dl) 'définit la plage pl (colonne K)
End With 'fin de la prise ene compte de l'onglet "Feuil1"
Set dico = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dico
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
    dico(cel.Value) = "" 'alimente le dictionnaire
Next cel 'prochaine cellule de la boucle
temp = dico.keys 'récupère le dictionnaire sans doublon
For x = LBound(temp) To UBound(temp) 'boucle sur tous les éléments uniques du tableau temp
    On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
    Set o = Sheets(temp(x)) 'définit l'onglet o (si cet onglet n'exoste pas cela génère une erreur
    If Err <> 0 Then 'condition : si une erreur a été générée
        Err = 0 'annule l'erreur
        Sheets.Add after:=Sheets(Sheets.Count) 'ajoute un onglet
        ActiveSheet.Name = temp(x) 'nommne l'onglet
        Set o = Sheets(temp(x)) 'définit l'onglet o
    End If 'fin de la condition
    On Error GoTo 0 'annule la gestion des erreur
    'définit la cellule de destination (A1, si A1 est vide, sinon la première ligne vide de la colonne A)
    Set dest = IIf(o.Range("A1").Value = "", o.Range("A1"), o.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0))
    Sheets("Feuil1").Range("A1").AutoFilter field:=11, Criteria1:=temp(x) 'filte le tableau en fonction de temp(x)
    pl.SpecialCells(xlCellTypeVisible).EntireRow.Copy dest 'copie les lignes filtrées et les colle dans dest
    Sheets("Feuil1").ShowAllData 'supprime le filtre
Next x 'prochaine élément unique du tableau temp
End Sud
 

kevin.sd

XLDnaute Nouveau
Re : Copier automatiquement des lignes vers des onglets

Merci Robert de ta réponse.

Effectivement, ça sera mieux avec un vrai fichier. Le voici donc en PJ pour cet exemple.

J'ai, sinon, testé la macro mais elle n'a pas fonctionné. Un message m'indiquait une référence d'indice qui n'était pas valable.
 

Pièces jointes

  • Base2.xlsx
    10.5 KB · Affichages: 48

Robert

XLDnaute Barbatruc
Repose en paix
Re : Copier automatiquement des lignes vers des onglets

Bonsoir Kévin, bonsoir le forum,

Mon instrument de prédilection est la guitare mais, je ne sais pas pourquoi, il y a des jours où j'ai furieusement envie de me mettre au violon. Si, si, surtout quand l'envie de pisser me prend ! Bref, ça sert à quoi que je me décarcasse à expliquer les codes si on tombe sur des personnes qui ne prennent même pas le temps de le lire ?
Code:
With Sheets("Feuil1") 'prend en compte l'onglet "Feuil1" (à adapter à ton cas)
Il suffisait simplement de remplacer Feuil1 par Base2...
Le fichier avec le code adapté...
 

Pièces jointes

  • Kevin_v01.xls
    41 KB · Affichages: 56

kevin.sd

XLDnaute Nouveau
Re : Copier automatiquement des lignes vers des onglets

Bonjour Robert,

Désolé pour l'étude du code. A mon niveau, je n'ai pas encore ce réflexe là.

J'ai donc essayé ton nouveau fichier mais je rencontre 2 problèmes :

- J'ai donc bien un nouvel onglet Alençon mais celui-ci ne contient que la barre de titre et le premier contact. Les autres ne sont pas présents.

- Deuxième problème: Les onglets des autres villes ne sont pas créés.

Y-a-t-il quelque chose à adapter dans le code ? J'en ai lu l'intégralité mais rien ne me saute aux yeux.

D'avance merci.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Copier automatiquement des lignes vers des onglets

Bonjour Kévin, bonjour le forum,

Dans l'instantané la colonne A était remplie ! C'était par rapport à elle que je définissait la dernière ligne dl... Dans ton fichier en pièce jointe la colonne A ne contient que le titre donc dl = 1... J'aurais dû me douter que tu étais capable de me faire ce genre de traitrise... Heureusement que tu avais tout lu sinon, hein... On serait bien emm...dé !
La version 2 où la colonne de référence est la colonne K... TU ADAPTERAS À TES BESOINS :
 

Pièces jointes

  • Kevin_v02.xls
    41.5 KB · Affichages: 74

kevin.sd

XLDnaute Nouveau
Re : Copier automatiquement des lignes vers des onglets

Bonjour Robert,

La macro marche fantastiquement bien sur le dernier fichier que tu m'as fourni ! Merci !
Après cela, j'ai donc essayé d'appliquer la première macro (en changeant la référence à la feuille) au fichier original où chaque colonne est remplie jusqu'à K.

Cependant, on m'indique un dépassement de capacité lorsque je lance la macro.

Est-ce du au fait que le fichier contient plus de 165 000 lignes ?

Je m'y perds un peu, désolé...
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Copier automatiquement des lignes vers des onglets

Bonjour Kevin, bonjour le forum,

On va y arriver... il faut modifier le type de la variable dl. Remplace :
Code:
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
par :
Code:
Dim dl As Long 'déclare la variable dl (Dernière Ligne)
 

kevin.sd

XLDnaute Nouveau
Re : Copier automatiquement des lignes vers des onglets

Gé-nial !

Merci Robert, ça marche parfaitement. Ce qui m'a pris peut-être une heure la dernière fois a été réglé en quelques secondes avec ta macro !

Un grand merci et bonne continuation !
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : [Résolu] Copier automatiquement des lignes vers des onglets

Bonjour Kévin, bonjour le forum,

Non ! je n'y crois pas... Haaaaaaaaaa, vite mon pyjama, mon bonnet de nuit, mon œil de verre et mon dentier dans le verre, une soupe, un suppo effervescent et au lit... Je me sens si las !!!
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16