在VBA for Excel中使用.Replace删除字符

时间:2014-07-31 20:57:17

标签: excel vba excel-vba replace

我通过今天早些时候提出的答案向我提供了以下功能。

我尝试做的是使用VBA从Excel中的字符串中删除字符。但是,每当函数运行时,它最终都会删除存储的值并返回#!VALUE错误。我似乎无法弄清楚发生了什么。任何人都在解释另一种选择:

Function ReplaceAccentedCharacters(S As String) As String
    Dim I As Long

With WorksheetFunction
For I = 1 To Len(S)
    Select Case Asc(Mid(S, I, 1))
        ' Extraneous coding removed. Leaving the examples which 
        ' do work and the one that is causing the problem.
        Case 32
            S = .Replace(S, I, 1, "-")
        Case 94
            S = .Replace(S, I, 1, "/")

        ' This is the coding that is generating the error.
        Case 34
            S = .Replace(S, I, 1, "")
        End Select

    Next I

End With

ReplaceAccentedCharacters = S

End Function

当字符串包含"(或十六进制中的字符代码34,十六进制中的22 ...我同时使用两者)时,应该删除引号。但是,Excel会忽略它,仍然会返回"标记。

然后我尝试继续用另一个值替换.Replace()子句。

        Case 34
            S = .Replace(S, I, 1, "/")
        End Select

使用上面的代码,脚本确实替换了"用/。

我最终在Stack Overflow中找到了以下示例: https://stackoverflow.com/a/7386565/692250

在给出的答案中,我看到的代码示例与我给出的代码相同,没有任何内容。 Excel仍然忽略引号。我甚至用花括号扩展了定义,但仍然没有得到任何东西。

2 个答案:

答案 0 :(得分:2)

试试这个:

Function blah(S As String) As String
    Dim arr, i

    'array of [replace, with], [replace, with], etc
    arr = Array(Chr(32), "-", Chr(94), "/", Chr(34), "")

    For i = LBound(arr) To UBound(arr) Step 2
        S = Replace(S, arr(i), arr(i + 1))
    Next i

    blah = S
End Function

答案 1 :(得分:1)

此功能旨在将一个角色替换为另一个角色。它的目的不是用一无所有的方式取代一个角色。当你试图用什么都没有替换一个字符时会发生什么呢?迭代通过这个单词的计数器现在看起来(在最后一次迭代)对于一个大于单词长度的字符位置。什么都不返回,当您尝试确定ASC(< nothing >)时会发生错误。当代码运行时更改字符串的长度时,也会发生替换例程中的其他错误

要修改例程以无任何替换字符,我建议如下:

在案例陈述中:

Case 34
        S = .Replace(S, I, 1, Chr(1))

在作业陈述中:

ReplaceAccentedCharacters = Replace(S, Chr(1), "")

请注意,VBA Replace与Worksheetfunction Replace

不同