Eliminar caracteres con .Replace en VBA para Excel
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.
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