Macro sous excel 2003 pour ranger les donnees
ks13
Messages postés
191
Statut
Membre
-
ks13 Messages postés 191 Statut Membre -
ks13 Messages postés 191 Statut Membre -
Bonjour,
j'ai commence a travailler dans une nouvelle entreprise recemment, et apres le tour des differents postes, j'ai remarque que la gestion des adresses e-mail se fait manuellement. Apres quoi on m'a demande de trouver une macro pour faciliter le travail.
La 1ere partie du travail de nettoyage des adresses consiste a separer les adresses e-mail des noms et prenoms, le contenu d'une cellule et comme suit : "Nom Prenom <nomprenom@fournisseur.com>" (il n'y a pas d'aiguillements et et l'adresse mail est toujours entre < et >. Aussi, des fois quand la personne en charge copie les adresses -mail de l'e-mail envoye par un vendeur elles sont rangees toutes dans une ligne (ex. 1ere adresse ligne 1 colonne 1, 2eme adresse ligne 1 colonne 2 etc). Le but de la macro est de ranger les adresse verticalement (si il y a besoin) et de serparer les adresses mail des noms et prenoms. Au final il devrais y avoir 2 colonnes : la 1ere pour les adresses mail sans les signes < et > et la 2eme contenant les noms et prenoms (si il y en a, car les personnes les envoyant oublient des fois de mettre le nom et le prenom.
La 2eme partie du travail consistera a realiser 2 listes d'adresses mail dans la meme forme que pour la tache precedente (Colonne 1 adresses mail, colonne 2 noms et prenoms). Le fichier comporte autant de feuilles que de personnes donnant les adresses mails (ce sont les vendeurs qui les ajoutent, pas les clients) plus 2 feuilles : Nouvelles (pour les adresses ajoutees depuis la derniere modification du fichier) et Toutes (la liste complete de toutes les adresses depuis la creation du fichier). Si possible, aussi verifier que l'adresse e-mail de la cellule a un format correct (des fois il y a des virgules a la fin, ce qui fausse la recherche des doublons)
La derniere partie (enfin ^^;) consistera a ranger les adresses par odre alphabetique et effacer les doublons (de preference la ligne n'ayant pas le nom et le prenom car certains doublons n'ont rien dans la 2eme colonne et leur copie si). Au pire, il suffirait de changer la couleur des cellules doublons pour etre visibles facilement.
Alors, cela en fait du boulot. Autre precision, le fichier pour la 1ere partie et le fichier pour la 2eme et 3eme partie ne sont pas les memes, car la personne copie d'abord les adresses depuis l'e-mail recu par un vendeur, puis les met en forme, et ensuite les ajoute au fichier contenant toutes les adresses mail (ce sont ces adresses qui vont dans la feuille des nouvelles adresses).
Mon majeur probleme c'est que je n'ai pas assez de notions en basic pour faire 2-3 macros faisant cela. Je crois me souvenir qu'on pouvais faire reference a des donnees dans une autre feuille excel, donc je pense que la 1ere macro pourrais ajouter les nouvelles adresses dans le fichier principal, apres quoi la 2eme macro finira le travail. Le probleme ici c'est que dans la version 2003 d'excel il n'y a pas de fonction automatique pour virer les doublons, presente dans la version 2007 ou superieur.
La raison du besoin de cette macro c'est la grande quantitee d'adresses a traiter (a ce jour pres de 19000 adresses stockees).
Je sais que cela fait un mur de mots pas tres agreable a lire, mais j'ai essaye de mettre plus ou moins tout ce qu'on attends de la macro. Toutes les suggestions sont bienvenues :)
PS : j'ajouterais bien un fichier d'exemple mais je n'ai plus l'adresse du site ou on peut uloader gratuitement des fichiers, si quelqu'un l'a, ce serait gentil de me le rappeler.
j'ai commence a travailler dans une nouvelle entreprise recemment, et apres le tour des differents postes, j'ai remarque que la gestion des adresses e-mail se fait manuellement. Apres quoi on m'a demande de trouver une macro pour faciliter le travail.
La 1ere partie du travail de nettoyage des adresses consiste a separer les adresses e-mail des noms et prenoms, le contenu d'une cellule et comme suit : "Nom Prenom <nomprenom@fournisseur.com>" (il n'y a pas d'aiguillements et et l'adresse mail est toujours entre < et >. Aussi, des fois quand la personne en charge copie les adresses -mail de l'e-mail envoye par un vendeur elles sont rangees toutes dans une ligne (ex. 1ere adresse ligne 1 colonne 1, 2eme adresse ligne 1 colonne 2 etc). Le but de la macro est de ranger les adresse verticalement (si il y a besoin) et de serparer les adresses mail des noms et prenoms. Au final il devrais y avoir 2 colonnes : la 1ere pour les adresses mail sans les signes < et > et la 2eme contenant les noms et prenoms (si il y en a, car les personnes les envoyant oublient des fois de mettre le nom et le prenom.
La 2eme partie du travail consistera a realiser 2 listes d'adresses mail dans la meme forme que pour la tache precedente (Colonne 1 adresses mail, colonne 2 noms et prenoms). Le fichier comporte autant de feuilles que de personnes donnant les adresses mails (ce sont les vendeurs qui les ajoutent, pas les clients) plus 2 feuilles : Nouvelles (pour les adresses ajoutees depuis la derniere modification du fichier) et Toutes (la liste complete de toutes les adresses depuis la creation du fichier). Si possible, aussi verifier que l'adresse e-mail de la cellule a un format correct (des fois il y a des virgules a la fin, ce qui fausse la recherche des doublons)
La derniere partie (enfin ^^;) consistera a ranger les adresses par odre alphabetique et effacer les doublons (de preference la ligne n'ayant pas le nom et le prenom car certains doublons n'ont rien dans la 2eme colonne et leur copie si). Au pire, il suffirait de changer la couleur des cellules doublons pour etre visibles facilement.
Alors, cela en fait du boulot. Autre precision, le fichier pour la 1ere partie et le fichier pour la 2eme et 3eme partie ne sont pas les memes, car la personne copie d'abord les adresses depuis l'e-mail recu par un vendeur, puis les met en forme, et ensuite les ajoute au fichier contenant toutes les adresses mail (ce sont ces adresses qui vont dans la feuille des nouvelles adresses).
Mon majeur probleme c'est que je n'ai pas assez de notions en basic pour faire 2-3 macros faisant cela. Je crois me souvenir qu'on pouvais faire reference a des donnees dans une autre feuille excel, donc je pense que la 1ere macro pourrais ajouter les nouvelles adresses dans le fichier principal, apres quoi la 2eme macro finira le travail. Le probleme ici c'est que dans la version 2003 d'excel il n'y a pas de fonction automatique pour virer les doublons, presente dans la version 2007 ou superieur.
La raison du besoin de cette macro c'est la grande quantitee d'adresses a traiter (a ce jour pres de 19000 adresses stockees).
Je sais que cela fait un mur de mots pas tres agreable a lire, mais j'ai essaye de mettre plus ou moins tout ce qu'on attends de la macro. Toutes les suggestions sont bienvenues :)
PS : j'ajouterais bien un fichier d'exemple mais je n'ai plus l'adresse du site ou on peut uloader gratuitement des fichiers, si quelqu'un l'a, ce serait gentil de me le rappeler.
A voir également:
- Macro sous excel 2003 pour ranger les donnees
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Liste déroulante excel - Guide
- Trier des données excel - Guide
- Word et excel gratuit - Guide
- Si ou excel - Guide
35 réponses
Salut, j'ai besoin d'une explication sur comment pointer vers differentes feuilles d'un classeur dans une macro. Je voudrais faire une macro qui selectionne des donees de la feuille 1 et les copie dans la feuille 2 en fonction des donnees de la feuille 3.
Concretement, la macro doit prendre une liste de factures, de la feuille 1, comparer les numeros de facture avec celle de la feuille 3 et copier celles qui repondent aux criteres dans la feuille 2. Je sais comment comparer les donees, et les copier, mais je ne sais pas comment pointer les differentes feuilles. J'ai recherche dans l'aide mais ce n'est pas explique tres clairement. Quelqu'un aurait une explication plus claire a me donner?
Concretement, la macro doit prendre une liste de factures, de la feuille 1, comparer les numeros de facture avec celle de la feuille 3 et copier celles qui repondent aux criteres dans la feuille 2. Je sais comment comparer les donees, et les copier, mais je ne sais pas comment pointer les differentes feuilles. J'ai recherche dans l'aide mais ce n'est pas explique tres clairement. Quelqu'un aurait une explication plus claire a me donner?
Re,
Tu ne donne aucun détail, un exemple faisant appel à trois feuilles
A+
Tu ne donne aucun détail, un exemple faisant appel à trois feuilles
Sub BF()
Dim Lig As Long
'Va de la ligne 4 à la dernière ligne de la feuille 1, colonne A
With Sheets("Feuil1")
For Lig = 4 To .Range("A65535").End(xlUp).Row
If .Cells(Lig, "A") = Sheets("Feuil1").Cells(Lig, "C") Then
Sheets("Feuil3").Cells(Lig, "B") = Sheets("Feuil1").Cells(Lig, "C")
End If
Next Lig
End Sub
A+
Re, comme toujours, merci de ton aide lermite. Une question m'est venue a l'esprit apres avoir lu le code : est-ce qu'il y a un moyen de donner a la macro une reference de plage relative, c'est à dire, lui dire de lire depuis la 1ere cellule contenant une valeur, jusqu'a la derniere cellule contenant une valeur. Par xemple, on a un tableau de C2 a F10, mais dependant des jours, la taille du tableau pourrais changer, donc le jour suivant le tableau pourrais etre de B3 a D5. Je cherche une methode de selection grace a laquelle l'utilisateur ne sera plus oblige de commencer a entrer les donnees a A1, mais ou il veut.
Il n'y a aucun problème pour donner à l'utilisateur la possibilité de sélectionner une plage, voir...
Est-ce que la plage est dépendante de date ou de jour ? Si oui, vaudrait mieux faire une table des plages en fonction des jours, c'est qu'une piste vu que je n'ai pas plus de renseignement.
A+
Application.InputBox 'Voir ton aide
Est-ce que la plage est dépendante de date ou de jour ? Si oui, vaudrait mieux faire une table des plages en fonction des jours, c'est qu'une piste vu que je n'ai pas plus de renseignement.
A+
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Ah, je crois que je me suis mal exprime, je ne pensais pas a demander la plage a l'utilisateur, mais faire en sorte que la macro la selectionne toute seule, en fonction des champs contenant des valeurs. Un peu comme avec
For Lig = 4 To .Range("A65535").End(xlUp).Row sauf qu'il ne selectionnera qu'un carre dont le coin gauche superieur sera la 1ere celule la plus proche de A1 et le coin inferieur droit la celule la plus eloignee de A1 (diagonalement bien sur)
Tes explications sont, heuuu...
Tu veux connaître la première cellules non vide et la dernière de la feuille ?
Tu veux connaître la première cellules non vide et la dernière de la feuille ?
^^; Alors, la macro que je voudrais faire, elle doit verifier les references donnees, les comparer avec celles de la Feuil3 et copier celles qui correspondent dans la Feuil2 comme je l'ai ddeja explique. Le probleme c'est que les donnees de la 1ere page ne commencent pas obligatoirement a la Colonne A ligne 1, car c'est en general un copier coller d'un programme de gestion sur un site internet. Donc souvent les 2-3 premieres colonnnes, contiennet des cases a cocher, qu'on vire avec le collage special, ce qui laisse ces colonnes vides. Je sais c'est facile de supprimmer ces colonnes manuellement, mais je souhaite les laisser pour eviter les decalage entre les vielles donnees et les nouvelles. Donc, le but de la macro c'est qu'lle voit par elle meme ou commencent les donnees et ou elle se terminent, pour faire l'operation que sur ces cellules. Le but de cette automatisation etant d'eviter de demander a l'utilisateur de selectionner des plages enormes de donnees a chaque utilisation de la macro.
^^:D Tout ça pour répondre Oui !! :D
Dim A, C, L
Dim Plage As Range
Set Plage = UsedRange 'la plage qui contient des données
A = UsedRange.Address 'L'adresse de la plage
C = UsedRange.Column 'La première colonne
L = UsedRange.Row 'La première ligne
Super, merci encore lermite. Malheureusement aujourd'hui je dois verifier les catalogues des produits et je n'aurais pas le temps d'assembler la macro, mais je le ferais des que je pourrais et je posterais les resultats ici.
Re, je crois avoir trouvé une conspiration virtuelle dirigée contre moi. Plus ca avance et moins ca va : j'ai cree un systeme de referencement pour les catalogues de facon a ce qu'il y ait 2 listes de references a comparer pour verifier l'etat des produits, mais le probleme c'est que l'une des listes est en format texte (ce stupide programme de gestion a l'ancienne qui exporte tous les details en format texte, meme si ce sont des references produit). Donc, je voudrais savoir y a t il un moyen de reconvertir ces references en format texte, en numeros (il n'y a que des chiffres dans les references)? Ou sinon, y a t'il un autre moyen de comparer les 2 listes? Jusque la j'utilisais la formule suivante :
=SI(EQUIV(A:A;D:D;0)=LIGNE(); "Manquant"; "Ok")
Re, c'est encore moi, désolé de pas avoir poste ici depuis un moment, sans changer le post en "résolu" mais je pensais revenir. Le contre était un petit retard sur les travaux dans l'entreprise (que j'ai rattrapé) et un petit déclin de santé (rien de bien méchant). En bref, je n'ai aps encore fini ici.
Donc, j'ai commence une autre macro en utilisant pas mal de choses qui ont été postées ici, mais avant tout j'ai un problème au niveau du pointeur dans la plage :
En utilisant
Comment pourrais-je savoir ou est le pointeur si je voudrais comparer, par exemple, la valeur de la cellule actuelle avec la valeur de la cellule qui est juste a sa droite, ou une cellule, de même adresse, sur une autre feuille?
Pour l'explication, j'essaye de faire une macro qui va vérifier les références dans les plages de différentes feuilles (d'où ma question sur les feuilles plus haut) et afficher certaines statistiques en fonction des résultats. Pour cela j'ai crée une nouvelle feuille qui contient, par colonne, différentes données. La lise qui suit est juste un exemple :
Colonne 1 : Liste des références a chercher,
Colonne 2 : Type de recherche (pour le moment cette partie ne sera pas implémentée)
Colonne 4 : Liste des Onglets (c'est une liste des feuilles disponibles pour la recherche)
Colonne 7 : Present Base de donnes
Colonne 8 : Present Site
Colonne 9 : Present Catalogue
Colonne 10 : Page Catalogue
Pour le moment la macro en fera que donner la valeur de la cellule trouvée (pour vérification manuelle des résultats), ensuite ou la référence a été trouvée.
Le but est d'avoir les résultats dans la même ligne que la référence de la colonne 1. Mais les références des autres feuilles ne sont pas obligatoirement sur la même ligne, d'où mon intérêt de savoir ou se trouve le pointeur. Ou alors y a t il un moyen d'utiliser les plages comme un ensemble sans avoir besoin de vérifier la position du pointeur a chaque fois? En se basant sur
de ton post plus haut mais en utilisant un double For
Je ne crois pas que ce bout de code marcherais, mais j'essaye d'expliquer ce que je cherche a faire ^^
En résumé, j'essaye d'afficher la valeur d'une cellule de la colonne 2 ou même 3 d'une des feuilles disponibles sur la feuille de recherche, qui est a la même ligne que la référence correspondant a la référence recherchée actuelle.
Arf, tout ce texte pour cela....j'espère ne pas trop vous ennuyer avec mes problemes.
Donc, j'ai commence une autre macro en utilisant pas mal de choses qui ont été postées ici, mais avant tout j'ai un problème au niveau du pointeur dans la plage :
En utilisant
For Each Cell In Range
Comment pourrais-je savoir ou est le pointeur si je voudrais comparer, par exemple, la valeur de la cellule actuelle avec la valeur de la cellule qui est juste a sa droite, ou une cellule, de même adresse, sur une autre feuille?
Pour l'explication, j'essaye de faire une macro qui va vérifier les références dans les plages de différentes feuilles (d'où ma question sur les feuilles plus haut) et afficher certaines statistiques en fonction des résultats. Pour cela j'ai crée une nouvelle feuille qui contient, par colonne, différentes données. La lise qui suit est juste un exemple :
Colonne 1 : Liste des références a chercher,
Colonne 2 : Type de recherche (pour le moment cette partie ne sera pas implémentée)
Colonne 4 : Liste des Onglets (c'est une liste des feuilles disponibles pour la recherche)
Colonne 7 : Present Base de donnes
Colonne 8 : Present Site
Colonne 9 : Present Catalogue
Colonne 10 : Page Catalogue
Pour le moment la macro en fera que donner la valeur de la cellule trouvée (pour vérification manuelle des résultats), ensuite ou la référence a été trouvée.
Le but est d'avoir les résultats dans la même ligne que la référence de la colonne 1. Mais les références des autres feuilles ne sont pas obligatoirement sur la même ligne, d'où mon intérêt de savoir ou se trouve le pointeur. Ou alors y a t il un moyen d'utiliser les plages comme un ensemble sans avoir besoin de vérifier la position du pointeur a chaque fois? En se basant sur
Dim A, C, L
Dim Plage As Range
Set Plage = UsedRange 'la plage qui contient des données
A = UsedRange.Address 'L'adresse de la plage
C = UsedRange.Column 'La première colonne
L = UsedRange.Row 'La première ligne
de ton post plus haut mais en utilisant un double For
For Each Cell In Plage1
For Each Cell2 In Plage2
If Cell = Cell2 Then
CellBD.Column = Cell2. Column +1
CellBD.Row = Cell2.Row +1
Je ne crois pas que ce bout de code marcherais, mais j'essaye d'expliquer ce que je cherche a faire ^^
En résumé, j'essaye d'afficher la valeur d'une cellule de la colonne 2 ou même 3 d'une des feuilles disponibles sur la feuille de recherche, qui est a la même ligne que la référence correspondant a la référence recherchée actuelle.
Arf, tout ce texte pour cela....j'espère ne pas trop vous ennuyer avec mes problemes.
Sais pas si j'ai compris !!
Mais voilà quelque pistes.
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
Mais voilà quelque pistes.
Sub VoirCellule()
Dim Cel As Range, Plage As Range
Set Plage = Range("B1:B50")
For Each Cel In Plage
MsgBox Cel.Offset(0, 1) '1ère colonne à droite
MsgBox Cel.Offset(0, 2) '2ièm colonne à droite
'etc..
'La même cellule sur une autre feuille
MsgBox Sheets("feuil2").Range(Cel.Address)
'La même sur autre classeur
MsgBox Workbooks("LeNomClasseur.xls").Sheets("Feuil1").Range(Cel.Address)
Next
End Sub
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
Oh, merci de ta reponse toujours aussi rapide et precise ^^.
Mais il y a un petit truc dont je voudrais m'assurer, dans mon exemple j'ai mis
En fait ce a quoi je pensais c'etait faire 2 boucles :
La 1ere qui va de la 2eme ligne (la 1ere ligne a contiens les noms des colonnes) jusqu'a la derniere ligne utilisee de la 1ere colonne de la Feuille 1.
La 2eme boulce qui va de la 2eme ligne a la derniere ligne utilisee des feuilles a comparer (feuille avec les ref base de donnees, feuille avec les ref site, feuilles avec les refs catalogues, tout cela est sur plusieures feuilles differentes)
Ton exemple est correct pour quand j'aurais une correspondance, mais jevoudrais savoir si je peut lancer 2 boucle comme dans mon exemple ou si il y a un autre moyen de faire cela en basic? (j'ai l'habitude de php ou on peut imbriquer pas mal de boucles les unes dans les autres)
Mais il y a un petit truc dont je voudrais m'assurer, dans mon exemple j'ai mis
For Each Cell in Plage1
For Each Cell2 in Plage2
En fait ce a quoi je pensais c'etait faire 2 boucles :
La 1ere qui va de la 2eme ligne (la 1ere ligne a contiens les noms des colonnes) jusqu'a la derniere ligne utilisee de la 1ere colonne de la Feuille 1.
La 2eme boulce qui va de la 2eme ligne a la derniere ligne utilisee des feuilles a comparer (feuille avec les ref base de donnees, feuille avec les ref site, feuilles avec les refs catalogues, tout cela est sur plusieures feuilles differentes)
Ton exemple est correct pour quand j'aurais une correspondance, mais jevoudrais savoir si je peut lancer 2 boucle comme dans mon exemple ou si il y a un autre moyen de faire cela en basic? (j'ai l'habitude de php ou on peut imbriquer pas mal de boucles les unes dans les autres)