Вложенный оператор if внутри цикла for

Я изменяю пользовательскую функцию, которую я написал. Он удаляет специальные символы из ячейки (я писал об этой функции несколько раз, так как я продолжаю расширять ее и узнавать больше о возможностях VBA).

Сейчас я пытаюсь добавить MsgBox, который всплывает и сообщает пользователю, какие специальные символы были удалены. Я думаю, что я могу сделать это с помощью оператора If, вложенного в существующий цикл for, например:

Function removeSpecial(sInput As String) As String
    Dim sSpecialChars As String
    Dim i As Long
    Dim sReplaced As String
    sSpecialChars = "\/:*?™""®<>|.&@# %(_+`©~);-+=^$!,'" 'This is your list of characters to be removed
    For i = 1 To Len(sSpecialChars)
        sInput = Replace$(sInput, Mid$(sSpecialChars, i, 1), "")
        If (sInput = sSpecialChars) Then 'If statement to check when a character has been removed
        sReplaced = sInput 'String variable to store each special character which was replaced
    Next
    MsgBox sReplaced & " These were removed"
    sInput = UCase(sInput)
    removeSpecial = sInput

End Function 'end of function

В настоящее время это приводит меня в бесконечный цикл, и я вынужден закрыть Excel. Что я пытался сделать с помощью приведенного выше кода, так это проверить, найден ли отдельный символ по какому-либо индексу, который просматривает функция Mid, и затем сохранить этот символ, если он будет заменен, в String sReplaced. Ясно, хотя, я над моей головой.

Спасибо тебе за помощь.

2 ответа

Решение

Попробуй это:

Function removeSpecial(sInput As String) As String
    Dim sSpecialChars As String
    Dim i As Long
    Dim sReplaced As String
    Dim ln As Integer

    sSpecialChars = "\/:*?™""®<>|.&@# %(_+`©~);-+=^$!,'" 'This is your list of characters to be removed
    For i = 1 To Len(sSpecialChars)
        ln = Len(sInput)
        sInput = Replace$(sInput, Mid$(sSpecialChars, i, 1), "")
        If ln <> Len(sInput) Then sReplaced = sReplaced & Mid$(sSpecialChars, i, 1)
    Next
    MsgBox sReplaced & " These were removed"
    sInput = UCase(sInput)
    removeSpecial = sInput

End Function 'end of function

Пожалуйста, изучите эту версию:

Function removeSpecial(sInput As String) As String

    Dim sSpecialChars As String, sTemp As String
    Dim i As Long
    Dim sReplaced As String
    sTemp = sInput
    sSpecialChars = "\/:*?™""®<>|.&@# %(_+`©~);-+=^$!,'"

    For i = 1 To Len(sSpecialChars)
        ch = Mid(sSpecialChars, i, 1)
        If InStr(sTemp, ch) > 0 Then
            sTemp = Replace$(sTemp, ch, "")
            sReplaced = sReplaced & ch
        End If
    Next

    MsgBox sReplaced & " These were removed"
    sTemp = UCase(sTemp)
    removeSpecial = sTemp
End Function

Примечание. Это не будет пытаться изменить входные данные, а только вернет "очищенную" выходную строку.

Другие вопросы по тегам