Suppression de tout caractère non spécifié d'une feuille de calcul Excel à L'aide d'une Macro
j'essaie de nettoyer un .Fichier CSV dans Excel en se débarrassant de tous les caractères non standard. Les seuls caractères que je garde sont a-Z, 0-9, et quelques signes de ponctuation standard. Tous les autres personnages, j'aimerais supprimer.
j'ai obtenu la macro suivante pour supprimer une rangée entière quand elle trouve une cellule qui contient des caractères que je n'ai pas spécifiés, mais je ne suis pas sûr de la façon de l'obtenir pour réellement supprimer le caractère lui-même.
Sub Replace()
Dim sCharOK As String, s As String
Dim r As Range, rc As Range
Dim j As Long
sCharOK = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789, `~!@#$%^&*()_+-=[]{}|;':"",./<>?™®"
Set r = Worksheets("features").UsedRange.SpecialCells(xlCellTypeConstants, xlTextValues)
' loop through all the cells with text constant values and deletes the rows with characters not in sCharOK
For Each rc In r
s = rc.Value
For j = 1 To Len(s)
If InStr(sCharOK, Mid(s, j, 1)) = 0 Then
rc.EntireRow.Delete
Exit For
End If
Next j
Next rc
End Sub
je suppose qu'il y a une façon assez simple d'adapter ce code à cette fonction, mais je ne suis pas assez familier avec VBA pour savoir vraiment comment faire cela. Toute perspicacité est grandement appréciée!
4 réponses
une autre façon serait Range.Replace
comme:
Sub test()
Dim sCharOK As String
sCharOK = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789, `~!@#$%^&*()_+-=[]\{}|;':"",./<>?™®" & Chr(1)
Dim i As Long
For i = 0 To 255
If InStr(sCharOK, Chr(i)) = 0 Then
ActiveSheet.Cells.Replace What:=Chr(i), Replacement:="", LookAt:=xlPart, MatchCase:=True, SearchFormat:=False, ReplaceFormat:=False
End If
Next
End Sub
MODIFIER
regarder @ryguy72 la réponse offre aussi une autre façon si seulement les caractères non imprimables doivent être supprimés (à la question quelque chose comme µ²äöüßÉõ
sera supprimé mais ce code ne sera pas) en supposant également qu'il ya pas de formules :
Sub test()
With ActiveSheet.UsedRange
.Value = Evaluate("TRIM(CLEAN(" & .Address & "))")
End With
End Sub
ou directement exécuter dans la fenêtre immédiate une doublure:
ActiveSheet.UsedRange.Value = Evaluate("TRIM(CLEAN(" & ActiveSheet.UsedRange.Address & "))")
vous pouvez également utiliser des expressions régulières, évitant ainsi d'avoir à examiner chaque caractère dans une boucle. (Bien que le moteur d'expressions régulières a à faire).
le motif Regex, expliqué ci-dessous, contient votre liste de caractères, et la classe de caractères utilisée dit correspondent à tout ce qui n'est pas listé.
si la vitesse devient un problème, vous pouvez utiliser des tableaux vba pour accélérer les choses.
Option Explicit
Sub ReplaceNonStdChars()
Const sPat As String = "[^\x20-\x7E\x99\xAE]"
Dim RE As Object
Dim R As Range, C As Range
Set R = Worksheets("features").UsedRange.SpecialCells(xlCellTypeConstants, xlTextValues)
Set RE = CreateObject("vbscript.regexp")
With RE
.Global = True
.Pattern = sPat
For Each C In R
C.Value = .Replace(C.Text, "")
Next C
End With
End Sub
explication du motif Regex
[^\x20-\x7E\x99\xAE]
[^\x20-\x7E\x99\xAE]
- correspondent à un caractère unique non présent dans la liste ci-dessous
[^\x20-\x7E\x99\xAE]
créé avec RegexBuddy
si c'était moi, j'utiliserais une commande replace sur la chaîne originale chaque fois que je trouve un char invalide, changeant ce char invalide En null. Ensuite, remplacez la valeur originale de la cellule par la chaîne modifiée. Quelque chose comme cela...
Une façon possible (testé)
Sub RemoveInvalidCharacters()
Dim sCharOK As String, s As String
Dim r As Range, rc As Range
Dim j As Long
Dim badchar As Boolean
sCharOK = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789, `~!@#$%^&*()_+-=[]\{}|;':"",./<>?™®"
Set r = Worksheets("features").UsedRange.SpecialCells(xlCellTypeConstants, xlTextValues)
' loop through all the cells with text constant values and
' deletes the invalid characters not in sCharOK from each Value property
For Each rc In r
badchar = False
s = rc.Value
For j = 1 To Len(s)
If InStr(sCharOK, Mid(s, j, 1)) = 0 Then
badchar = True
s = Replace(s, Mid(s, j, 1), "")
End If
Next j
If badchar Then
rc.Value = s
End If
Next rc
End Sub
il fallait que je fasse ça aujourd'hui, littéralement. Le scénario ci-dessous a parfaitement fonctionné pour moi.
Sub Clean_and_Trim_Cells()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim s As String
For Each c In ActiveSheet.UsedRange
s = c.Value
If Trim(Application.Clean(s)) <> s Then
s = Trim(Application.Clean(s))
c.Value = s
End If
Next
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub