Copie ligne excel vers nouvelle feuille et nommage de feuille

djedje44 - 19 déc. 2012 à 22:22
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 21 déc. 2012 à 13:01
Bonsoir,

J'ai pas mal parcouru le forum et trouver quelque réponse à la recopie de ligne sur une autre feuille mais mon cas est sensiblement différent et je n'ai pas trouvé la réponse n'étant pas programmeur bien qu'aimant ça et essayant d'y toucher de temps en temps (par la force des choses)
Mon besoin:
J'ai un gros fichier excel d'environ 100000 lignes trier sur la colonne B par exemple qui est un code fournisseur
J'ai donc environ 150 fournisseurs, certains représentent 10 lignes (10 articles) et d'autres 200.
J'ai besoin pour exporter plus facilement et rapidement en csv dans le but d'un import dans un logiciel de gestion de créer autant de feuille que de fournisseur et de copier chaque ligne correspondant à un fournisseur dans la feuille lui correspondant.
J'imaginais une macro de ce type (langage humain)
sélectionne tous les lignes avec la même valeur en colonne E puis copie vers nouvelle page nommée "valeur cellule colonne E"
et ainsi de suite
Je suis sou Excel 2010, si je n'ai pas posté dans le bon forum désolé, merci de me rediriger.
merci d'avance

12 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 déc. 2012 à 07:37
Bonjour,
Je suis sou Excel 2010, si je n'ai pas posté dans le bon forum désolé, merci de me rediriger.

Je vais te répondre ainsi :
Crois-tu vraiment que
Forum > VB.NET et VB 2005

(là où tu as ouvert cette discussion) a quelque chose à voir avec :
Forum > Visual Basic 6 > Langages dérivés > VBA

(là où elle aurait été à sa place)
???????

Qu'as-tu au moins tenté d'écrire ? Je ne t'aiderai personnellement qu'en voyant cet effort.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 déc. 2012 à 07:55
Une chose reste certaine :
J'ai donc environ 150 fournisseurs

et
J'ai besoin pour exporter plus facilement et rapidement en csv dans le but d'un import dans un logiciel de gestion de créer autant de feuille que de fournisseur

n'est pas du tout une solution raisonnable ni légère (un classeur de 150 feuilles !)!

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Bonjour,
Désolé pour l'emplacement du poste, n'étant pas averti je ne savais pas quel langage utilisait excel, merci de m'avoir redirigé.
Effectivement j'ai bien conscience un classeur de 150 feuilles n'est pas très souhaitable si je peux exporter directement en csv sans créer de nouvelle feuille c'est aussi bien. C'était dans un souci de visibilité car je passe par des filtres et c'est très fastidieux.
Niveau écriture j'ai juste réussi à renommer les feuilles en fonction de mon fournisseur présent en cellule E2 avec ce code:

Sub NommerOngletsNomCelluleE2()

Dim Feuille As Worksheet

For Each Feuille In Worksheets
Feuille.Name = Feuille.Range("E2").Value
Next Feuille

End Sub

En revanche pour la copie des lignes vers une nouvelle feuille ou un export direct la je suis au point de départ car je n'arrive pas à lui faire comprendre qu'a chaque changement de fournisseur il faut créer une nouvelle feuille ou faire un nouvel export.
Je ne suis pas programmeur mais ça m'intéresse alors j'essaie de comprendre et faire avec les infos qu'on me donne et je les adaptent à mon contexte mais faire un projet de toutes pièces n'est pas évident désolé.
Merci tout de même.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 déc. 2012 à 09:51
Bon...
1) J'ignore totalement ce qu'est par ailleurs ton logiciel d'importation et les possibilités qu'il t'offre.
2) J'ignore également totalement dans quoi les données récupérées vont être enregistrées

Dans de telles conditions (et bien que je devine qu'il existe une démarche plus orthodoxe, notamment si exportation vers des champs d'une base de données) je ne puis que te répondre en ce qui concerne la création de tes fichiers csv !
Je ne vois absolument pas la nécessité de créer des feuilles, puis de les exporter une après l'autre dans des fichiers csv !
Ces fichiers peuvent, comme tout fichier texte, être écrit directement. Ouvre ton aide VBA sur le mot Open (Open, instruction) et lis. Elle te permet d'écrire un fichier texte. Tu trouveras sur ce forum, par ailleurs, de nombreuses discussions relative à la lecture et/ou écriture de fichiers texte.
En ce qui concerne maintenant la lecture de tes données dans ton classeur : leur traitement sera très grandement facilité par un tri préalable sur la colonne qui importe. L'enregistreur de macros est à utiliser (il te permettra de connaître le code qui convient pour effectuer ce tri).
Il te faudra ensuite parcourir (une simple boucle For ... to ... Next) toutes les lignes de ta feuille et traiter ainsi :
- à chaque changement de valeur ===>> Fermer auparavant, si existe, le fichier ouvert précédemment (ce sera le cas à partir du 2ème fichier) . ===>> ouverture (par Open) d'un nouveau csv. ===>>> écrire dans ce fichier chaque donnée à importer
- A la toute fin ===>> fermer le dernier fichier

