Macro sous excel 2003 pour ranger les donnees

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.

A voir également:

35 réponses

ks13 Messages postés 191 Statut Membre 23
 
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?
0
lermite222 Messages postés 9042 Statut Contributeur 1 191
 
Re,
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+
0
ks13 Messages postés 191 Statut Membre 23
 
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.
0
lermite222 Messages postés 9042 Statut Contributeur 1 191
 
Il n'y a aucun problème pour donner à l'utilisateur la possibilité de sélectionner une plage, voir...
    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+
0

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

Posez votre question
ks13 Messages postés 191 Statut Membre 23
 
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)
0
lermite222 Messages postés 9042 Statut Contributeur 1 191
 
Tes explications sont, heuuu...
Tu veux connaître la première cellules non vide et la dernière de la feuille ?
0
ks13 Messages postés 191 Statut Membre 23
 
^^; 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.
0
lermite222 Messages postés 9042 Statut Contributeur 1 191
 
^^: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

0
ks13 Messages postés 191 Statut Membre 23
 
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.
0
ks13 Messages postés 191 Statut Membre 23
 
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")
0
ks13 Messages postés 191 Statut Membre 23
 
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
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.
0
lermite222 Messages postés 9042 Statut Contributeur 1 191
 
Sais pas si j'ai compris !!
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)
0
ks13 Messages postés 191 Statut Membre 23
 
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
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)
0
lermite222 Messages postés 9042 Statut Contributeur 1 191
 
Bien sûr que tu peu employer deux boucles comme tu montre et faire une comparaison
    If Cell=cell2 then ...

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)
0
ks13 Messages postés 191 Statut Membre 23
 
Je vois, bon, j'ai trouve le temps de poster ici, pour réaliser la macro, je vais prendre un peu de temps, en semaine je suis trop pris maintenant u_u. Je poste ici des que j'ai fini la 1ere version de la macro ^^

Merci encore pour ton aide
0