Macro Excel ou VBA
Bonjour,
Depuis plusieurs jours je bute sur une difficulté qui va au delà de mes compétences sur Excel
J'ai un classeur qui est composé de 27 feuilles pour les 26 premières feuilles (1 pour chacune des lettres de l'alphabet) j'ai 20 colonnes fixes
et j'ai un nombre variable de lignes (de plusieurs centaines à plusieurs milliers) la 27ème feuille est une table de correspondance entre des caractères utf8 et Iso
lorsque ce fichier a été importé il y avait un problème d'encodage et certains caractères sont remplacés exemple é en lieu et place de é ; è en lieu et place de è ...
je souhaiterai pouvoir remplacer dans les cellules concernées ces valeurs erronées par la valeur correspondante dans la table (composée de 2 colonnes et de 111 lignes) en une seule fois est ce possible ?
merci pour vos réponses
Cordialement,
P. RENAUD
Bonjour
Utilise depuis le menu ACCUEIL Rechercher et Remplacer
Dans rechercher copier/coller les lettres è et dans Remplacer mettre è
dans les options --> Dans mettre Classeur et cliquez sur Remplacer tout
Même opération pour les autres caractères
Bonjour,
sinon déposer un fichier avec quelques lignes avec le pb
eric
Re-bonjour
Pour mieux me faire comprendre voici un extrait du fichier : est il possible de changer ces caractères erronés (plusieurs milliers dans la base de données) en une seule fois via une macro ?
Merci pour vos réponses
P RENAUD
Comme c'est une opération potentiellement très longue, j'ai ajouté dans la barre d'état en bas l'avancement : nom feuille:remplacement en cours
eric
Un grand merci pour vous être penché sur ma problématique
cela fonctionne parfaitement
P.RENAUD
Méfie-toi si tu fais transiter ton fichier par un Mac, tu retrouveras un problème similaire.
eric
bonjour,
j'ai rien compris,mais voila un code VBA qui converti UTF8 en ISO et Iso en UTF8!
Sub main()
Debug.Print Encode_UTF8("?")
Debug.Print Decode_UTF8(Encode_UTF8("?"))
Debug.Print Decode_UTF8("éa")
Debug.Print isUTF8("éa")
Debug.Print isUTF8("abcde")
Debug.Print Encode_UTF8("abcdeééàê")
Debug.Print Decode_UTF8(Encode_UTF8("abcdeééàê"))
End Sub
' Char. number range | UTF-8 octet sequence
' (hexadecimal) | (binary)
' --------------------+---------------------------------------------
' 0000 0000-0000 007F | 0xxxxxxx
' 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
' 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
' 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Public Function Encode_UTF8(astr)
Dim c
Dim n
Dim utftext
utftext = ""
n = 1
Do While n <= Len(astr)
c = AscW(Mid(astr, n, 1))
If c < 128 Then
utftext = utftext + Chr(c)
ElseIf ((c >= 128) And (c < 2048)) Then
utftext = utftext + Chr(((c \ 64) Or 192))
utftext = utftext + Chr(((c And 63) Or 128))
ElseIf ((c >= 2048) And (c < 65536)) Then
utftext = utftext + Chr(((c \ 4096) Or 224))
utftext = utftext + Chr((((c \ 64) And 63) Or 128))
utftext = utftext + Chr(((c And 63) Or 128))
Else ' c >= 65536
utftext = utftext + Chr(((c \ 262144) Or 240))
utftext = utftext + Chr(((((c \ 4096) And 63)) Or 128))
utftext = utftext + Chr((((c \ 64) And 63) Or 128))
utftext = utftext + Chr(((c And 63) Or 128))
End If
n = n + 1
Loop
Encode_UTF8 = utftext
End Function
' Char. number range | UTF-8 octet sequence
' (hexadecimal) | (binary)
' --------------------+---------------------------------------------
' 0000 0000-0000 007F | 0xxxxxxx
' 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
' 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
' 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Public Function Decode_UTF8(astr)
Dim c0, c1, c2, c3
Dim n
Dim unitext
If isUTF8(astr) = False Then
Decode_UTF8 = astr
Exit Function
End If
unitext = ""
n = 1
Do While n <= Len(astr)
c0 = Asc(Mid(astr, n, 1))
If n <= Len(astr) - 1 Then
c1 = Asc(Mid(astr, n + 1, 1))
Else
c1 = 0
End If
If n <= Len(astr) - 2 Then
c2 = Asc(Mid(astr, n + 2, 1))
Else
c2 = 0
End If
If n <= Len(astr) - 3 Then
c3 = Asc(Mid(astr, n + 3, 1))
Else
c3 = 0
End If
If (c0 And 240) = 240 And (c1 And 128) = 128 And (c2 And 128) = 128 And (c3 And 128) = 128 Then
unitext = unitext + ChrW((c0 - 240) * 65536 + (c1 - 128) * 4096) + (c2 - 128) * 64 + (c3 - 128)
n = n + 4
ElseIf (c0 And 224) = 224 And (c1 And 128) = 128 And (c2 And 128) = 128 Then
unitext = unitext + ChrW((c0 - 224) * 4096 + (c1 - 128) * 64 + (c2 - 128))
n = n + 3
ElseIf (c0 And 192) = 192 And (c1 And 128) = 128 Then
unitext = unitext + ChrW((c0 - 192) * 64 + (c1 - 128))
n = n + 2
ElseIf (c0 And 128) = 128 Then
unitext = unitext + ChrW(c0 And 127)
n = n + 1
Else ' c0 < 128
unitext = unitext + ChrW(c0)
n = n + 1
End If
Loop
Decode_UTF8 = unitext
End Function
' Char. number range | UTF-8 octet sequence
' (hexadecimal) | (binary)
' --------------------+---------------------------------------------
' 0000 0000-0000 007F | 0xxxxxxx
' 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
' 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
' 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Public Function isUTF8(astr)
Dim c0, c1, c2, c3
Dim n
isUTF8 = True
n = 1
Do While n <= Len(astr)
c0 = Asc(Mid(astr, n, 1))
If n <= Len(astr) - 1 Then
c1 = Asc(Mid(astr, n + 1, 1))
Else
c1 = 0
End If
If n <= Len(astr) - 2 Then
c2 = Asc(Mid(astr, n + 2, 1))
Else
c2 = 0
End If
If n <= Len(astr) - 3 Then
c3 = Asc(Mid(astr, n + 3, 1))
Else
c3 = 0
End If
If (c0 And 240) = 240 Then
If (c1 And 128) = 128 And (c2 And 128) = 128 And (c3 And 128) = 128 Then
n = n + 4
Else
isUTF8 = False
Exit Function
End If
ElseIf (c0 And 224) = 224 Then
If (c1 And 128) = 128 And (c2 And 128) = 128 Then
n = n + 3
Else
isUTF8 = False
Exit Function
End If
ElseIf (c0 And 192) = 192 Then
If (c1 And 128) = 128 Then
n = n + 2
Else
isUTF8 = False
Exit Function
End If
ElseIf (c0 And 128) = 0 Then
n = n + 1
Else
isUTF8 = False
Exit Function
End If
Loop
End Function
Bonjour…
«est il possible de changer ces caractères erronés (plusieurs milliers dans la base de données) en une seule fois via une macro ?»
Tu récupères les informations feuille par feuille donc tu fractionneras la durée (qui peut durer, durer… sur la totalité) à chaque activation d'une feuille ainsi, dans ThisWorkbook :
Dim P As Range, R As Range, C As Range
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Sh.Name = "Table" Then Exit Sub
Application.ScreenUpdating = 0 'pas de mise à jour de l'écran à chaque ligne
Set P = [A1].CurrentRegion
For Each R In P
For Each C In [TB]
If R Like ("*" & C & "*") Then R = Replace(R, C, C(1, 2)): Exit For
Next
Next
End Sub
Remarque : j'ai intégré la Table dans un tableau structuré (le bien venu) TB.
bonjour,
avec le code que j'ai envoyé ça devrait être plus rapide !
For Each R In P
R = Decode_UTF8(R)
Nextj'ai pas regardé, mais les données provinne d'un import CSV ?