Rimozione dei personaggi con .replace in VBA per Excel
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.
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
.