2013-08-29 6 views
2

У меня есть длинный список имен в Excel, в котором все содержат «PP», за которым следует номер. например PP10 или P101.Как вытащить три числовых символа в строке?

Я хотел бы вывести цифры после «ПП». Я пробовал следующий код, но он, похоже, работает до PP99, что-либо с тремя числовыми символами после того, как «PP» не читается правильно.

For n = 1 To MyCount 

    If Mid(MyString, n, 2) = "PP" Then 

     If IsNumeric(Mid(MyString, n + 2, 1)) Then 

      PP_Image = Mid(MyString, n + 1, 3) 

     End If 
    End If 
Next n 


If IsNumeric(Mid(PP_Image, 2, 2)) Then 

    PP_Image = Mid(PP_Image, 2, 2) 

Else: IsNumeric (Mid(PP_Image, 2, 1)) 

    PP_Image = Mid(PP_Image, 2, 1) 

End If 

ответ

0

Проверьте свои показатели. Если Mid(MyString, n, 2) = "PP" и IsNumeric(Mid(MyString, n + 2, 1)) = True, то Mid(MyString, n + 1, 3) предоставит вам «Pxx» и оставьте последний номер. После этого ваши последующие проверки и конверсии будут отключены. Изменение назначения PP_Image к

PP_Image = Mid(MyString, n + 2, 3) 

примечание п + 2, чтобы идти в ногу с предыдущим поиском «ПП»

0

Возможно

Function PP_Image(ByVal MyString As String) As Double 

    Dim lPosition As Long 

    lPosition = InStr(1, MyString, "PP", vbTextCompare) 
    Select Case (lPosition > 0) 
     Case True: PP_Image = --Trim(Left(Replace(MyString, " ", String(99, " "), lPosition + 2), 99)) 
     Case Else: PP_Image = 0 
    End Select 

End Function 

Sub tst() 

    Dim varString As Variant 

    For Each varString In Array("Example PP10", "Example PP101") 
     MsgBox PP_Image(varString) ' => 10, 101 
    Next varString 

End Sub 
0

Вы можете иметь причины, почему это Безразлично Не работайте, но проверьте функцию Split(). Что-то вроде

PP_Image = Val(Split(MyString, "PP")(1)) 

дал бы численный ответ на что-либо в названии после «PP».

См. the MSDN documentation для получения дополнительной информации о Split().

+0

Это предполагает, что дополнительного текста за пределами PP # нет. Если бы текст был чем-то вроде «Пример OO11 PP222 QQ3456», то этот метод не предоставил бы корректных результатов. – tigeravatar

+0

Однако, если текст заканчивается после PP #, как показано в примерах пользователя, то метод Split будет работать отлично. – tigeravatar

+1

Приведенные выше примеры были «Example PP #». Работа над этим будет двойной сплит: «PP_Image = Val (Split (Split (MyString,« PP ») (1),« ») (0))' То есть, если после пробела есть пробел , –

0
Sub Tester() 
    Debug.Print PPMatch("sdhgs sh s PP22 ggg") 
    Debug.Print PPMatch("sdhgs sh s PPs66 ggg") 
    Debug.Print PPMatch("sdhgs sh s PP555555 ggg") 
    Debug.Print PPMatch("sdhgs sh s PP0 ggg")  
End Sub 


Function PPMatch(txt As String) 
Dim re As Object, matches, match 

    Set re = CreateObject("vbscript.regexp") 
    re.Pattern = "PP(\d+)" 
    re.ignorecase = False 
    re.Global = True 
    Set matches = re.Execute(txt) 
    If matches.Count > 0 Then 
     PPMatch = matches(0).submatches(0) 
    Else 
     PPMatch = "" 
    End If 
End Function 
Смежные вопросы