Domanda

La seguente funzione mi è stata data tramite una risposta che ho chiesto prima oggi.

Che cosa sto cercando di fare è rimuovere un personaggio da una stringa in Excel usando VBA. Tuttavia, ogni volta che funziona la funzione, finisce per cancellare il valore memorizzato e restituendo un errore #!VALUE. Non riesco a capire cosa sta succedendo. Qualcuno mente spiega un'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
.

Quando la stringa contiene un " (o codice di carattere 34 in decimale, 22 in esadecimale ... Ho usato entrambi) dovrebbe rimuovere il preventivo. Tuttavia, invece, Excel lo ignora e restituisce comunque il marchio ".

Ho quindi provato ad andare avanti e sostituire la clausola .Replace() con un altro valore.

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

Usando il codice sopra, lo script in effetti sostituisce "con A /.

Ho finito per trovare il seguente esempio qui in stack overflow: https://stackoverflow.com/a/7386565/692250

E nella risposta data, vedo lo stesso esempio esatto di codice simile a quello che ho dato e niente. Excel sta ancora ignorando il preventivo. Sono anche andato così lontano da espandere la definizione con bretelle ricci e ancora non ha ottenuto nulla.

È stato utile?

Soluzione

Questa funzione è stata progettata per sostituire un carattere con un altro.Non è stato progettato per sostituire un personaggio con niente.Cosa succede quando si tenta di sostituire un personaggio con niente è che il contatore per iterazioni attraverso la parola ora guarderà (all'ultima iterazione) per una posizione di carattere che è maggiore della lunghezza della parola.Questo non restituisce nulla e quando si tenta di determinare ASC (<< EM> Niente >) si verifica un errore.Altri errori nella routine sostitutiva si verificheranno anche quando la lunghezza della stringa viene modificata mentre il codice è in esecuzione

Per modificare la routine per sostituire un carattere con niente, suggerirei quanto segue:

Nelle istruzioni del caso:

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

e nell'istruzione di assegnazione:

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

Nota che VBA Sostituisci è diverso dalla fogli di lavoro Sostituisci

Altri suggerimenti

Prova questo:

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
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top