Macros... Grand besoin d'aide

Résolu/Fermé
Sousséyé Messages postés 20 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 21 mars 2011 - 17 mars 2011 à 17:32
Sousséyé Messages postés 20 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 21 mars 2011 - 21 mars 2011 à 18:03
Bonjour,

Je suis extrêmement novice en macros, je sais à peu près lire les codes, et plus ou moins les modifier quand j'en comprends l'objectif, mais j'en au deux à rédiger qui me semblent très difficiles.. Alors... Bouteille à la mer..

La 1/
J'ai une bdd avec entre autres 2 colonnes : "Nom" et "prénoms" (dans cet ordre)
En réalisé, la seule colonne renseignée est "Nom" où figurent le prénom suivi d'un espace puis du nom, et donc rien dans la colonne "prénoms"
J'aimerais les splitter, et j'ai plus ou moins récupéré des codes sur des forums, mais ça ne marche toujours pas.
Dans le doute que la macro ne reconnaisse pas le 1er espace avec lequel je veux splitter, j'ai réussi à le transformer en "3" pour ensuite pouvoir couper mais ça ne marche pas.
ça donne quelque chose comme :
"Sub Bouton2_Clic()
Dim i, derlig As Integer
derlig = Range("B65536").End(xlUp).Row
Sheets("Feuil1").Columns("B:B").Replace " ", "3"
For i = 1 To derlig
Cells(i) = Right(Cells(i), Len(Cells(i)) - InStr(Cells(i), "3"))
Next
End Sub"

Pour info, une bonne partie des lignes est vide, et il faut qu'elles le restent, alors il ne faut pas que cela s'applique sur des lignes vides.

la 2/ J'ai une ligne par fournisseur, et plusieurs colonnes censées comprendre des montants.
Certains de ses montants sont négatifs.
J'ai besoin que ma macro remplace les montants négatifs par des 0.
Ensuite, si pour cette même ligne, il n'y a aucun autre montant, il faut que je supprime la ligne.. Alors là autant dire que je suis complètement paumée...

Quelqu'un peut aider ?
Sandrine

5 réponses

Mike-31 Messages postés 18320 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 20 juin 2024 5 085
Modifié par Mike-31 le 17/03/2011 à 18:42
Salut,

Pourquoi ne pas utiliser simplement la fonction convertir pour séparer le nom du prénom (Données/Convertir).

Au passage qu'elle est ta version excel
A+
Mike-31

Une période d'échec est un moment rêvé pour semer les graines du savoir.
0
Sousséyé Messages postés 20 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 21 mars 2011
17 mars 2011 à 18:14
Salut,

Pour le traitement de ces bases de données, on est partis sur un principe de macros. Il y'en a déjà un tas, que j'essaye de compléter par les 2 décrites plus haut.
Je suis actuellement sur 2007 mais elles seront utilisées sur 2003.
Sinon, pour la fonction Convertir, je viens d'essayer de l'utiliser pour enregistrer 1 macro, mais le code est trop complexe pour moi à adapter, et surtout pour les noms composés ça ne marche pas (Ex : Nath De la XXX) -> ça splittera en 4, alors que je veux juste splitter au niveau du 1er espace, et ensuite inverser en mettant le nom sur la 1ere colonne et le prénom sur la 2ème....

Merci quand même
Sandrine
0
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 354
17 mars 2011 à 18:17
Pas besoin de macro.

Soit en A2 "Nom Prénom"
Vous insérez 2 colonnes après la A (soit B et C).
Pour avoir le nom en B2, copier/coller cette formule :
=GAUCHE(A2;CHERCHE(" ";A2)-1)
Pour avoir le Prénom en C2, copier/coller cette formule :
=DROITE(A2;NBCAR(A2)-CHERCHE(" ";A2))

Michel
0
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 354
17 mars 2011 à 18:23
Et pour les lignes vides il faut alors vérifier la condition avant d'écrire le résultat.
Les formules deviennent :
=SI(ESTTEXTE(A2;)GAUCHE(A2;CHERCHE(" ";A2)-1);"")
=SI(ESTTEXTE(A2);DROITE(A2;NBCAR(A2)-CHERCHE(" ";A2));"")

Formules à recopier ensuite dans les cellules suivantes.

Michel
0
Mike-31 Messages postés 18320 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 20 juin 2024 5 085
Modifié par Mike-31 le 17/03/2011 à 21:42
Re,

Dans le domaine du VBA, suivant tes explications, en colonne A tu as le Prénom suivi d'un espace et le Nom, tu souhaites laisser en A le Nom et le prénom en B

regarde ce code

Sub séparateur_De_Mots()
For L = 2 To [A65536].End(xlUp).Row ' Application de la ligne 2 à la dernière ligne non vide
Mot1Mot2 = Cells(L, "A") ' Colonne de référence, ici A
I = InStr(Mot1Mot2, " ") ' recherche 1' espace entre les mots
If I = 0 Then ' Si aucun espace trouvé dans une cellule
Cells(L, "B") = Cells(L, "A") ' Reporte le mot en B
Else ' Si espace entre mot
Cells(L, "B") = Left(Mot1Mot2, I - 1) ' Premier mot isolé en B
Cells(L, "A") = Mid(Mot1Mot2, I + 1) ' deuxième mot mot isolé en C
End If
Next
End Sub

A+
Mike-31

