[Résolu] Macro évènementielle pour remplacer caractères spéciaux

libellule85

XLDnaute Accro
Bonjour le forum,

j'ai récupéré dans un open data une bdd, par contre toutes les lettres ayant des accents apparaissent avec è pour le é.
J'ai fait une macro par l'intermédiaire de l'enregistreur et cela me donne ceci :
VB:
Sub Macro1()
'    'Range("A1065").Select
    'ActiveCell.FormulaR1C1 = "34 - Hérault"
    Cells.Replace What:="[B]è[/B]", Replacement:="[B]è[/B]", LookAt _
        :=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
End Sub
Donc pour chaque voyelles particulières je suis obligée de coller à chaque fois le caractère spécial ainsi que son correspondant "normal" !
Je voulais donc savoir, s'il n'était pas possible de faire une macro événementielle (en F1 le caractère spécial à remplacer et en G1 le bon caractère) qui se déclenche après renseignement de la deuxième cellule (G1) ?
D'avance merci pour votre aide.
 

DoubleZero

XLDnaute Barbatruc
Bonjour, libellule85, le Forum,

En attendant mieux...
VB:
Option Explicit
Sub Caractères_spéciaux_remplacer()
    On Error Resume Next
    With Cells
    ' valeurs adapter
        .Replace What:="è", Replacement:="è", LookAt:=xlPart
        .Replace What:="&#239", Replacement:="ï", LookAt:=xlPart
        .Replace What:="&#233", Replacement:="é", LookAt:=xlPart
        .Replace What:=";", Replacement:="", LookAt:=xlPart
        .Replace What:="&#224", Replacement:="à", LookAt:=xlPart
    End With
End Sub
A bientôt :)
 

DoubleZero

XLDnaute Barbatruc
Re-bonjour,

Après avoir sollicité la macro suggérée en #2 , peut-être serait-il préférable d'insérer, dans le module de l'onglet de travail, l'événementielle suivante :
VB:
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal c As Range)
    Application.ScreenUpdating = False
    Call Caractères_spéciaux_remplacer
    Application.ScreenUpdating = True
End Sub
A bientôt :)
 

DoubleZero

XLDnaute Barbatruc
Re-bonjour,
...Je suis nulle en vba...
Qu'importe ! Toi et moi sommes là pour apprendre ;)

...peut-on mettre quelque chose du style :
VB:
If Not Application.Intersect(Target, Range("G1")) Is Nothing Then
call.....
...mais avec les deux cellules F1 et G1 à modifier ?

Pourrais-tu, s'il te plaît, déposer un fichier exemple ?

A bientôt :)
 

DoubleZero

XLDnaute Barbatruc
Re-bonjour,

Je regrette de ne savoir suggérer d'autre code que...
VB:
Option Explicit
Sub Caractères_spéciaux_remplacer_v2()
    On Error Resume Next
    With Cells
        ' valeurs adapter et(ou) compléter
        .Replace What:="é", Replacement:="é", LookAt:=xlPart
        .Replace What:="â", Replacement:="â", LookAt:=xlPart
        .Replace What:="ç", Replacement:="ç", LookAt:=xlPart
        .Replace What:="ô", Replacement:="ô", LookAt:=xlPart
        .Replace What:="è", Replacement:="è", LookAt:=xlPart
        .Replace What:="É", Replacement:="E", LookAt:=xlPart
        .Replace What:="ê", Replacement:="ê", LookAt:=xlPart
        .Replace What:="ë", Replacement:="ë", LookAt:=xlPart
        .Replace What:="û", Replacement:="û", LookAt:=xlPart
    End With
    Columns.AutoFit
End Sub
A bientôt :)
 

ODVJ

XLDnaute Impliqué
Bonsoir à tous,

Petite info : il suffit d'ajouter 64 au code ascii du caractère qui suit à pour obtenir le caractère kivabien.
Pour ceux qui ont Morefunc de Laurent Longre, cette formule fait le job :
Code:
=REGEX.SUBSTITUE(B2;"Ã(.)";"=CHAR(CODE(""[1]"")+64)")
Il faut ensuite faire un Copier/Collage spécial pour ne garder que le résultat.

Il est facile de passer par une macro pour faire la même chose.
L'intérêt est de ne pas avoir à identifier tous les caractères susceptibles de se trouver après le Ã.

Cordialement

edit : voilà un code possible
VB:
Sub A_tilde()
    Dim Bassins
    Dim c$, i%, j%
    Bassins = [Bassins_de_vie].Value
    n = UBound(Bassins)
    For i = 1 To n
        If Bassins(i, 1) Like "*Ã*" Then
            c$ = ""
            For j = 1 To Len(Bassins(i, 1))
                If Mid(Bassins(i, 1), j, 1) = "Ã" Then
                    j = j + 1
                    c$ = c$ & Chr(Asc(Mid(Bassins(i, 1), j, 1)) + 64)
                Else
                    c$ = c$ & Mid(Bassins(i, 1), j, 1)
                End If
            Next j
            Bassins(i, 1) = c$
        End If
    Next i
    [G2].Resize(n, 1) = Bassins
End Sub
 
Dernière édition:

libellule85

XLDnaute Accro
Bonsoir tout le monde,
ODVJ je reviens vers toi concernant ta macro pour l'adapter à plusieurs colonnes (je ne sais pas comment faire) :

C4 Prénom
D4 Mandat
E4 Circonscription
F4 Département
G4 Candidat-e parrainée
H4 date de Publication

J'aimerais que le résultat des colonnes de C4 à G4 soit recopié à partir de la colonne J il y a plus de 9000 lignes !!
Je t'ai mis un petit fichier exemple.
D'avance je te remercie pour ton aide..
 

Pièces jointes

  • Libellule85 10 03.xlsm
    9.5 KB · Affichages: 35

ODVJ

XLDnaute Impliqué
Bonsoir,

Désolé, mais je suis sans PC pendant 10 jours. Je ne peux rien pour toi pendant ce délai.
Je pense que Roland_M ou DoubleZero (ou d'autres...) te sortiront d'affaire. L'adaptation n'est pas trop compliquée.

Cordialement
 

libellule85

XLDnaute Accro
Bonjour le forum,
J'ai trouvé sur le forum
Excel-Pratique un code qui fonctionne impeccable sur mon fichier, merci beaucoup cousinhub !

VB:
Sub remplace_csv() 'cousinhub
ReDim A_Remplacer(0 To 10000)
ReDim Remplacants(0 To 10000)
Dim I As Byte
A_Remplacer = Array("î", "é", "→", "Ü", "ù", "â", "è", "à ", "’", "€", "®", "Ø", "°", "ç", "ô", _
                  "«", "»", "û", "ê", "…", "/ø", "ø", "À", "É", "È", " à ", "Ö")
Remplacants = Array("î", "é", Chr(26), "Ü", "û", "â", "è", "à", "'", "€", "®", "Ø", "°", "ç", "ô", _
                  Chr(34), Chr(34), "û", "ê", "..", "ø", "ø", "A", "E", "E", " à ", "Ö")
For I = 0 To UBound(A_Remplacer)
    Cells.Replace What:=A_Remplacer(I), Replacement:=Remplacants(I), LookAt:=xlPart
Next I
End Sub
 
Dernière édition:

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
314 628
Messages
2 111 337
Membres
111 104
dernier inscrit
JEMADA