Frage

Die folgende Funktion wurde mir durch eine Antwort gegeben, die ich heute zuvor gefragt habe.

Ich versuche, mit VBA ein Zeichen aus einer Zeichenfolge in Excel zu entfernen.Allerdings löscht die Funktion bei jeder Ausführung den gespeicherten Wert und gibt a zurück #!VALUE Fehler.Ich kann anscheinend nicht herausfinden, was los ist.Hat jemand etwas dagegen, eine Alternative zu erklären:

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

Wenn die Zeichenfolge a enthält " (oder Zeichencode 34 in Dezimalzahl, 22 in Hexadezimalzahl ...Ich habe beides verwendet) Es soll das Anführungszeichen entfernen.Stattdessen ignoriert Excel es jedoch und gibt trotzdem das zurück " trotzdem markieren.

Ich habe dann versucht, das zu ersetzen .Replace() Klausel mit einem anderen Wert.

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

Mit dem obigen Code ersetzt das Skript tatsächlich das „ durch ein /.

Am Ende habe ich hier in Stack Overflow das folgende Beispiel gefunden:https://stackoverflow.com/a/7386565/692250

Und in der gegebenen Antwort sehe ich genau dasselbe Codebeispiel, das dem von mir gegebenen ähnelt, und nichts.Excel ignoriert immer noch das Anführungszeichen.Ich bin sogar so weit gegangen, die Definition mit geschweiften Klammern zu erweitern und habe trotzdem nichts bekommen.

War es hilfreich?

Lösung

Diese Funktion wurde entwickelt, um ein Zeichen durch ein anderes zu ersetzen.Es war nicht dazu gedacht, einen Charakter durch nichts zu ersetzen.Wenn Sie versuchen, ein Zeichen durch nichts zu ersetzen, passiert, dass der Zähler für die Iteration durch das Wort nun (bei der letzten Iteration) nach einer Zeichenposition sucht, die größer als die Länge des Wortes ist.Das gibt nichts zurück, und wenn Sie versuchen, ASC(<Nichts>) ein Fehler auftritt.Andere Fehler in der Ersetzungsroutine treten auch auf, wenn die Länge der Zeichenfolge geändert wird, während der Code ausgeführt wird

Um die Routine so zu ändern, dass ein Zeichen durch nichts ersetzt wird, würde ich Folgendes vorschlagen:

In den Case-Anweisungen:

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

Und in der Zuordnungserklärung:

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

Beachten Sie, dass sich VBA-Ersetzen von der Arbeitsblattfunktion Ersetzen unterscheidet

Andere Tipps

Versuche dies:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top