Une période d'échec est un moment rêvé pour semer les graines du savoir.
0
Sousséyé Messages postés 20 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 21 mars 2011
17 mars 2011 à 22:45
Salut, merci beaucoup. En fait, je suis obligée de faire des macros. Ce n'est pas moi qui utiliserai le fichier après, mais des gens qui auront juste à cliquer le bouton, donc je suis un peu coincée avec ça.
Je vais regarder le code que tu as proposé demain, je n'ai plus accès à mon fichier, mais si tu as la patience, pourras-tu me dire ce qui cloche dans celui que j'ai mis plus haut ?
Et sinon, aurais-tu des pistes pour la 2ème macro ?

Merci beaucoup pour ton aide !
Sandrine
0
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 354
18 mars 2011 à 08:24
Effectivement, pourquoi faire simple quand on peut faire compliqué.

Concernant la macro proposée par Mike-31, il y a je pense une petite erreur dans le cas ou il n'y a pas d'espace, ou du moins il y a un doute concernant l'interprétation qu'on peut en faire.

En effet, s'il n'y a pas d'espace et qu'on considère que c'est un nom, il n'est donc pas nécessaire de renvoyer la donnée de A vers B. Le code est à modifier comme ceci :

I = InStr(Mot1Mot2, " ") ' recherche 1' espace entre les mots
If I > 0 Then ' Si un espace est trouvé dans une cellule
Cells(L, "B") = Left(Mot1Mot2, I - 1) ' Premier mot isolé en B
Cells(L, "A") = Mid(Mot1Mot2, I + 1) ' deuxième mot isolé en A
End If
Next

Dans cette configuration, le fait de relancer à nouveau la macro n'influe pas sur le résultat.

Si par contre il ne s'agit que d'un prénom (peu probable mais pourquoi pas), le code est correct, mais il faut alors effacer la cellule A. Le code est à modifier comme ceci :

I = InStr(Mot1Mot2, " ") ' recherche 1' espace entre les mots
If I = 0 Then ' Si aucun espace trouvé dans une cellule
Cells(L, "B") = Cells(L, "A") ' Reporte le mot en B
Cells(L, "A").Clear ' Efface la cellule en A
Else ' Si espace entre mot 
etc....

Mais là, prudence car que ce soit avec le code proposé par Mike-31 ou celui ci-dessus, le fait de relancer une deuxième fois la macro va remplacer les prénoms par les noms, et de plus avec le code ci-dessus, effacer la colonne A. Je vous conseille donc de mettre un flag pour interdire une deuxième exécution de la macro.

Michel
0
Mike-31 Messages postés 18320 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 20 juin 2024 5 085
18 mars 2011 à 08:48
Salut Mic,

effectivement s'il n'y a pas d'espace le code ne marche pas, il est possible que le nom et prénom soit séparé par un tiret ou chaque mot commence par une majuscule et on peut compléter le code suivant le cas.
En ce qui concerne la répétition accidentelle du code on peut ajouter un détrompeur qui arrêtera le code
enfin à suivre ...

Cordialement
0

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

Posez votre question
Sousséyé Messages postés 20 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 21 mars 2011
18 mars 2011 à 11:10
Salut,

Merci beaucoup à tous les 2.
En gros, je n'ai pas réussi à flagger, mais du coup j'ai fait 2 macros différentes :
La 1ère c'est la macro de Mike-31 avec la 1ère correction de Mic.

ça donne ça :
Sub Bouton3_Clic()
For L = 4 To [B65536].End(xlUp).Row ' Application de la ligne 4 à la dernière ligne non vide
Mot1Mot2 = Cells(L, "B") ' Colonne de référence, ici la colonne B
I = InStr(Mot1Mot2, " ") ' recherche 1' espace entre les mots
If I > 0 Then ' Si un espace est trouvé dans une cellule
Cells(L, "C") = Left(Mot1Mot2, I - 1) ' Premier mot isolé en colonne C
Cells(L, "B") = Mid(Mot1Mot2, I + 1) ' deuxième mot isolé en colonne B
End If
Next
End Sub

Comme je n'ai pas réussi à flagger, et qu'effectivement un nom composé déplacé par une 1ère exécution en colonne B, effacer le prénom de la colonne C, j'ai fait raccourci qui élimine les espaces restants dans la colonne B :

Sub Bouton4_Clic()
For L = 4 To [B65536].End(xlUp).Row
Cells(L, "B").Replace " ", "" 'Elimine les espaces (noms composés) restant dans la colonne B (NOM
Next
End Sub

ça semble bien marcher, alors encore un grand merci pour votre aide. Je ne m'en serais pas sortie autrement.
Sandrine
0
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 354
18 mars 2011 à 11:33
Pourquoi faire 2 opérations ?

If I > 0 Then ' Si un espace est trouvé dans une cellule
Cells(L, "C") = Left(Mot1Mot2, I - 1) ' Premier mot isolé en colonne C
Cells(L, "B") = Mid(Mot1Mot2, I + 1) ' deuxième mot isolé en colonne B
Cells(L, "B").Replace " ", "" 'Elimine les espaces (noms composés) restant dans la colonne B (NOM 
End If 


Michel
0
Ok, vais tester ça et te tiens au courant.
Merci encore
0
Sousséyé Messages postés 20 Date d'inscription jeudi 27 mai 2010 Statut Membre Dernière intervention 21 mars 2011
21 mars 2011 à 18:03
ça marche ! Super :)
Merci beaucoup
0