VBA:删除所有特殊字符

时间:2015-07-02 15:33:24

标签: excel vba excel-vba

我已经做了一些寻找解决方案,但我找不到可以直接使用的东西。因此,通过尝试编辑别人的代码供我自己使用,我遇到了一个问题。

我正在尝试使用第RemoveSpecialChars("$C$1")行但我收到Object required错误。

功能如下:

Function RemoveSpecialChars(ByVal mfr As Range)

    Const splChars As String = "!@#$%^&()/"
    Dim ch As Characters

    For Each ch In splChars
    mfr.Replace What:=ch, Replacement:="", LookAt:=xlPart, _
                SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
                ReplaceFormat:=False
    Next ch

End Function

这是一个简单的问题,但是“$ C $ 1”不被视为范围?

感谢您的帮助。

修改:如果我使用Function RemoveSpecialChars(mfr As Range)(没有ByVal),则会出现Type mismatch错误。

这进一步让我相信“$ C $ 1”不被视为范围。

EDIT2:

@ sous2817

这是我设置要与您的函数一起使用的字符串mfr的方法。

Range("C1").FormulaR1C1 = mfr

这就是我尝试应用它的方式。

Range("C1").FormulaR1C1 = RemoveSpecialChars(C1)

3 个答案:

答案 0 :(得分:4)

不要传递“$”。这对我有用:

=RemoveSpecialChars(C1)

现在这会打开其他问题,因为代码不会按照您的意愿执行,因为您只能迭代集合和数组,而不是字符串。

尝试这个(我确信可以清理,但希望能让你朝着正确的方向前进):

Function RemoveSpecialChars(ByVal mfr As Range)

    Dim splChars As String
    Dim ch As Variant
    Dim splCharArray() As String

    splChars = "! @ # $ % ^ & () /"

    splCharArray = Split(splChars, " ")


    For Each ch In splCharArray
    mfr.Replace What:=ch, Replacement:="", LookAt:=xlPart, _
                SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
                ReplaceFormat:=False
    Next ch
    RemoveSpecialChars = mfr

End Function

如果你是从sub调用它,你应该限定你的范围参考,这是一种方式:

Sub test()

    Dim test As String

    test = RemoveSpecialChars(Sheet1.Range("C1"))

    Debug.Print test

End Sub

由于问题更新。以下是填充公式的另一种方法:

Sub test2()
    Sheet1.Range("D1").Formula = "=RemoveSpecialChars(C1)"
End Sub

好的,上次编辑。如果要保留字符串并创建一个删除了特殊字符的字符串,则应采用稍微不同的方法。这是一种方式:

Function RemoveSpecialChars(mfr As Range)

    Dim splChars As String
    Dim ch As Variant
    Dim splCharArray() As String
    Dim newString As String

    newString = mfr.Value

    splChars = "! @ # $ % ^ & () /"

    splCharArray = Split(splChars, " ")


    For Each ch In splCharArray
        newString = Replace(newString, ch, "")
    Next ch

    RemoveSpecialChars = newString

End Function

答案 1 :(得分:1)

这可能会慢一些,但您可以使用Ascii数字这样做。如果您不想使用replace:

,也可以通过这种方式循环字符串
Public Function AlphaNumericOnly(strSource As String) As String
    Dim i As Integer
    Dim strResult As String

    For i = 1 To Len(strSource)
        Select Case Asc(Mid(strSource, i, 1))
            Case 48 To 57, 65 To 90, 97 To 122: 'include 32 if you want to include space
                strResult = strResult & Mid(strSource, i, 1)
        End Select
    Next
    AlphaNumericOnly = strResult
End Function

答案 2 :(得分:0)

" $ C $ 1和#34;不是范围它是一个字符串

尝试

RemoveSpecialChars(range("$C$1"))

好吧不喜欢上面的内容:我缺乏测试。以下工作,但你进入另一个错误的功能,我不确定

Set Rng = Range("$C$1")
RemoveSpecialChars (Rng)