Suppression de caractères avec .Remplacer en VBA pour Excel
Question
La fonction suivante m'a été donnée par l'intermédiaire d'une réponse que j'ai demandé plus tôt aujourd'hui.
Ce que j'essaie de faire est de supprimer un caractère à partir d'une chaîne dans Excel en utilisant VBA.Cependant, chaque fois que la fonction s'exécute, il finit par l'effacement de la valeur stockée et de retour d'un #!VALUE
erreur.Je n'arrive pas à comprendre ce qui se passe.Quelqu'un esprit expliquant une 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
Lorsque la chaîne contient un "
(ou code de caractère 34 en Décimal, 22 en Hexadécimal...J'ai utilisé les deux), il est censé supprimer le guillemet.Cependant, au lieu de cela, Excel ignore, et renvoie toujours la "
marque de toute façon.
J'ai ensuite essayé d'aller de l'avant et remplacer la .Replace()
clause avec une autre valeur.
Case 34
S = .Replace(S, I, 1, "/")
End Select
À l'aide du code ci-dessus, le script, en effet, que de remplacer les " par un /.
J'ai fini par trouver l'exemple suivant ici dans le Débordement de la Pile:https://stackoverflow.com/a/7386565/692250
Et dans la réponse donnée, je vois exactement le même exemple de code similaire à celui que j'ai donné et de rien.Excel est encore en ignorant le guillemet.Je suis même allé jusqu'à élargir la définition avec des accolades et n'a toujours pas obtenir quelque chose.
La solution
Cette fonction a été conçue pour remplacer un caractère par un autre.Il n'a pas été conçu pour remplacer un caractère de rien.Ce qui se passe lorsque vous essayez de remplacer un personnage de rien, c'est que le Compteur de l'itération à travers la parole va maintenant chercher (à la dernière itération) pour une position de caractère qui est plus grande que la longueur du mot.Qui ne retourne rien, et lorsque vous essayez de déterminer ASC(<rien>) une erreur se produit.D'autres erreurs dans le remplacement de routine sera également se produire lorsque la longueur de la chaîne est modifié alors que le code est en cours d'exécution
Pour modifier la routine de remplacer un caractère par un rien, je vous suggère les suivantes:
Dans le Cas des déclarations:
Case 34
S = .Replace(S, I, 1, Chr(1))
Et dans l'instruction d'affectation:
ReplaceAccentedCharacters = Replace(S, Chr(1), "")
Notez que VBA de remplacement est différent de Worksheetfunction Remplacer
Autres conseils
Essayez ceci:
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