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!
A voir également:

11 réponses

purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
 
Bonjour loic,
Est-ce que cela fonctionne avec la solution sous ce lien:
http://www.commentcamarche.net/forum/affich-1042372-pb-avec-excel
http://www.commentcamarche.net/forum/affich-1044037-pb-avec-excel
Que faut-il choisir?
Bonne chance.

Salutations
Jean-Pierre
0
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
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
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
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
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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
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
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
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
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
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
zenon Messages postés 729 Statut Membre 180
 
Que c'est compliqué...

pourquoi pas passer à access?
0
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
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
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
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