Via une macro, exporter des données -repose sur un critere

bibi42000 Messages postés 11 Statut Membre -  
lermite222 Messages postés 9042 Statut Contributeur -
Bonjour à tous

Me voila dans la panade, je me lance dans une macro, c est jouable mais pas sans vos lumieres

Voila, j ai un fichier excel, un tableau (nommé:2013-18)
Dans ce tableau, une colonne essentielle, "ville"
Mon objectif, une macro qui crée un fichier excel a chaque changement de ville.Ce nouveau fichier excel (exemple: Lyon) rapportera l'ensemeble des lignes pour lequelles "ville=Lyon"

Le must, serait que ce fichier excel se nomme en auto sur ce modele "NomVille+Nomfichier exceldebase" soit Lyon2013-18

J'imagine qu'il est necessaire d'utiliser une boucle pour se balayage?

Voila j ai l'idée finale, mais comment y parvenir?

je suis preneur si on peut m'accompagner

Bien cdt

10 réponses

  1. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Bonjour,
    Pour pouvoir "t'accompagner" il faudrait avoir un chemin, ou au moins un sentier, praticable.
    Tu ne donne aucun exemple concret, pas de début de code...
    Commence par faire les manipulations nécessaires avec l'éditeur de macro ensuite poste le code obtenu, nous t'aiderons à le finaliser.
    A+
    1
  2. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    En attendant, et avec les renseignements donnés, un début...
    Sub CreerClasseur()
    Dim Lig As Long, Debut As Integer, Col As Integer
    Dim Chemin As String, Nom As String, Extention As String
    Dim Wks As Worksheet
    Set Wks = ThisWorkbook.ActiveSheet
    Debut = 2 'ligne où commencer
    Extention = "2013-001.xls"
    Chemin = "C:\Users\m02410\Desktop\" 'répertoire de destination des nouveaux classeur
    For Lig = Debut To Range("A" & Rows.Count).End(xlUp).Row
    If Cells(Lig, "A") <> "" Then
    Nom = Cells(Lig, "A") & Extention
    If Dir(Chemin & Nom) = "" Then 'vérifie que le classeur n'est pas déjà créer
    Workbooks.Add
    For Col = 1 To 3
    Cells(1, Col) = Wks.Cells(Lig, Col)
    Next Col
    ActiveWorkbook.SaveAs (Chemin & Nom)
    ActiveWorkbook.Close
    End If
    End If
    Next Lig
    End Sub
    A+
    1
  3. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Il fonctionne sur ton classeur avec quelque petite modif pour contrer les caprices d'Excel.
    Sub CopierClasseur()
    Dim Lig As Long, Debut As Integer, Col As Integer
    Dim Chemin As String, Nom As String, Extention As String
    Dim Wks As Worksheet
    Set Wks = ThisWorkbook.ActiveSheet
    Debut = 2 'ligne où commencer
    Extention = "2013-001.xls"
    Chemin = "C:\Users\m02410\Desktop\" 'répertoire de destination des nouveaux classeur

    For Lig = Debut To Range("A" & Rows.Count).End(xlUp).Row
    If Cells(Lig, "A") <> "" Then
    Nom = Cells(Lig, "A") & Extention
    If Dir(Chemin & Nom) = "" Then 'vérifie que le classeur n'est pas déjà créer

    With Workbooks.Add
    For Col = 1 To 3
    .ActiveSheet.Cells(1, Col).Value = Wks.Cells(Lig, Col).Value
    Next Col
    .SaveAs (Chemin & Nom), FileFormat:=xlExcel8
    .Close
    End With
    End If
    End If
    Next Lig
    End Sub
    Mais tu dois un peu rectifier la colonne des villes, il est impossible d'avoir deux classeurs au même nom dans une répertoire.
    Modifie par exemple en Nantes 1, Nantes 2 etc..
    A+

    Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
    Note: Je ne répond pas aux MP pour les questions techniques. Et ma boule de cristal est cassée .
    1
    1. bibi42000 Messages postés 11 Statut Membre
       
      Merci pour ton retour.Juste un point sur "ville".Je souhaite obtenir un classeur qui se crée pour chaque ville distincte.Au sein de nantes par exemple, si mon fichier de base contenanit 4 lignes, alors ces 4 lignes doivent etre dedans.Et aisni de suite pour chaque ville .tu me suis? je t 'envoi un exemple de fichier qui se crée au regard du fichier source 2013-001 que j ai transmis plus tot.merci pour ton analyse
      0
    2. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      Bon, tu va encore ajouter d'autre conditions ?? j'aime pas beaucoup de faire et refaire parce qu'ont ajoute des trucs..:-(
      Bref, ceci dit,
      Rectifie les titres de ton classeur principal.
      Le nom des villes se suive toujours ?
      Des villes pourraient êtres ajoutées ?
      Tâche de penser à tout et tu dis.
      0
    3. bibi42000 Messages postés 11 Statut Membre
       
      salut lermite

      desolé, je pensai avoir abordé cet eclatement de fichier par ville.
      tu comprendras mon besoin, a partir du fichier source (https://www.cjoint.com/c/CKxmvWybY3J
      ) - creer d'autres fichier excel. chacun d'entre eux representant les lignes d'une meme ville
      exemple cible:https://www.cjoint.com/c/CKxrlfogROg

      Pour les villes, se sera toujours les memes (si d'autres je rajouterai dans le code).toujours en colonne 2
      Je mettrai dans macro, un tri croissant par ville

      Le fichier source aura toujours en ligne 1-les entetes de colonnes (il faudrait pouvoir les rapattrier dans chaque fichier excel crée par la macro)

      Selon fichier source, il peut y avoir moins ou plus de colonne
      Selon fichier source;il peut y avoir moins ou plus de ligne par ville
      Les villes toujours en colonne 2 dans fichier source

      J espere avoir ete plus precis, ton aide me sera precieuse

      Merci à toi
      0
    4. bibi42000 Messages postés 11 Statut Membre
       
      Mea culpa Ville toujours en colonne 1 comme dans fichier de base transmis
      0
  4. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Re,
    Ca devrait le faire...
    Option Explicit
    Option Compare Text

    Sub CopierClasseur()
    Dim Lig As Long, LigIt As Long, Debut As Integer, Col As Integer, DerCol As Integer
    Dim Chemin As String, Nom As String, Extention As String, Ville As String
    Dim Wks As Worksheet, Plage As Range
    Set Wks = ThisWorkbook.ActiveSheet
    Debut = 2 'ligne où commencer
    Extention = "2013-001.xls"
    DerCol = Wks.Range("A1").SpecialCells(xlCellTypeLastCell).Column
    Set Plage = Wks.Range(Cells(1, 1), Cells(1, DerCol))
    ' pourait mettre l'extention avec le nom du classeur mais attention,
    'au cas ou tu passe à Excel2007 faudra sauver ce classeur sous xls.
    'Extention = Wks.Name
    Chemin = "C:\Users\m02410\Desktop\" 'répertoire de destination des nouveaux classeur
    'Chemin = "C:\test\"
    For Lig = Debut To Range("A" & Rows.Count).End(xlUp).Row
    If Cells(Lig, "A") <> "" Then
    Nom = Cells(Lig, "A") & Extention
    If Dir(Chemin & Nom) = "" Then 'vérifie que le classeur n'est pas déjà créer
    'Voir Combien de lign(s) à copier
    Ville = Wks.Cells(Lig, 1).Value
    LigIt = Lig
    Do While Ville = Cells(LigIt + 1, 1).Value
    LigIt = LigIt + 1
    Loop
    With Workbooks.Add
    'copie les titres
    Plage.Copy Range("A1")
    'Copie les données
    Wks.Range(Wks.Cells(Lig, 1), Wks.Cells(LigIt, DerCol)).Copy Range("A2")
    .SaveAs (Chemin & Nom), FileFormat:=xlExcel8
    .Close
    Lig = LigIt
    End With
    End If
    End If
    Next Lig
    Set Wks = Nothing
    End Sub

    A+
    1
    1. bibi42000 Messages postés 11 Statut Membre
       
      Lermite, ca fonctionne , un grand merci pour cette disponibilité et cette réalisation.
      Il me reste des elemnts a perfectionner mais l'essentiel est present
      Je vais essayer de creer
      1)un Tri sur ville au demarrage de la macro
      2)rendre cette macro accessible à plusieurs utilisateurs,
      3) faire sauter la fenetre de "compatibilité" qui s'ouvre a chaque création de fichier (par ville)
      Il faut cliquer sur Oui, c est chiant, j aimerai qu'il disparaisse

      Encore merci,
      @+
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. bibi42000 Messages postés 11 Statut Membre
     
    Salut Lermite222

    Merci pour ton retour

    Tu as raison, voila un essai mais infructueux et insuffisant

    Tu comprendras, que je veux faire une boucle qui interroge fichier d'origine sur le champs "Ville"
    Si pour une meme ville, ya 3 lignes , macro crée un fichier excel où elle deposera ces 3 lignes (en reprenant ligne1-les entetes)
    En suite ville suivante, (une autre), elle prends les lignes cncernaient et crée un excel en copiant ces lignes tout en ramenant aussi ligne1-entetes de colonnes

    Et ainsi de suite

    Dans mon code, je ne sais pas gerer la boucle (tant que ?), alors je fais filtre sur champs "ville" et je copy colle-
    Bien à toi, ou t'envoyer le fichier excel source ? le code?
    0
    1. bibi42000 Messages postés 11 Statut Membre
       
      Sub ll()
      '
      ' ll Macro
      '
        'Classeur de base se nomme 2013-001
      '
          Range("A1").Select
          
        
          'prendre les lignes et colonnes actives du classeur de base
          
          Range(Selection, Selection.End(xlToRight)).Select
          Range(Selection, Selection.End(xlDown)).Select
          ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
          ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("A2:A18") _
              , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
              
          'Tri sur les villes du classeur de base(colonne A)
          
          With ActiveWorkbook.Worksheets("Feuil1").Sort
              .SetRange Range("A1:G18")
              .Header = xlYes
              .MatchCase = False
              .Orientation = xlTopToBottom
              .SortMethod = xlPinYin
              .Apply
          End With
          'la premiere ville suite au tri c est Brest, elle apparait sur la ligne 2 et 3- ligne 1 = entete de colonne'
          Range("A1").Select
          Range(Selection, Selection.End(xlToRight)).Select
          Range(Selection, Selection.End(xlDown)).Select
          Range(Selection, Selection.End(xlUp)).Select
          Range("A1:G3").Select
          
          'Copier coller des lignes avec Brest (dans leur totalité) vers un nouveau fichier excel
          
          Selection.Copy
          Workbooks.Add
          Cells.Select
          Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
              SkipBlanks:=False, Transpose:=False
          ActiveSheet.Paste
          Application.CutCopyMode = False
          ChDir "C:\Users\m02410\Desktop" 'lieu d'enregistrement, sans interet
          'Le best serait que le nom du fichier excel soit crée en auto sur le modele Ville+NomClasseurdebase
          ActiveWorkbook.SaveAs Filename:="C:\Users\m02410\Desktop\Brest2013-001.xls", _
              FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _
              ReadOnlyRecommended:=False, CreateBackup:=False
          Windows("Classeur1").Activate
          Windows("2013-001.xls").Activate
          Cells.Select
          
          'Comme je ne sais pas gerer le systeme de boucle, je fais tri sur ville, je prends la suivante, ici Lyon => A ameliorer)
          'Le gros sujet c est celui là, il faudrait une boucle qui balaye ville - un tant que ? et qui exporte ...
          
          Selection.AutoFilter
          ActiveSheet.Range("$A$1:$G$18").AutoFilter Field:=1, Criteria1:="Lyon"
          Range("A1").Select
          Range(Selection, Selection.End(xlToRight)).Select
          Range("A1:G6").Select
             'Copier coller des lignes avec Lyon (dans leur totalité) vers un nouveau fichier excel (sur meme principe que Brest)-Je reproduis cela pour chaque ville du classeur de base
          Selection.Copy
          Workbooks.Add
          Cells.Select
          Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
              SkipBlanks:=False, Transpose:=False
          ActiveSheet.Paste
          Application.CutCopyMode = False
          ActiveWorkbook.SaveAs Filename:="C:\Users\m02410\Desktop\Lyon2013-001.xls", _
              FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _
              ReadOnlyRecommended:=False, CreateBackup:=False
          Windows("2013-001.xls").Activate
          ActiveSheet.Range("$A$1:$G$18").AutoFilter Field:=1, Criteria1:="Nantes"
           'Copier coller des lignes avec Nantes (dans leur totalité) vers un nouveau fichier excel (sur meme principe que Brest)
          Range("A1").Select
          Range(Selection, Selection.End(xlToRight)).Select
          Range(Selection, Selection.End(xlDown)).Select
          Selection.Copy
          Workbooks.Add
          Cells.Select
          Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
              SkipBlanks:=False, Transpose:=False
          ActiveSheet.Paste
          Application.CutCopyMode = False
          ActiveWorkbook.SaveAs Filename:="C:\Users\m02410\Desktop\Nantes2013-001.xls" _
              , FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _
              ReadOnlyRecommended:=False, CreateBackup:=False
          Windows("2013-001.xls").Activate
          ActiveSheet.Range("$A$1:$G$18").AutoFilter Field:=1, Criteria1:="Nimes"
          'Copier coller des lignes avec Nimes (dans leur totalité) vers un nouveau fichier excel (sur meme principe que Brest)
          Range("A1").Select
          Range(Selection, Selection.End(xlToRight)).Select
          Range(Selection, Selection.End(xlDown)).Select
          Selection.Copy
          Workbooks.Add
          Cells.Select
          Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
              SkipBlanks:=False, Transpose:=False
          ActiveSheet.Paste
          Application.CutCopyMode = False
          ActiveWorkbook.SaveAs Filename:="C:\Users\m02410\Desktop\Nimes2013-001.xls", _
              FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _
              ReadOnlyRecommended:=False, CreateBackup:=False
          Windows("2013-001.xls").Activate
          ActiveSheet.Range("$A$1:$G$18").AutoFilter Field:=1
          Range("A1").Select
          ActiveWorkbook.Save
      End Sub
      0
  7. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    OK, ont a déjà un point de départ.
    Tu peu déposer ton classeur (sans donnée confidentielle) sur Cjoint.com
    Et mettre le lien dans un poste suivant.
    A+
    0
  8. bibi42000 Messages postés 11 Statut Membre
     
    Lermite, ca fonctionne , un grand merci pour cette disponibilité et cette réalisation.
    Il me reste des elemnts a perfectionner mais l'essentiel est present
    Je vais essayer de creer
    1)un Tri sur ville au demarrage de la macro
    2)rendre cette macro accessible à plusieurs utilisateurs,
    3) faire sauter la fenetre de "compatibilité" qui s'ouvre a chaque création de fichier (par ville)
    Il faut cliquer sur Oui, c est chiant, j aimerai qu'il disparaisse

    Encore merci,
    @+ et bon courage
    0
  9. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Re,
    Si tu en a encore besoin
    Faiit tout, la création des classeurs ou la mise à jour si existe déjà, commence par le tri.
    Avec une tite cerise sur le gâteau.. pour autant que tu aime les cerises, sinon, tu supprime.
    A+

    Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
    Note: Je ne répond pas aux MP pour les questions techniques. Et ma boule de cristal est cassée .
    0
  10. bibi42000 Messages postés 11 Statut Membre
     
    Lermite,
    C est topissimme ton code.j adore..la cerise excellente (j achete)

    Ce travail est à 95% de sa reussite, je te tire mon chapeau et te remercie

    ma charge est de conserver dans les fichiers crées via la macro, le formalisme du tableau de base (tableau de d'origine) Ajustement des colonnes, renvoyer à la ligne....

    Pour conclure, cette macro que je dois partager entre collaborateurs doit etre partagée puis il faudrait qu'elle puisse focntionner sur un classeur nommé different de celui de notre exemple 2013-001- faudrait que ca marche sur un classeur 2013-002 etc

    Enfin encore many thanks,
    0
    1. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      faudrait que ca marche sur un classeur 2013-002 etc
      Voir la remarque dans le code avec le nom du classeur.
      A+
      0