Removendo caracteres .Substituir em VBA para Excel
Pergunta
A função a seguir foi dada a mim através de uma resposta que eu pedi hoje cedo.
O que eu estou tentando fazer é remover um caractere de uma seqüência de caracteres no Excel utilizando VBA.No entanto, sempre que a função for executada, acaba por apagar o valor armazenado e retornar um #!VALUE
erro.Me parece que não consegue descobrir o que está acontecendo.Ninguém mente explicando uma 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 a seqüência de caracteres contém um "
(ou código de caractere 34 em Decimal, 22, em Hexadecimal...Eu usei ambos) é suposta para remover as aspas.No entanto, em vez disso, o Excel ignora, e ainda devolve o "
marca de qualquer maneira.
Então eu tentei ir em frente e substitua o .Replace()
cláusula com outro valor.
Case 34
S = .Replace(S, I, 1, "/")
End Select
Usando o código acima, o script de facto não substitua o " com um /.
Acabei encontrando o exemplo a seguir aqui no Estouro de Pilha:https://stackoverflow.com/a/7386565/692250
E a resposta dada, eu vejo exatamente o mesmo exemplo de código semelhante ao que eu fiz e nada.O Excel é ainda ignorando as aspas.Eu mesmo fui tão longe para expandir a definição de chaves e ainda não consegui nada.
Solução
Esta função foi criada para substituir um personagem com o outro.Ele não foi projetado para substituir um caractere com nada.O que acontece quando você tenta substituir um personagem que não tem nada é que o Contador para iterar através da palavra vai agora analisar (o que, em última iteração) para uma posição de caractere que é maior do que o comprimento da palavra.Que não retorna nada, e quando você tenta determinar ASC(<nada>) ocorre um erro.Outros erros na substituição de rotina também irá ocorrer quando o comprimento da cadeia é alterado enquanto o código está sendo executado
Para modificar a rotina para substituir um personagem que não tem nada, eu gostaria de sugerir o seguinte:
No Caso de declarações:
Case 34
S = .Replace(S, I, 1, Chr(1))
E na instrução de atribuição:
ReplaceAccentedCharacters = Replace(S, Chr(1), "")
Note que VBA Substituir é diferente de Substituir Worksheetfunction
Outras dicas
Tente isso:
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