Excel反向替换

Excel反向替换,excel,vba,replace,Excel,Vba,Replace,我正在开发一些软件,在将数据发送到另一个系统之前先清理数据。数据来自世界各地,包含各种必须替换的字符。例如',:@ 接受解析数据的系统具有非常严格的字符集。它允许 字母A到Z(仅大写) 数字0到9 特殊字符/-。空间

我正在开发一些软件,在将数据发送到另一个系统之前先清理数据。数据来自世界各地,包含各种必须替换的字符。例如',:@

接受解析数据的系统具有非常严格的字符集。它允许 字母A到Z(仅大写) 数字0到9 特殊字符/-。空间<=

数据以Excel电子表格的形式出现,因此我在visual basic宏中编写了以下代码

fhl_str包含要清理的数据

fhl_str = Replace(fhl_str, ",", " ")
fhl_str = Replace(fhl_str, "'", " ")
fhl_str = Replace(fhl_str, ":", " ")
fhl_str = Replace(fhl_str, ";", " ")
fhl_str = ucase(fhl_str)
现在,每次新的不需要的字符到达时,我们都必须添加一行新的代码。e、 g.fhl_str=替换(fhl_str,@,“”)

我的问题是 我是否可以反转逻辑,以便宏查找A到Z和0到9,并删除任何其他内容。这样,我的代码将成为新的无用字符的未来证明


谢谢

如果你觉得正则表达式很难理解,这里有一些VBA可以帮你。它使用ASCII码确定只允许使用的字符。如果您的范围发生变化,您可以在
Case
语句中修改ASCII数字

Public Function RemoveSpecial(s As String) As String
  Dim sResult As String
  Dim nIndex As Integer

  s = UCase$(s)
  For nIndex = 1 To Len(s)
    Select Case Asc(Mid$(s, nIndex, 1))
      Case 65 To 90, 45 To 57, 32, 60 To 61
        sResult = sResult & Mid$(s, nIndex, 1)
      Case Else
        sResult = sResult & " "
    End Select
  Next
  RemoveSpecial = sResult

End Function
用法:

Debug.Print RemoveSpecial("TeSt<>=.@@")
Debug.Print RemoveSpecial(“测试=。@”)
或者类似于:

Range("A1") = RemoveSpecial("TeSt<>=.@@")
Range(“A1”)=RemoveSpecial(“TeSt=。@”)

如果要用单个空格替换坏字符:

Sub KeepOnlyTheGood()
    Dim i As Long, L As Long, v As String, CH As String
    Dim r As Range

    For Each r In Selection
        t = ""
        v = r.Value
        L = Len(v)
        For i = 1 To L
            CH = Mid(v, i, 1)
            If CH Like "[0-9A-Z]" Or CH = "/" Or CH = "-" Or CH = "." Or CH = " " Or CH = "<" Or CH = "=" Then
                t = t & CH
            Else
                t = t & " "
            End If
        Next i
        r.Value = t
    Next r
End Sub
Sub KeepOnlyTheGood()
我是长的,我是长的,v是弦,CH是弦
调光范围
对于选择中的每个r
t=“”
v=r.值
L=Len(v)
对于i=1到L
CH=中间(v,i,1)

如果CH像“[0-9A-Z]”或CH=“/”或CH=“-”或CH=“”.”或CH=“”)或CH=“你可以使用a,你可以将长线压缩到
,如果CH像“[0-9A-Z