Excel + macro

bonjour a tous!

voila mon probleme:je suis sous excel j'ai un fichier avec 15 colonnes dont une a pour entete "ville"
plusieurs lignes peuvent correspondre a la meme ville
je voudrais a partir de ce fichier générer un fichier pour chaque ville
voila le code que j'ai tapé :

Private Sub CommandButton1_Click()

Dim plag As Range
Dim cel As Range
Dim chem As String
chem = ThisWorkbook.Path & "\"
Set plag = Range("D2:A" & Range("D65536").End(xlUp).Row) 'à adapter à la colonne contenant les villes
For Each cel In plag
Application.Workbooks.Add
Set fs = Application.FileSearch
With fs
.LookIn = chem
.Filename = cel.Value & ".xls"
If .Execute > 0 Then GoTo suite
End With
ActiveWorkbook.SaveAs (chem & cel.Value & ".xls")
suite:
ActiveWorkbook.Close
Next cel

End Sub

mon soucis c que mes fichiers pôrtent bien comme nom le nom des villes mais ils sont vides...sauriez vous a quel niveau du code je dois indiquer de ne metrre que les lignes correspondant dans chaque fichier?

merci d'avance!

11 réponses

  1. Bonjour loic,
    Au fait, je n'y avais pas pensé; faite un débogage pas à pas sur votre code pour voir ou se situe le problème.

    NB: pourquoi ne pas avoir un seul classeur avec feuille pour d'ensemble et les suivantes 1 par ville. Penser aussi aux futures mises à jour!i

    Salutations
    Jean-Pierre
    0
    1. en fait j'ai aussi pensé a faire une feuille par ville..j'ai utilisé le code suivant :

      Private Sub CommandButton1_Click()

      With Worksheets(1)
      .Range(.[A1], .[G1].End(xlDown)).Copy Worksheets(2).[A1]
      End With

      End Sub

      mon probleme c'est que j'ai du mal a comprendre ce code!
      si tu le comprend n'hesite pas!
      en fait en cliquant sur CommandButton1, ca copie puis colle les valeurs de ma feuille 1 dans la feuille 2(dans mon ex j'avais utlisé deux colonnes de deux lignes chacunes)
      nimes 1
      paris 2

      alors que je voudrais avoir dans la feuille 2 nimes 1
      et dans la feuille 3 paris 2
      si tu as une idee..
      merci d'avance!
      0
  2. Bonjour loic,
    Attention, ceci correspond au message d'origine.
    En marge : Il semble qu’il y a quelques problèmes d’accès sur le site, c’est très très long, vous pouvez me joindre directement pingou_ccm@bluewin.ch si vous le désirez.
    Pour une fois j'ai fait un extra en testant votre code pas très simple pour s'y retrouver sans annotations.
    La seule chose qu'il sait faire c'est de créer autant de nouveaux classeurs (3 par ligne pour chaque colonne B,C et D) qu'il y a de ligne dans votre classeur principale.
    Votre instruction:
    Set plag = Range("D2:A" & Range("D65536").End(xlUp).Row) >> n'a pas de valeur; renvoi des compléments d’expression
    Nb : à vous lire, je pense que le code est un exemple que vous essayez d’adapter à votre cas. Dans se cas c’est toujours un peu plus complexe car nous ne réfléchissons pas comme la personne qui la créer.

    Salutations
    Jean-Pierre
    0
    1. merci d'avoir repondu
      est ce que tu verrais comment faire a partir de ce code pour pouvoir afficher les valeurs qui correspondent au villes?
      je suis un peu perdu..

      je comprend un peu plus ce code :

      Private Sub CommandButton1_Click()
      With Worksheets(1)
      .Range(.[A1], .[B1].End(xlDown)).Copy Worksheets(2).[A1]
      End With
      End If
      Next
      End Sub

      je suppose qu'il doit falloir faire une boucle pour pouvoir faire en sorte d'afficher uniquement dans les feuilles ce qui correspond aux differents villes mais je ne vois pas comment faire cette boucle pour balayer la colonne des villes et faire en sorte que dans une feuille "i" s'affiche uniquement les lignes correspondant a une seule ville...si jamais tu as une idée...
      encore merci !
      0
  3. Bonjour loic,
    A la suite de vos 2 messages (06/10/2004 à 14:32 GMT+1) et (06/10/2004 à 14:20 GMT+1) je commence à vous comprendre.
    En résumé :
    1 classeur, feuille1( les données sur X colonnes, dont une pour nom de la ville.
    Vous voulez :
    Soit 1 classeur ou 1 nouvelle feuille (à vous de décider) avec toutes les données concernant une ville.
    Une mise à jour tous les X jours. Je vous propose la MàJ sur commande après modification, ajout ou suppression ; ceci au plus tard juste avant de fermer le classeur original.
    Est-ce bien comme cela ?
    Bonne continuation.

    Salutations
    Jean-Pierre
    0
    1. oui c bien ca
      et mon soucis qu'il s'agisse de faire un nouveau classeur pour chaque ville ou seulement une nouvelle feuille est que je ne vois pas comment faire pour selectionnenr les données relatives a une ville et les afficher a l'endroit qui correspond.
      je suis carrement bloquer!!
      si jamais tu as une idée je t'en serait tres reconnaissant..je bloque depuis ce matin...il faut dire que je ne suis pas tres douer côté VBA
      merci d'avance!
      0
  4. Bonjour loic,
    Donc vous choisissez de mettre le tout sur le même classeur (Worksheets >>> pour feuille).

    Oui on peut utiliser ce code et faire une boucle sur les noms de ville et mettre les enregistrements correspondants dans la feuille adéquate. Ce code proposé ne me plait pas car il copie les enregistrements d’une feuille.

    Autre solution, écrire un nouveau code en se basant sur la colonne ville (sans boulon) et le nombre d’enregistrement (celui varie avec le temps)

    Une autre solution est d’exécuter un filtre élaboré et de transférer le résultat dans la feuille adéquate.

    Je vous fais un petit exemple que vous pourrez adapter sans problème. SVP environ combien de nom de ville? Merci.

    Salutations
    Jean-Pierre
    0
    1. Bonsoir loic,
      Juste pour vous faire patienter, avec Excel vous avez la possibilité d’enregistrer, dans une macro, les opérations que vous faites sur un classeur et ensuite vous lancez cette macro qui refait les opérations enregistrées. Bien sur la prochaine étape est de généralisé les ordres à l’intérieure de sorte qu’elle trouve elle même les variables.
      Essayer donc cette possibilité, cela vous aidera certainement à comprendre.
      Marche à suivre : (à faire sur une copie, pour éviter tout problème)
      Dans le classeur ouvert :
      sur Outils\Macro\Nouvelle macro..
      Dans la fenêtre suivante vous faites OK
      A partir de maintenant, tout ce que vous faites sur le classeur et enregistrer.
      Exécuter ce que vous désirez et pour terminer : sur Outils\Macro\Arrêter l’enregistrement
      Pour voir le travail : sur Outils\Macro\Macros ,ensuite sélectionner Macro…. Ensuite essayer les diverses possibilité(Exécuter, modifier, Pas à pas etc.)
      La suite arrive.
      Bonne soirée.

      Salutations
      Jean-Pierre
      0
      1. Bonsoir loic,
        S'il vous plait, environ combien de nom de ville?
        Merci.

        Salutations
        Jean-Pierre
        0
        1. Bonjour loic,

          S'il vous plait, environ combien de nom de ville?
          Merci.

          Proposition :
          Feuille principale= Globale, Nb Col indifférent, Col E = nom ville
          Feuille ville = NomVille, même Nb de Col que Globale
          Marche à suivre :
          Par macro en VBA, en italique le code connu et normale pour explication et code à faire

          Private Sub ExtraitVille_Click()
          Déclaration des variables
          Dim vaVille , vaPlage As Range
          Activer la feuille globale
          Worksheets(“Globale”).Select
          Initialiser la plage avec nom de ville, aussi utiliser comme compteur
          Set vaPlage = Range("E2:E" & Range("E2").End(xlDown).Row)
          Réaliser la boucle, et prendre le premier nom de ville
          For Each vaVille In vaPlage
          Contrôle de l’existence d’un feuille pour le nom de ville en cours
          IF condition non existant Worksheets(“vaVille”)
          Créer nouvelle feuille
          Renommer selon nom de ville
          End If
          Activer la nouvelle feuille
          Ecrire l’enregistrement
          Activer la feuille Global
          Nom de ville suivant >> si Nothing >> fin de boucle
          Next vaVille
          End Sub

          J’ai besoin d’un peu de temps pour écrire et tester cette macro.
          Pour patienter, essayer donc de trouver les instructions correspondantes.
          Bonne continuation.

          Salutations
          Jean-Pierre
          0
          1. Bonsoir loic,
            Voici la macro pour réaliser votre désir.
            Si nécessaire vous pouvez me joindre pingou_ccm@bluewin.ch , se sera peut être mieux..
            Macro pour feuille :

            'Déclaration des variables
            Dim vaVille, vaPlage As Range
            Dim vaNomFe As Variant
            
            Private Sub ExtraitVille_Click()
            Sheets("Globale").Select
            Cells.Select
                Selection.Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlYes, _
                    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
                    DataOption1:=xlSortNormal
            Application.Run "FeuilleNomVille"
            Let vaNoLi = 1
            Set vaPlage = Range("E2:E" & Range("E2").End(xlDown).Row)
                For Each vaVille In vaPlage
                    Let vaNoLi = vaNoLi + 1
            Let vaNomFe = vaVille
            Let vaNoFe = Sheets(vaNomFe).Index
            Worksheets("Globale").Rows(vaNoLi).Copy
            Worksheets(vaNoFe).Select
            Let vaAct = ActiveCell.Row
            Cells(1 + vaAct, 1).Select
            ActiveSheet.Paste Destination:=Sheets(vaNoFe).Rows(1 + vaAct)
            'Nom de ville suivant >> si Nothing >> fin de boucle
            Next vaVille
            End Sub
            
            Private Sub FeuilleNomVille()
            Let vaNoFe = 1
            Let vaFe = 1
            Set vaPlage = Range("E2:E" & Range("E2").End(xlDown).Row)
            For Each vaVille In vaPlage
              If vaVilleAv <> vaVille Then
                Let vaNomFe = Worksheets(vaNoFe).Name
                    If vaNomFe <> "Gobale" Then
                        If vaNomFe = vaVille Then
            ' Effacer les enregistrements de Résultats pour nouvelle mise à jour
            ‘Doit encore être réaliser, à voir avec M. Loic
                        Else
               Let vaNoFe = vaNoFe + 1
                        Set NewSheet = Sheets.Add(after:=Sheets(vaNoFe - 1))
                        ActiveSheet.Name = vaVille
            Worksheets("Globale").Rows("1:1").Copy
            ActiveSheet.Paste Destination:=Sheets(vaNoFe).Rows("1:1")
                        End If
                    End If
                  Let vaVilleAv = vaVille
               End If
               Let vaFe = vaFe + 1
            'Nom de ville suivant >> si Nothing >> fin de boucle
            Next vaVille
            End Sub


            En principe cela fonctionne parfaitement, j'ai testé.
            Bon courage et n'oubliez pas ma proposition, à vous de voir.

            Salutations
            Jean-Pierre
            0
            1. bonjour!

              je n'etais pas la hier je viens de recevoir tes messages de jeudi
              vraiment merci d'avoir pris du temps pour le code..je vais le tester et je te dirais si ca fonctionne chez moi.au fait il y a 13 noms de villes differnentes et toutes apparaissent sur plusieurs lignes
              encore merci!
              A +.
              0
            2. rebonjour!

              j'ai essaye ton code mais j'ai un souci pour comprendre cette partie :

              Selection.Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlYes, _
              OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
              DataOption1:=xlSortNormal

              E c'est la colonne des villes c'est ca?
              dans mon cas c'est A don j'ai remplacé mais quand je lance l'application ca me met ce message d'erreur :

              erreur definie par l'application ou par l'objet et ca pointe vers

              Selection.Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlYes, _
              OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
              DataOption1:=xlSortNormal

              si je peux me permettre deja que tu m'as bcp aidé, pourrais tu m'expliquer un peu?

              merci d'avance!
              0
          2. Que c'est compliqué...

            pourquoi pas passer à access?
            0
            1. Bonjour zenon,
              Vous avez entiérement raison, par access se serait mieux adapté.
              Par contre si on reste sur excel il y à plusieur possibilité et l'une d'elle est de passé par le filtre élaboré avec copie du résultat sur une autre feuille, ce qui est très simple.
              En passant par VBA c'est plus compliqué, mais quel plaisir pour l'esprit, n'est-ce pas.
              Bonne fin de semaine.

              Salutations
              Jean-Pierre
              0
              1. Personnellement, je serais incapable de le faire sous excel: comment entrer la référence à une colonne dans le filtre?

                Je n'ai pas trouvé dans l'aide... l'aide nécessaire!?

                Alors que filtrer ou créer une requête ne me poserait aucun problème sous access...

                Bon WE.
                0
              2. rebonjour!

                g encore besoin de ton aide
                qd je lance le programme g une erreur au niveau de
                Cells(1 + vaAct, 1).Select
                voila l'erreur :
                "la methode select de la classe Range a echoué
                Erreur d'execution 1004"
                pourrais tu m'expliquer pkoi j'obtiens cette erreur?
                j'avoue que je suis bloqué!

                et j'ai eu aussi un soucis avec
                Application.Run "FeuilleNomVille
                que j'ai remplacé par
                Call FeuilleNomVille

                merci d'avance
                0
              3. @zenonBonjour zenon,
                Merci pour le message.
                Vous savez, il y a un certain temps sous excel tout le monde avait en tête, les macros il n'y a que cela, mais personne au bout pour expliquer; donc j'ai pioché la chose.
                Quelque années plus tard, tout le monde parlait d'access comme la bon dieu (pardon pour lui); j'ai remis la compresse.
                Enfin, pour entrer la référence à une colonne dans le filtre il faut passé par une zone de critère que vous créer sur un coin de la feuille et que vous supprimez après utilisation. Dans l'aide, ce n'est pas évident, il faut un peu lire entre les lignes.
                Bonne fin de semaine.

                Salutations
                Jean-Pierre
                0