Voilà. Je te rappelle maintenant que ce forum n'est pas un lieu où l'on vient faire accomplir ses tâches, mais où l'on obtient une aide sur un point isolé et spécifique soulevant une difficulté précise et également isolée.
Il va donc falloir que tu te prépares à te retrousser les manches, à bûcher et à nous présenter, pour chaque difficulté isolée rencontrée en chemin, le code que tu as tenté d'écrire pour la résoudre.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0

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

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
20 déc. 2012 à 10:05
Salut

Catégorie modifiée.

La création d'un fichier CSV ne peut se faire que pour une seule feuille. Si ton classeur en comporte plusieurs, tu auras une fenêtre d'avertissement pour te signaler que seule la feuille courante fera l'objet du transfert.

Pour ma compréhension : Tu souhaites faire cet éclatement des données une seule fois, ou bien penses-tu le lancer régulièrement ?
Parce que transférer 100.000 lignes de données nécessitera du temps ...

Un fichier CSV est un fichier texte.
Tu peux utiliser le menu pour le créer, mais tu peux aussi générer toi même ce fichier en utilisant les fonctions de gestion de fichiers texte dont tu trouveras les explicatifs dans l'aide de VBA et aussi parmi les questions sur le forum ou les sources du site :
Open, Print #, Close #, plus une boucle For-Next ou Do-Loop par exemple.

Pour exporter les données d'un seul fournisseur, il te suffit de filtrer les données à exporter sur ta feuille, puis :
- d'ouvrir un nouveau fichier CSV --> Open
- de parcourir toutes les lignes de ta feuille For-Next ou Do-Loop
- de ne pas tenir compte des lignes masquées (hauteur = 0)
- d'utiliser un Print # pour chaque ligne à exporter, en utilisant le séparateur de données que tu auras choisi (point-virgule, tabulation ...)
- et enfin de refermer le fichier ainsi créé par Close #

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 déc. 2012 à 10:12
Bonjour, jack,
Hé bien : nous voilà maintenant deux à lui avoir dit à peu près la même chose.
Je vais simplement ajouter ceci : lorsqu'il sera parvenu à ses fins en bouclant directement sur les cellules, nous pourrons lui montrer comment accélérer le traitement de manière significative en bouclant sur un tableau dynamique.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Merci messieurs de vous pencher sur mon cas (désespéré?)
alors le logiciel en question est un logiciel de gestion commerciale tournant sous AS400. Via un des menus je peux faire un import d'un fichier CSV.
Tout ça fonctionne très bien bien qu'il y ai à ce stade beaucoup de manipulations pour un seul fichier, c'est assez fastidieux mais ça je ne peux pas le changer c'est pourquoi si je pouvais au moins gagner du temps sur la création des fichiers CSV ça m'aiderait.
Pour info, je suis administrateur réseau et mes connaissances en programmation sont très limitées, il y a quelques années via excel je pouvais enregistrer des macros et après je les analysais, comprenais le sens et les modifiais voir y ajoutais des choses. Hors je crois qu'on ne peux plus le faire sous Excel 2010 ou alors je n'ai pas trouver où.
Si je pouvais enregistrer une macro en mode enregistreur comme je le faisais avant j'aurais bien du code facile à modifier sauf que mon problème va résider dans le fait de dire au programme que dès que la cellule X ou Y change il faut un nouveau fichier.
J'ai déjà fait un tri par fournisseur pour qu'ils se suivent tous pour faciliter les choses et donc cnormalement même pas besoin de boucle,juste une lecture linéaire de haut en bas du fichier.
Mon fichier ressemble à ca:
A B C D E
1 FR102 peu importe
2 FR102 peu importe
3 FR102 "
4 AZ208 "
5 AZ208 "

