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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top