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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top