loin de moi de vouloir du code tout fait mais juste mettre le pied à l'étrier avec un début de code surtout pour le changement à chaque différence de cellule A par exemple.
Sinon ne vous prenez pas la tête, je le ferais manuellement. Je me dis juste qu'en le faisant si le cas se reproduit je pourrais le refaire.
Merci encore
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 déc. 2012 à 13:49
Le "pied à l'étrier" t'a déjà été donné !
Une boucle for to next :
Exemple :
For i = 1 to 20
  msgbox Range("A" & i).value
next

parcourt les cellules de la colonne A, de la ligne 1 à la ligne 20 et t'en affiche le contenu
Maintenant : (à la place de 20) :
Range("A" & rows.count).end(xlup).row
te retourne le rang de la dernière ligne remplie de la colonne A
Si cela ne te permet pas de faire ta boucle : autant laisser à un développeur de ton choix le soin de continuer... hein ...
On attend que tu commences !
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
20 déc. 2012 à 15:21
Pour les nouvelles versions d'Excel (2007 et +), tu devrais avoir un onglet Développeur dans la barre "ruban".
Si tu ne l'as pas, va dans le bouton Excel en haut à gauche et va dans Options Excel. Dans la partie Standard qui s'ouvre, coche la ligne "Afficher l'onglet Développeur dans le ruban".

Tu pourras ainsi y retrouver l'enregistreur de macro...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
20 déc. 2012 à 19:04
Pour détecter s'il y a eu du changement dans les données d'une colonne :
A chaque changement dans une cellule, la procédure Worksheet_Change se déclenche (page de code de la feuille + sélection Worksheet à gauche + Change à droite)
Cette procédure te fournit l'adresse de la (les) cellule modifiée grace au paramètre Target.
Pour savoir si la cellule correspond à l'une de la colonne A, suffit d'utiliser Intersect :
    Dim oRange As Range
    Set oRange = Intersect(Target, Range("A:A"))
    If Not oRange Is Nothing Then
        MsgBox "Twingo! La cellule " & Target.Address & " appartient bien à la zone à surveiller"
    End If

Quant à mémoriser le fait qu'il y ait eu un changement :
Mon idée serait de mémoriser ça dans une cellule de la feuille (ou d'une autre), genre :
Range("D3").Value = True
Il te suffira de relire le contenu de cette cellule pour connaitre l'état des changements et, bien sûr, la remettre à False quand tu auras transféré tes données.
0
Bonjour,

Voici ce que j'ai codé:
Sub ExportCSV()
'
' ExportCSV Macro
'
' Touche de raccourci du clavier: Ctrl+w
'
ActiveSheet.Range("$A$1:$U$2277").AutoFilter Field:=3, Criteria1:="AC012"
Range("A1:U2277").Select
Selection.Copy
Application.CutCopyMode = False
ChDir "C:\Users\j.lefort\Documents\XXXX\import\21_Dec2012"
ActiveWorkbook.SaveAs Filename:= _
"C:\Users\j.lefort\Documents\XXXX\Import\AC012.csv", FileFormat:=xlCSV, _
CreateBackup:=False
ActiveWindow.LargeScroll ToRight:=-1
ActiveSheet.Range("$A$1:$U$2277").AutoFilter Field:=3
End Sub
Je vais oublier la boucle car je n'a pas les compétences mais je peux le faire à la main. En revanche j'aimerais que dans ma macro je ne sois pas obligé de renseigner mon critère de filtre mais qu'il les traitent dans l'ordre. mon 1er critère de filtre est AC012 mais je ne sais pas s'il y a une commande pour dire "premiere valeur du filtre" etc... ou je pourrais incrémenter dans une boucle.J'aimerais aussi pouvoir donner au nom du fichier csv le nom du critère de filtre.
Voila l'explication, cette macro fonctionne mais je dois la modifier à la main a chaque fois ce qui n'est pas terrible et qui me prend le même temps que de le faire mais comme j'en ai 160 en auto ce serait bien.
Merci d'avance
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 déc. 2012 à 13:01
Je ne peux que regretter que tu ne fasses pas la moindre tentative d'utilisation de boucle pour parcourir tes cellules. Et ce d'autant que je t'avais donné un exemple très simple de parcours.
Il est dès lors on ne peut plus clair que tu n'es venu ici que pour avoir un code complet, tout cuit, à copier/coller !
Or, telle n'est pas du tout la vocation de ce forum. Désolé, donc, mais je t'abandonne là personnellement.
Bonne chance.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Rejoignez-nous