Удаление символов с помощью .Replace в VBA для Excel
Вопрос
Следующая функция была предоставлена мне через ответ, который я задал ранее сегодня.
Я пытаюсь удалить символ из строки в Excel с помощью VBA.Однако всякий раз, когда функция запускается, она стирает сохраненное значение и возвращает #!VALUE
ошибка.Кажется, я не могу понять, что происходит.Кто-нибудь не против объяснить альтернативу:
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
Когда строка содержит "
(или код символа 34 в десятичном формате, 22 в шестнадцатеричном...Я использовал оба) предполагается убрать кавычки.Однако вместо этого Excel игнорирует его и по-прежнему возвращает "
все равно отметьте.
Затем я попытался пойти дальше и заменить .Replace()
предложение с другим значением.
Case 34
S = .Replace(S, I, 1, "/")
End Select
Используя приведенный выше код, сценарий действительно заменяет « на /.
В итоге я нашел следующий пример здесь, в Stack Overflow:https://stackoverflow.com/a/7386565/692250
И в данном ответе я вижу тот же самый пример кода, похожий на тот, который я дал, и ничего.Excel по-прежнему игнорирует кавычки.Я даже дошел до того, что расширил определение фигурными скобками, но все равно ничего не получил.
Решение
Эта функция была разработана для замены одного символа другим.Он не был создан для того, чтобы заменить персонажа ничем.Что происходит, когда вы пытаетесь заменить символ ничем, так это то, что счетчик перебора слова теперь будет искать (на последней итерации) позицию символа, превышающую длину слова.Это ничего не возвращает, и когда вы пытаетесь определить ASC(<ничего>) возникает ошибка.Другие ошибки в процедуре замены также возникнут, если длина строки будет изменена во время выполнения кода.
Чтобы изменить процедуру замены символа ничем, я бы предложил следующее:
В заявлениях по делу:
Case 34
S = .Replace(S, I, 1, Chr(1))
И в операторе присваивания:
ReplaceAccentedCharacters = Replace(S, Chr(1), "")
Обратите внимание, что замена VBA отличается от функции замены рабочего листа.
Другие советы
Попробуй это:
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