2017-05-06 93 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這個解決方案,它的工作原理。它總是看最後一個字符,看起來它是否是數字。如果不是,則切斷最後一個字符,等等。

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

下面的解決方案可能是你在找什麼:

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

您可以使用正則表達式:

模式(\w+\d+)(\w+)說,以配合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