Rox74
Messages postés30Date d'inscriptionmercredi 9 avril 2008StatutMembreDernière intervention10 février 2011
-
14 avril 2008 à 14:47
Rox74
Messages postés30Date d'inscriptionmercredi 9 avril 2008StatutMembreDernière intervention10 février 2011
-
16 avril 2008 à 09:19
Bonjour tout le monde,
Je suis débutant et j’aurai besoin d’un peu de votre aide s’il vous plait.
Voila mon problème :
J’ai une très grande liste de mot dans une feuille 1, ses mots sont écrits avec des accents ou des c cédilles.
Et j’aimerais les écrire sans accents ni c cédilles sur une deuxième feuille.
En cherchant un peu, j’ai vu que l’on pouvait utiliser la fonction « remplace » pour remplacer des lettres donc j’ai écrit un code pour une lettre (« é » devenant « e ») mais j’aimerai un peu d’aide pour qu’il s’adapte à tout les accents et c cédille.
Quelqu’un a-t-il une idée ou une voie vers laquelle m’orienter ??
Merci d’avance
Rox
Voila mon code :
Private Sub CommandButton2_Click()
Dim MC As Range ' Cellule Courante pour stockage dans la feuille principale.
Dim MC2 As Range ' Cellule Courante 2 pour stockage dans la feuille principale.
Worksheets("feuil1").Activate ' utilisation de la feuille 1
Worksheets("feuil2").Activate ' utilisation de la feuille 2
Set MC = Worksheets("feuil1").Range("A10") ' Attribue la cellule "A10" de la feuille1 a ma cellule courante.
Set MC2 Worksheets("feuil2").Range("A10") ' Attribue la cellule "A10" de la feuille <?xml:namespace prefix st1 ns = "urn:schemas-microsoft-com:office:smarttags" /??><st1:metricconverter w:st="on" productid="2 a">2 a</st1:metricconverter> ma cellule courante.
i = 0
j = 0
Do While Worksheets("feuil2").Range("A9").Value <= 336526 'Execute la boucle jusqu'a ce que la cellule A9 de la feuille 2 affiche 336526
If i 65527 Then j j + 1 ' Si i à la valeur 65527 (derniere ligne de la colonne+1) alors décalage d'une colonne.
If i 65527 Then i 0 ' Si i à la valeur 65527 (derniere ligne de la colonne+1) alors i recommence a 0.
MC2.Offset(i, j).Value = Replace((MC.Offset(i, j).Value), "é", "e") ' La cellule décalé de i lignes et de j colonnes par rapport à la cellule MC2 prend la valeur de la cellule décalé de i lignes et de j colonnes par rapport à la cellule MC avec remplacement des "é" par des "e"
i = i + 1 'l'ancienne valeur de i se voit augmentée de 1 pour le passage de boucle suivant
Worksheets("feuil2").Range("A9").Value = ((j * 65526) + i) 'Affiche dans la cellule A9 de la feuille 2 le nombre de mots à transferer,ce qui permet de faire la condition pour sortir de la boucle
Loop 'renvoit à la ligne "Do.." , permet de faire une boucle
End Sub
A voir également:
Remplacement des caractères d'un mot par des autres
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 15 avril 2008 à 15:26
Re,
Mais si tu possède s
Private Function sansAccents(ByRef s
As String) As String
Il est éctit dans la déclaration de la fonction
la fonction NE DOIT PAS ETRE MODIFIER
. laisses la telle qu'elle est, elle fonctionne très bien.
Maintenant revenons à ton problème. Regarde ce que fait ce code en mettant un bouton sur une feuille excel et en double cliquant dessus
' Définition de la conversion
'Constante représentant les lettre à rechercher (seront remplacer)
Const accent As String = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÌÍÎÏìíîïÙÚÛÜùúûüÿÑñÇç"
'Constante représentant les lettre qui devront remplacer celles ci dessus
Const noAccent As String = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeIIIIiiiiUUUUuuuuyNnCc"
Private Function sansAccents(ByRef s As String) As String
Dim i As Integer
'String * 1 : une chaine composée de 1 caractere
Dim lettre As String * 1
Dim NewLettre As String * 1
sansAccents = s
'pour i = 1 jusqu'a la longueur de la
'constante accent
For i = 1 To Len(accent)
lettre = Mid$(accent, i, 1)
'Si on retrouve la lettre extraite dans
'la chaine à traiter
If InStr(sansAccents, lettre) > 0 Then
'on extrait de la constante noaccent le caractere qui remplacera l'ancien
'NOTE: il doit se trouver à la meme place dans la constante
'que le caractere trouve
NewLettre = Mid$(noAccent, i, 1)
'effectue le remplacement
sansAccents = Replace(sansAccents, lettre, NewLettre)
End If
Next i
End Function<hr />
'le bouton s'appelle CommandButton1 et est placé sur Feuil1
Private Sub CommandButton1_Click()
'Ce code va placer :
'- dans A1 la feuille appelé feuil2 le contenu de A1 de feuil1 mais sans accent
'- dans A2 la feuille appelé feuil2 le contenu de A2 de feuil1 mais sans accent
'.....
'- dans A20 la feuille appelé feuil2 le contenu de A20 de feuil1 mais sans accent
Dim i As Integer
For i = 1 To 20
'- CE QUI T'INTERESSE C'EST LA LIGNE SUIVANTE
Worksheets("Feuil2").Range("A" & CStr(i)).Value = sansAccents(Worksheets("Feuil1").Range("A" & CStr(i)).Value)
Next
End Sub<hr />, ----
Ju£i?n</italique>
Pensez: Réponse acceptée
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 14 avril 2008 à 14:57
Salut,
(j'ai pas l'impression que ca va t'aider mais bon.)
Soit tu fais une boucle ou tu enchaines les Replaces avec Chr(X) ou X est la valeur de la boucle, mais le problème c'est qu'il faut tester X pour savoir par quoi remplacer.
Sinon il y a peu etre :
- Une fonction Excel qui supprime les accents.
- Une manière de le faire plus facilement avec des explression régulières.
(c est pas méchant mais MERCI de chercher un peu la prochaine fois, ou bien alors de dire ce que tu as déjà essayé)
@+: Ju£i?n Pensez: Réponse acceptée
Rox74
Messages postés30Date d'inscriptionmercredi 9 avril 2008StatutMembreDernière intervention10 février 2011 14 avril 2008 à 17:40
Re,
merci d'avoir fait attention à ma demande.
J'avais aperçu ce code hier mais comme je n'y comprenais rien et que de mon coté je n'avais fait aucun code pour le changement de feuille je l'avais mis de coté puis oublié.
Merci de me l'avoir remis en tête mais mon problème ne change pas vu que je ne comprends pas le code.
Vous pouvez m'aider un peu pour qu'il convienne à mon problème??
J’ai essayé de modifier votre code mais sans résultat mon PC travail mais n’affiche rien (planté)
Code modifié, ce que j’ai compris et ce que je n’ai pas compris en commentaire :
Private Sub CommandButton2_Click()
<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
Const accent As String = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÌÍÎÏìíîïÙÚÛÜùúûüÿÑñÇç"
‘chaine de lettre a remplacer
Const noAccent As String = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeIIIIiiiiUUUUuuuuyNnCc"
‘chaine de lettre de remplacement
Dim MC As Range ' Cellule Courante pour stockage dans la feuille principale.
Dim MC2 As Range ' Cellule Courante 2 pour stockage dans la feuille principale.
Dim z As Integer ‘
Dim avecAccents As String ‘
chaine de caractère contenant des accents pour mon probleme c’est le contenu de ma cellule MC
Dim sansAccents As String
‘chaine de caractere sans accents pour mon probleme c’est le contenue de ma cellule MC2
Dim Lettre As String * 1
‘ Ca je ne c’est pas??? Petite explication svp
avecAccents = MC.Offset(i, 0).Value ‘la je voulais dire que la chaine de caractère avecAccent était égale à la valeur de la cellule MC
Mais je suis obligé de l’enlever si non erreur
sansAccents = MC2.Offset(i, 0).Value ‘ idem
Worksheets("feuil1").Activate ' utilisation de la feuille 1
Worksheets("feuil2").Activate ' utilisation de la feuille 2
Set MC = Worksheets("feuil1").Range("A10") ' Attribue la cellule "A10" de la feuille1 à ma cellule courante.
Set MC2 = Worksheets("feuil2").Range("A10") ' Attribue la cellule "A10" de la feuille 2 à ma cellule courante.
i = 0
j = 0
Do While Worksheets("feuil2").Range("A9").Value <= 336526 'Execute la boucle jusqu'a ce que la cellule A9 de la feuille 2 affiche 336526
If i 65527 Then j j + 1 ' Si i à la valeur 65527 (derniere ligne de la colonne+1) alors décalage d'une colonne.
If i 65527 Then i 0 ' Si i à la valeur 65527 (derniere ligne de la colonne+1) alors i recommence a 0.
For z = 1 To Len(accent) 'effectue une boucle dans le mot jusqu'a ce qu'il n'y ait plus d'accent ???
Lettre = Mid$(accent, z, 1)
‘permet d’extraire les accents de la chaine lettre
If InStr(MC2.Offset(i, 0).Value, Lettre) > 0 Then
‘ la je comprends pas ( si detection accent alors passage a la formule de remplacement ??)
i = i + 1 'l'ancienne valeur de i se voit augmentée de 1 pour le passage de bouclesuivant
e
Worksheets("feuil2").Range("A9").Value = ((j * 65526) + i) 'Affiche dans la cellule A9 de la feuille 2 le nombre de mots à transferer,ce qui permet de faire la condition pour sortir de la boucle
End If
Next z
Loop 'renvoit à la ligne "Do.." , permet de faire une boucle
End Sub
Comme vous avez pu lire mon code est nul et je ne comprends pas trop les fonction, vous pouvez m’aider a comprendre mes erreurs?? S’il vous plait.
Je pense que j’ai un probleme avec String et Range de plus je travail en commandBoutton.
Merci
RoX
Vous n’avez pas trouvé la réponse que vous recherchez ?
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 15 avril 2008 à 08:17
Re,
Si tu le veux bien je vais plutot t'expliquer le code que je t'ai proposé hier.
(je l'ai un tout petit peu modifier pour la compréhension mais il fait la meme chose). Pour l'adapter à ton problème il te suffit d'appeler cette MEME fonction en passant en parametre la chaine que tu souhaite modifier. Donc si c'est le contenu d'une cellule.
l'appelle suivant (PAR EXEMPLE) enlèvera les accents dans le contenu de MC et le mettra dans MC2 (mais attention SANS modifier le contenu de MC)
MC2.Text = sansAccents(MC.Text)
Voila j'espère que c'est plus clair à présent.
' Définition de la conversion
'Constante représentant les lettre à rechercher (seront remplacer)
Const accent As String = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÌÍÎÏìíîïÙÚÛÜùúûüÿÑñÇç"
<table bgcolor="#ffffff" border="0" width="100%">----, 'Constante représentant les lettre qui devront remplacer celles ci dessus
Const noAccent As String = \"AAAAAAaaaaaaOOOOOOooooooEEEEeeeeIIIIiiiiUUUUuuuuyNnCc\"</td>----
[code.aspx?ID=41455 By Renfield]
</td></tr><tr><td align="right">[code.aspx?ID=41455 By Renfield]</td></tr></tbody></table>
' La fonction :
Private Function sansAccents(ByRef s As String) As String
Dim i As Integer
'String * : une chaine composée de 1 caractere
Dim lettre As String * 1
Dim NewLettre As String * 1
sansAccents = s
'pour i = 1 jusqu'a la longueur de la
'constante accent
For i = 1 To Len(accent)
'on extrait la lettre de la position i 'i 1> lettre = À 'i 2> lettre = Á
lettre = Mid$(accent, i, 1)
'Si on retrouve la lettre extraite dans
'la chaine à traiter
If InStr(sansAccents, lettre) > 0 Then
'on extrait de la constante noaccent le caractere qui remplacera l'ancien
'NOTE: il doit se trouver à la meme place dans la constante
'que le caractere trouve
NewLettre = Mid$(noAccent, i, 1)
'effectue le remplacement
sansAccents = Replace(sansAccents, lettre, NewLettre)
End If
Next i
End Function<hr />, ----
[code.aspx?ID=41455 By Renfield]
Rox74
Messages postés30Date d'inscriptionmercredi 9 avril 2008StatutMembreDernière intervention10 février 2011 15 avril 2008 à 13:08
Bonjour
Désoler si je suis lent,je travaille le VBA pendant mon temps libre.
Merci pour les explications mais il m'en manque encore un peux pour bien comprendre.Est ce que vous voulez bien me les donner?? s'il vous plait.
Voila:
- Quand vous ecrivez "Private Function sansAccents(ByRef s As String) As String" c'est une fonction de type chaine nommé sansAccents.
Mais "ByRef s As String" ca veut dire quoi exactement??
De plus dans le code il y a "sansAccents = s" ca signifie quoi?? est que je doit le remplacer par
MC2.Text = sansAccents(MC.Text)
-Lorsque j'ai déclaré mes variables MC et MC2 je les ai déclarées comme suit "Dim MC As Range", "Dim MC2 As Range"
Set MC= worksheet .... ect.
Cela ne pose pas de probleme pour l'équation MC2.Text = sansAccents(MC.Text) ????
- 3ème question pour le moment ( d'autres suiveront surment malheureusement).
Pour exécuter votre code, il faut l'inscrire dans général et apres l'appeller dans Private sub CommandButton1 ???
si je fais ca vba ne veut pas me prendre Call sansAccents ( erreur argument non facultatif ).
Merci pour les explications que vous me donnerez et pour le temps que vous perdez a vous occuper de mes problemes.
Rox
"Il me manque les bases de VBA et je m'en rends compte"
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 15 avril 2008 à 13:56
Re,
Alors
Private Function sansAccents(ByRef s As String) As String"
Est une fonction "privé" qui attend en parametre une chaine de caractere et qui retourne une chaine de caractere.
ByRef Signifie que SI à l'intérieur de la fonction, la valeur de variable s est modifiée, ALORS la modification aura aussi effet en DEHORS de la fonction. (mais ici ce n'as pas d'importance puisqu'on ne modifie pas s).
sansAccents Etant une fonction il faut indiquer ce qu'elle va retourner. et donc il faut l'initialiser aussi > d'ou sansAccents s
On indique simplement à la fonction qu'au début elle travaille avec une "copie" de s.
Tu mélanges.
MC2.Text = sansAccents(MC.Text) n'est pas une équation.
Cela veux dire "affecte dans la propriété Text (qui est de type String) de l'objet MC2 ce que retournera la fonction sansAccents à laquelle tu auras passé le contenu de la propriété TExt (string) de lobjet MC
Je crois que ce qu'il faut t'expliquer c'est le role d'une fonction.
Une fonction allège ton code source car elle te permet de faire TOUT le temps la meme chose.
Ici la fonction SansAccents retourne la chaine de caractere "equivalente" à celle passée en paramètre mais sans les accents.
Ici la fonction sansAccents attends un paramètre (IL FAUT DONC TOUJOURS LUI DONNE)
on en revient au meme point
MC2.Text = sansAccents(MC.Text) n'est pas une équation. MC.Text = paramètre passée à la fonction sansAccents
Rox74
Messages postés30Date d'inscriptionmercredi 9 avril 2008StatutMembreDernière intervention10 février 2011 15 avril 2008 à 15:02
Re,
Merci pour vos explications.
J’ai bien compris le rôle de BYRef, il me semble que j’ai compris le rôle de votre code. Ce qui me manque c’est comment le mettre en place pour mon problème.
<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
Rappel problème : liste de mot écrite avec des accents dans des cellules que l’on veut écrire dans d’autres cellules sans les accents grâce à un bouton
Donc pour cela je dois utiliser votre code (conçue pour une cellule) en boucle (c’est ca ??)
Je vais déjà essayer avec une cellule
Mais où inscrire ce code et comment l’appeler avec un bouton ???et sous quel type je dois déclarer ma cellule MC
Encore un truc qui me chagrine, la chaine « s »
(sansAccents
Etant une fonction il faut indiquer ce qu'elle va retourner. et donc il faut l'initialiser aussi => d'ou sansAccents = s On indique simplement à la fonction qu'au début elle travaille avec une "copie" de s.)
Dans mon cas la fonction agit sur le texte contenue dans la cellule MC, donc je n’ai pas de chaine « s » de départ ; Et si vous me dites qu’il y en a une, visiblement parlait c’est quoi ??
Merci RoX
"VBA= torturer les petits programmeurs pour faciliter les utilisateurs"
Rox74
Messages postés30Date d'inscriptionmercredi 9 avril 2008StatutMembreDernière intervention10 février 2011 15 avril 2008 à 16:01
Re,<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>
Oki j’ai compris votre démarche et votre code bouton (je vais le modifier un peut pour qu’il colle parfaitement a mon
problème.
Je ne toucherais pas au code fonction c’est retenu. Je n’ai toujours pas compris ce que pouvait être « s » mais on va laisser
tomber (je ne veux pas que vous vous prenez la tête pour ça).J’ai une réflexion mécanique pas informatique. Pour moi au
début les écritures du style i=i+1 ce n’était pas logique.
En tout cas je vous remercie beaucoup pour le code et surtout pour les petites leçons données.
RoX
"La réponse n'est pas accecptée, elle est adoptée et félicitée. MERCI jrivet"
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 15 avril 2008 à 16:17
Salut,
NOn mai scela ne me prends pas la tête, je marque en gras et en majuscule pour noter que c'est important
Je vais essayer de te faire comprendre le coup du s
Prenons le code suivant
Private Sub Form_Load()
Dim Chaine1 As String
Chaine1 = "Bonjour "
Chaine1 = Chaine1 & "Julien"
MsgBox Chaine1
Dim Chaine2 As String
Chaine2 = "Au revoir "
Chaine2 = Chaine2 & "Julien"
MsgBox Chaine2
End Sub<hr />
, ----
[code.aspx?ID=41455 By Renfield]
Tu remarques qu'il y a deux parties "similaires" on peut donc décider de faire une procédure
On fera celle ci
Private Sub ShowMessage(MsgBase As String)
MsgBase = MsgBase & "Julien"
MsgBox MsgBase
End Sub<hr />, ----
[code.aspx?ID=41455 By Renfield]NOTE: MsgBase s un parametre de type string (rien de plus)
Suffira de remplacer Dans le Form_Load pour appeler notre nouvelle procédure
on se retoruvera donc au FINAL avec ce code (QUI FAIT EXACTEMENT LA MEME CHOSE)
Private Sub Form_Load()
Call ShowMessage("Bonjour ")
Call ShowMessage("Au revoir ")
End Sub<hr />
Private Sub ShowMessage(MsgBase As String)
MsgBase = MsgBase & "Julien"
MsgBox MsgBase
End Sub , ----
[code.aspx?ID=41455 By Renfield]
Expliquons pas à pas.
1- Call ShowMessage( "Bonjour " ) = Appelle ShowMessage avec la chaine "Bonjour " en parametre
2- On entre dans la Procédure Showmessage, le parametre MsgBase vaut alors "Bonjour "
....
1- Call ShowMessage("Au revoir ") = Appelle ShowMessage avec la chaine "Au revoir " en parametre
2- On entre dans la Procédure Showmessage, le parametre MsgBase vaut alors "Au revoir "
MsgBase As String ou s As String, n'est rien de plus que la déclaration d'un parametre tout comme tu ferais Dim MC As Range
On dit simplement à la Focntion qu'elle possède un parametre qui s'appelle s et qui est de type String
On dit simplement à la procédure qu'elle possède un parametre qui s'appelle MsgBase et qui est de type String
Voila j'espère que c'est plus clair. N'hésite pas à demander, le forum est là pour cela.
@+: Ju£i?n Pensez: Réponse acceptée
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 15 avril 2008 à 16:19
Re,
Petite précision.
lorsque je dis QUI FAIT EXACTEMENT LA MEME CHOSE je parle du point de vu extérieur car en fait il ne fait pas EXACTEMENT la meme chose au niveua programme, mais ce n'est pas important pour l'instant. l'important c'est l'histoire du s
Rox74
Messages postés30Date d'inscriptionmercredi 9 avril 2008StatutMembreDernière intervention10 février 2011 15 avril 2008 à 17:21
re,
oki je crois que j'ai compris avec votre explication. Maintenant on écrit ce code:
Private Sub Form_Load()
Call ShowMessage("Bonjour ")
Call ShowMessage("Au revoir ")
End Sub
<hr />
Private Sub ShowMessage(MsgBase As String)
MsgBase = MsgBase & "Julien"
MsgBox MsgBase
End Sub
Plus besoin d'écrire ce que vous avec écrit plus haut:
Private Sub Form_Load()
Dim Chaine1 As String
Chaine1 = "Bonjour " Chaine1 = Chaine1 & "Julien"
MsgBox Chaine1
Dim Chaine2 As String
Chaine2 = "Au revoir " Chaine2 = Chaine2 & "Julien"
MsgBox Chaine2
End Sub
Et on peut remplacer le texte par n'importe quel texte.
Private Sub ShowMessage(MsgBase As String)
MsgBase = MsgBase & "Julien" MsgBox MsgBase
End Sub
MsbBase prend la valeur que lui donne showMessage
Merci votre exemple est clair
mais je suis pas sur avec le "s"
dans notre cas précédent "s" est une chaine vide qui remplace un truc.
Mais quel truc??Voila ce qui me pose probleme
Dans votre exemple on a dit a msbBase de prendre une valeur ( "bonjour"ou "Au revoir")
alors que pour "s" on lui a rien dit
Voila sur quoi je bloque, pour moi "s" n'est qu'une chaine vide
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 15 avril 2008 à 18:18
Re,
Non c'est la que tu trompes. s n'est pas une chaine vide
Lorsque tu marques
Worksheets(
"Feuil2").Range(
"A" &
CStr(i)).Value = sansAccents(Worksheets(
"Feuil1").Range(
"A" &
CStr(i)).Value)
Tu donnes à s la valeur de Worksheets(
"Feuil1").Range(
"A" &
CStr(i)).Value