Question

The following function was given to me via an answer that I asked earlier today.

What I'm trying to do is to remove a character from a string in Excel using VBA. However, whenever the function runs, it ends up erasing the value stored and returning a #!VALUE error. I cannot seem to figure out what is going on. Anyone mind explaining an alternative:

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

When the string contains a " (or character code 34 in Decimal, 22 in Hexadecimal... I used both) it is supposed to remove the quotation mark. However, instead, Excel ignores it, and still returns the " mark anyway.

I then tried to go ahead and replace the .Replace() clause with another value.

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

Using the code above, the script indeed does replace the " with a /.

I ended up finding the following example here in Stack Overflow: https://stackoverflow.com/a/7386565/692250

And in the answer given, I see the same exact code example similar to the one that I gave and nothing. Excel is still ignoring the quotation mark. I even went so far as to expand the definition with curly braces and still did not get anything.

Was it helpful?

Solution

This function was designed to replace one character with another. It was not designed to replace a character with nothing. What happens when you try to replace a character with nothing is that the Counter for iterating through the word will now look (at the last iteration) for a character position that is greater than the length of the word. That returns nothing, and when you try to determine ASC(<nothing>) an error occurs. Other errors in the replacement routine will also occur when the length of the string is changed while the code is running

To modify the routine to replace a character with nothing, I would suggest the following:

In the Case statements:

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

And in the assignment statement:

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

Note that VBA Replace is different from Worksheetfunction Replace

OTHER TIPS

Try this:

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top