Pregunta

La siguiente función me fue dada a través de una respuesta que pregunté hoy.

Lo que intento hacer es eliminar un carácter de una cadena en Excel usando VBA.Sin embargo, cada vez que se ejecuta la función, termina borrando el valor almacenado y devolviendo un #!VALUE error.Parece que no puedo entender qué está pasando.A alguien le importaría explicar una alternativa:

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

Cuando la cadena contiene un " (o código de carácter 34 en decimal, 22 en hexadecimal...Usé ambos) se supone que debe eliminar las comillas.Sin embargo, Excel lo ignora y aún así devuelve el " marca de todos modos.

Luego intenté seguir adelante y reemplazar el .Replace() cláusula con otro valor.

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

Usando el código anterior, el script reemplaza " con un /.

Terminé encontrando el siguiente ejemplo aquí en Stack Overflow:https://stackoverflow.com/a/7386565/692250

Y en la respuesta dada, veo exactamente el mismo ejemplo de código similar al que di y nada.Excel todavía ignora las comillas.Incluso llegué a ampliar la definición con llaves y todavía no obtuve nada.

¿Fue útil?

Solución

Esta función fue diseñada para reemplazar un carácter con otro.No estaba diseñado para reemplazar un personaje sin nada.Lo que sucede cuando intenta reemplazar a un personaje con nada es que el mostrador para la iteración a través de la palabra ahora se verá (en la última iteración) para una posición de caracteres que sea mayor que la longitud de la palabra.Eso no devuelve nada, y cuando intenta determinar la ASC (<< Em> nada >) se produce un error.También se producirán otros errores en la rutina de reemplazo cuando se cambie la longitud de la cadena mientras se ejecuta el código

Para modificar la rutina para reemplazar un carácter sin nada, sugeriría lo siguiente:

En los estados de cuenta:

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

y en la declaración de asignación:

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

Nota que la reemplazo de VBA es diferente de la función de trabajo Reemplazar

Otros consejos

Intenta esto:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top