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!
A voir également:
- Excel + macro
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Si ou excel - Guide
- Déplacer colonne excel - Guide
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
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
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!
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
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 !
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
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!
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
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
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
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
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 :
En principe cela fonctionne parfaitement, j'ai testé.
Bon courage et n'oubliez pas ma proposition, à vous de voir.
Salutations
Jean-Pierre
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!
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
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
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
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
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