Excel용 VBA에서 .Replace를 사용하여 문자 제거
문제
오늘 오전에 제가 문의한 답변을 통해 다음과 같은 기능이 주어졌습니다.
내가 하려는 것은 VBA를 사용하여 Excel의 문자열에서 문자를 제거하는 것입니다.그러나 함수가 실행될 때마다 저장된 값이 지워지고 결과가 반환됩니다. #!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
문자열에 다음이 포함된 경우 "
(또는 10진수는 34, 16진수는 22...둘 다 사용했습니다) 따옴표를 제거해야합니다.그러나 대신 Excel에서는 이를 무시하고 여전히 다음을 반환합니다. "
어쨌든 표시해.
그런 다음 계속해서 교체하려고했습니다. .Replace()
다른 값을 가진 절.
Case 34
S = .Replace(S, I, 1, "/")
End Select
위의 코드를 사용하면 스크립트는 실제로 "를 /로 바꿉니다.
결국 Stack Overflow에서 다음 예제를 찾았습니다.https://stackoverflow.com/a/7386565/692250
그리고 주어진 답변에서 제가 제공한 코드 예제와 유사하지만 아무것도 없는 동일한 코드 예제를 볼 수 있습니다.Excel에서는 여전히 따옴표를 무시하고 있습니다.심지어 중괄호를 사용하여 정의를 확장했지만 여전히 아무것도 얻지 못했습니다.
해결책
이 기능은 한 문자를 다른 문자로 바꾸도록 설계되었습니다.문자를 아무것도 대체하지 않도록 설계되지 않았습니다.문자를 아무것도 없는 것으로 바꾸려고 하면 단어를 반복하는 카운터가 이제 (마지막 반복에서) 단어의 길이보다 큰 문자 위치를 찾습니다.이는 아무것도 반환하지 않으며 ASC(<아무것도 아님>) 오류가 발생합니다.코드가 실행되는 동안 문자열 길이가 변경되면 교체 루틴의 다른 오류도 발생합니다.
문자를 아무것도 바꾸지 않도록 루틴을 수정하려면 다음을 제안합니다.
Case 문에서:
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