Как я могу найти числовое значение после символа в той же ячейке.

Например: найти номер 01 после J* . У меня есть несколько строк, и в каждой строке значения, как J*01 или J*08 .

В настоящее время я пытаюсь разделить символы и цифры с помощью функции VBA InStr :

 Sub zz()
   Dim ii As Long, z As Integer, xlastrow As Long
   Dim yy As String
   xlastrow = Worksheets("Sheet1").UsedRange.Rows.Count
     For ii = 1 To xlastrow
       yy = "J*"
       z = 1         
       If IsNumeric(Worksheets("Sheet1").Range("B" & ii)) Then       
         'This line is separating numbers after J* character and pasting to sheet2
         Seprate.Find.Range("B" & ii, yy).Value = Worksheet("Sheet2").Range("A" & z)
       End If
       z = z + 1
     Next ii    
 End Sub

3 ответа3

0

Это касается вашего вопроса, а не вашего примера кода. Если у вас есть строка вроде:

q1w2e3r4asJ * 66bvft654

и хотите извлечь две цифры после J *, затем попробуйте этот маленький UDF

Public Function RetDigits(sIN As String) As String
    Dim lookFor As String, v As String
    lookFor = "J*"
    RetDigits = ""
    If InStr(sIN, lookFor) = 0 Then Exit Function
    ary = Split(sIN, lookFor)
    If Len(ary(1)) < 2 Then Exit Function
    RetDigits = Left(ary(1), 2)
End Function

Например:

EDIT # 1:

Вот версия, которая будет возвращать более 2 цифр:

Public Function RetDigits(sIN As String) As String
    Dim lookFor As String, v As String, ary
    Dim i As Long, CH As String
    lookFor = "J*"
    RetDigits = ""
    If InStr(sIN, lookFor) = 0 Then Exit Function
    ary = Split(sIN, lookFor)
    If Len(ary(1)) < 2 Then Exit Function

    For i = 1 To Len(ary(1))
        CH = Mid(ary(1), i, 1)
        If IsNumeric(CH) Then
            RetDigits = RetDigits & CH
        End If
    Next i
End Function

и вот тестовая процедура:

Sub main()
    Dim st As String, out As String
    st = "hfskfhjsdfshjJ*123456"
    out = RetDigits(st)
    MsgBox out
End Sub
0

Вот еще одна пользовательская функция, которая будет возвращать все цифры после определенной строки (префикс). В аргументах вы указываете строку для обработки и префикс для использования. Вы также можете указать, должен ли префикс быть чувствительным к регистру. По умолчанию он НЕ учитывает регистр, но это легко изменить.

UDF использует регулярные выражения для обработки текста. Сначала мы удаляем все, вплоть до префикса. Затем мы удаляем все не-цифры в остатке.

===================================

Option Explicit
Function DigitsAfter(sInput, sPrefix, Optional MatchCase As Boolean = False) As String
    Dim re As Object
    Dim S As String
    Dim sPatPrefix As String
    Const sPat As String = "\D"

'Intialize Regex engine
Set re = CreateObject("vbscript.regexp")
With re
    .Global = True
    .ignorecase = Not MatchCase
End With

'Generate the digit prefix
re.Pattern = "(.)"
sPatPrefix = ".*" & re.Replace(sPrefix, "\$1")

'Remove characters up to and including the prefix
re.Pattern = sPatPrefix
    If re.test(sInput) = False Then

'Exit if prefix not in string
        DigitsAfter = "Digit Prefix not in String"
        Exit Function

'now remove all the non-digits that are left
    Else
        S = re.Replace(sInput, "")
        re.Pattern = sPat
        DigitsAfter = re.Replace(S, "")
    End If
End Function

=====================================

Вот короткая процедура, показывающая, как ее можно использовать в большем макросе:

======================================

Option Explicit
Sub TestDigitFunction()
    Const S As String = "abc12x97J*24AAA123"

    MsgBox S & vbLf & DigitsAfter(S, "J*")

End Sub

======================================

0

Чтобы найти значение ровно двух цифр после " J* ", вам не нужен VBA. Если строка в A1, просто используйте: =VALUE(MID(A1;SEARCH("J*";A1)+2;2)) . Функция SEARCH ищет « J* ». MID принимает следующие два символа, а VALUE преобразует их в значение.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .