Excel + macro

loic -  
purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   -
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. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
     
    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. loic
       
      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. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
     
    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. loic
       
      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. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
     
    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. loic
       
      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. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
     
    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
  6. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
     
    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
  7. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
     
    Bonsoir loic,
    S'il vous plait, environ combien de nom de ville?
    Merci.

    Salutations
    Jean-Pierre
    0
  8. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
     
    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
  9. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
     
    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. loic
       
      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. loic
       
      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
  10. zenon Messages postés 729 Statut Membre 180
     
    Que c'est compliqué...

    pourquoi pas passer à access?
    0
  11. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
     
    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. zenon Messages postés 729 Statut Membre 180
       
      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
      1. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95 > zenon Messages postés 729 Statut Membre
         
        Bonjour 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
    2. loic
       
      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