使用macros从Excel电子表格中删除任何非指定的字符

我试图通过摆脱任何非标准字符来清理Excel中的.CSV文件。 我唯一关心的字符是AZ,0-9和一些标准的标点符号。 任何其他字符,我想删除。

我得到下面的macros删除整个行,当它发现一个单元格包含我没有指定的任何字符,但我不知道如何得到它实际上删除字符本身。

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 

我认为有一个相当简单的方法来适应这个函数,但是我对VBA不够熟悉,不知道如何去做。 任何见解都非常感谢!

另一种方法是Range.Replace如:

 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 

编辑

看@ ryguy72答案还提供了另一种方式,如果只有不可打印的字符需要删除(在像µ²äöüßÉõ这样的问题将被删除,但这段代码不会)也假设没有公式

 Sub test() With ActiveSheet.UsedRange .Value = Evaluate("TRIM(CLEAN(" & .Address & "))") End With End Sub 

或直接运行在立即窗口这一行:

 ActiveSheet.UsedRange.Value = Evaluate("TRIM(CLEAN(" & ActiveSheet.UsedRange.Address & "))") 

如果是我,每次find一个无效的字符时,我会在原始string上使用replace命令,将无效字符更改为空。 然后用修改的stringreplace原始的单元格值。 像这样的东西…

一种可能的方式(testing)

 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 

您也可以使用正则expression式,从而避免需要检查循环中的每个字符。 (虽然正则引擎必须这样做)。

下面解释的正则expression式模式包含您的字符列表,而所使用的字符类表示匹配没有列出的所有东西。

如果速度成为问题,您可以使用vba数组来加快速度。

 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 

正则expression式的解释

[^ \ x20- \ x7E \ X99 \ XAE]

 [^\x20-\x7E\x99\xAE] 
  • 匹配 [^\x20-\x7E\x99\xAE] 下面列表中的任何单个字符 [^\x20-\x7E\x99\xAE]
    • 这两个字符之间的字符 \x20-\x7E
      • 在字符集 \x20 占据位置0x20(十进制32)的字符“”
      • 在字符集 \x7E 占据位置0x7E(十进制数126)的字符“〜”
    • 字符集 \x99 位置为0x99(十进制为153)的字符
    • 位于字符集 \xAE 中的位置为0xAE(174位十进制)的字符

用RegexBuddy创build

我只是今天不得不这样做。 下面的脚本对我来说工作得很好。

 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