2017-05-06 4 views
2

VBA 전문가,문자열 끝에 문자를 제거하는 Excel VBA 함수

문자열 변수에서 마지막 문자 [A-Z]를 제거하는 함수를 작성하려고합니다. 예를 들어

:

Sub Example() 
Dim MyString() as string 
... 
ReDim Preserve MyString(3) 

MyString(1) = "ABC345A" 
MyString(2) = "DEFG6789BC" 
MyString(3) = "AHIL2431LTR" 

MyString(1) = RemLetters(MyString(1)) 
MyString(2) = RemLetters(MyString(2)) 
MyString(3) = RemLetters(MyString(3)) 
... 
... 
End Sub 

Function RemLetters(MyString) 
??? 
End Function 

... 내가 함수가 반환 할 것으로 예상하고있어

: 첫 번째 숫자까지

MyString(1) = "ABC345" 
MyString(2) = "DEFG6789" 
MyString(3) = "AHIL2431" 

그래서 모든 문자를 제거해야 ...

건배, Andy

+0

뭐니 뭐니해도 될까요? – Plirkee

답변

1

나는이 솔루션을 Testet하고 작동합니다. 그것은 마지막 Char를 항상 보며 숫자인지 아닌지를 확인합니다. 그렇지 않으면 마지막 Char 등을 자릅니다.

Sub Example() 
    Dim MyString() As String 

ReDim Preserve MyString(3) 

MyString(1) = "ABC345A" 
MyString(2) = "DEFG6789BC" 
MyString(3) = "AHIL2431LTR" 

MyString(1) = RemLetters(MyString(1)) 
MyString(2) = RemLetters(MyString(2)) 
MyString(3) = RemLetters(MyString(3)) 

End Sub 

Function RemLetters(MyString As String) As String 
Dim bolExit As Boolean 
bolExit = True 
Do While bolExit = True 
    Select Case Asc(Right$(MyString, 1)) 
      Case 65 To 90, 97 To 122 
       'IsLetter = True 
       MyString = Left$(MyString, Len(MyString) - 1) 
      Case Else 
       'IsLetter = False 

       bolExit = False 
     End Select 
Loop 
RemLetters = MyString 
End Function 
+1

답장을 보내 주신 모든 분들께 감사드립니다. 이 예제가 정확히 필요한 것 같습니다. ** 그러나 ** 다른 솔루션도 좋으며 이미 다른 기능을 사용할 수있었습니다. 건배. – Andy

2

다음 솔루션은 당신이 찾고있는 것을 수 있습니다 : 2 그룹과 일치하는

패턴 (\w+\d+)(\w+)는 말한다 :

Option Explicit 

Function RemLetters(MyString As String) As String 

Dim i As Long 

MyString = StrReverse(MyString) 
For i = 1 To Len(MyString) 
    If Asc(Mid(MyString, i, 1)) >= 48 And _ 
     Asc(Mid(MyString, i, 1)) <= 57 Then Exit For 
Next i 
RemLetters = Mid(StrReverse(MyString), 1, Len(MyString) - i + 1) 

End Function 
2

당신은 정규 표현식을 사용할 수 있습니다. 첫 번째 그룹은 몇 글자이며 그 뒤에 숫자가옵니다. 두 번째 그룹은 몇 글자입니다. 그런 다음 Replace 함수는 원래 문자열을 첫 번째 그룹으로 바꾸고 두 번째 그룹은 무시한다는 의미입니다. 이렇게하면 몇 글자의 첫 번째 그룹 및 일부 숫자 만 남게됩니다.

Option Explicit 

Sub Example() 

    Dim MyString() As String 

    ReDim Preserve MyString(3) 

    MyString(1) = "ABC345A" 
    MyString(2) = "DEFG6789BC" 
    MyString(3) = "AHIL2431LTR" 

    MyString(1) = RemLetters(MyString(1)) 
    MyString(2) = RemLetters(MyString(2)) 
    MyString(3) = RemLetters(MyString(3)) 

    Debug.Print MyString(1) 
    Debug.Print MyString(2) 
    Debug.Print MyString(3) 

End Sub 

Function RemLetters(MyString) As String 
    Dim objRegex As Object 
    Dim strOut As String 

    Set objRegex = CreateObject("VBScript.Regexp") 
    With objRegex 
     .Pattern = "(\w+\d+)(\w+)" 
     .Global = True 
     strOut = .Replace(MyString, "$1") 
    End With 

    RemLetters = strOut 

End Function 
2

또 다른 방법 :

Public Function RemoveCharFromString(ByVal stringValue As String) As String 

    Dim idx As Long, charCounter As Long 
    For idx = Len(stringValue) To 1 Step -1 
     If IsNumeric(Mid(stringValue, idx, 1)) Then Exit For 
     charCounter = charCounter + 1 
    Next idx 

    RemoveCharFromString = Left(stringValue, Len(stringValue) - charCounter) 
End Function 
1

또는 정규식도 같이 사용할 수 있습니다 ...

Function RemLetters(MyString) As String 
    Dim objRegex As Object 
    Dim strOut As String 

    Set objRegex = CreateObject("VBScript.Regexp") 
    With objRegex 
     .Pattern = "\w+\d+" 
     .Global = False 
     If .test(MyString) Then strOut = .Execute(MyString)(0) 
    End With 

    RemLetters = strOut 

End Function 

Sub Example() 

    Dim MyString() As String 

    ReDim Preserve MyString(3) 

    MyString(1) = "ABC345A" 
    MyString(2) = "DEFG6789BC" 
    MyString(3) = "AHIL2431LTR" 

    MyString(1) = RemLetters(MyString(1)) 
    MyString(2) = RemLetters(MyString(2)) 
    MyString(3) = RemLetters(MyString(3)) 

    Debug.Print MyString(1) 
    Debug.Print MyString(2) 
    Debug.Print MyString(3) 

End Sub