Excel + macro
loic
-
purrofixe Messages postés 490 Date d'inscription Statut Membre Dernière intervention -
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!
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
-
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 -
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-
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!
-
-
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-
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 !
-
-
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-
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!
-
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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 -
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 -
Bonsoir loic,
S'il vous plait, environ combien de nom de ville?
Merci.
Salutations
Jean-Pierre -
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 -
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-
-
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!
-
-
-
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-
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.- 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
-
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
-