Remplacement des caractères d'un mot par des autres

Résolu
Signaler
Messages postés
30
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
10 février 2011
-
Messages postés
30
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
10 février 2011
-
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


 

14 réponses

Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
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
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
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.

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Re,
Sinon en cherchant sur google on tombe rapidement sur un code de ce meme site.

C'est LA

(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
Messages postés
30
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
10 février 2011

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 ??)












 
  


 

MC2.Offset(i, j).Value = Replace((MC.Offset(i, j).Value), Lettre, Mid$(noAccent, z, 1))   







‘ ici  je crois que je me suis trompé  ;-D






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
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
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]

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
30
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
10 février 2011

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"
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
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

Voilà j'espère que c'est plus clair.

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
30
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
10 février 2011

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"
Messages postés
30
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
10 février 2011

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"
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
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
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
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

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
30
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
10 février 2011

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 Form_Load()
   Call ShowMessage("Bonjour ")
Call ShowMessage("MERCI ")
   Call ShowMessage("Au revoir ")
   
End Sub


<hr />


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

RoX
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
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


compris maintenant?

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
30
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
10 février 2011

bonjour,

oki c'est compris et noté

Merci

Rox