VBA:删除所有特殊字符的函数

我已经做了一些search解决scheme,我一直没能find我可以直接使用的东西。 因此,通过尝试编辑其他人的代码以供我自己使用,我遇到了一个问题。

我试图使用行RemoveSpecialChars("$C$1")但我得到一个Object required错误。

function如下:

 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

这是我如何设置stringmfr用于您的function。

 Range("C1").FormulaR1C1 = mfr 

这是我如何尝试应用它。

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

不要通过“$”。 这对我工作:

 =RemoveSpecialChars(C1) 

现在,这个开放的代码不能做你想做的事情,因为你只能遍历集合和数组,而不是string。

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

 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 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 

好的,上次编辑。 如果你想保留string,并创build一个删除特殊字符,你应该采取一个稍微不同的方法。 这是一个方法:

 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 

“$ C $ 1”不是一个范围,它是一个string

尝试

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

好吧不喜欢以上:我的部分缺乏testing。 下面的工作,但你进入另一个错误的function,我不知道

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

这可能会慢一些,但是你可以用Ascii数字这样做。 如果你不想使用replace,你也可以这样循环string:

 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