Вопрос

Следующая функция была предоставлена ​​мне через ответ, который я задал ранее сегодня.

Я пытаюсь удалить символ из строки в 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top