Как извлечь числовую последовательность / символы после термина Excel VBA - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь извлечь точную последовательность после термина в тексте и просто возвращает число.

Мне нужна вся последовательность для возврата, с цифрами и символами между цифрами.

Например:

enter image description here

Я использую этот код VBA:

Function ExtraiSeq(rng As Range)
    Dim i As Integer, str As String, CharPos As Long
    str = rng.Value
    CharPos = InStr(1, str, "SEQ", vbTextCompare) + 2
    If CharPos > 2 Then
        For i = CharPos To Len(rng)
            Select Case Asc(Mid(rng.Value, i, 1))
            Case 48 To 57
                ExtraiSeq = Trim(ExtraiSeq & Mid(rng.Value, i, 1))
            End Select
        Next i
    Else: ExtraiSeq = ""
    End If
End Function

Ответы [ 4 ]

0 голосов
/ 25 августа 2018

Попробуйте это.

Function ExtraiSeq(rng As Range)
    Dim vS, vS2
    Dim s As String

    vS = Split(rng, "seq")
    s = vS(UBound(vS))
    If InStr(s, ")") Then
        vS2 = Split(s, ")")
        s = vS2(0)
    End If
    s = Trim(s)
    ExtraiSeq = s

End Function
0 голосов
/ 24 августа 2018

попробовать

Option Explicit

Function justDigits(str As String)
    Dim i As Long

    i = InStr(1, str, "seq ", vbTextCompare)

    If CBool(i) Then
        For i = i + 4 To Len(str)
            Select Case Asc(Mid(str, i, 1))
                Case 46 To 57
                    justDigits = justDigits & Mid(str, i, 1)
                Case else
                    Exit For
            End Select
        Next i
    End If
End Function

enter image description here

0 голосов
/ 24 августа 2018

Предполагая, что в столбце «А» есть значения, вставьте этот код в редактор VBA. Результаты будут скопированы в столбец «B». Затем запустите Sub "CreateString".

Function FindReplace(CellValue$)
    Dim strPattern$: strPattern = "[^0-9.\/-]+"    'Pattern to only take care of numbers, (/), (-) and (.).
    Dim strReplace$: strReplace = ""    'Replace everything else with blank
    Dim regex As Object
    Set regex = CreateObject("vbscript.regexp")

    With regex
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .Pattern = strPattern
    End With
    FindReplace = regex.Replace(CellValue, strReplace) 'RegEx Function replaces the pattern with blank
End Function

Sub CreateString()
    Dim LastRow%: LastRow = ActiveSheet.UsedRange.Rows.Count
    Dim strConcatenate$, i%, j%
    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim ws As Worksheet: Set ws = wb.ActiveSheet

    For i = 1 To LastRow
        ws.Cells(i, 2) = FindReplace(ws.Cells(i, 1))
        strConcatenate = ""
    Next i
End Sub

Function LastColumn(row%) As Integer
    Dim ws As Worksheet: Set ws = ThisWorkbook.ActiveSheet
    LastColumn = ws.Cells(row, ws.Columns.Count).End(xlToLeft).Column
End Function

редактировать - результат:

enter image description here

0 голосов
/ 24 августа 2018

Обновленный ответ:

Сохранение всех символов между первым номером, найденным после "seq", и последним найденным номером, который вы можете использовать:

Function getNumbersFromString(strIn As String, strTerm As String) As String
    Step1 = Trim(Mid(strIn, InStr(1, strIn, strTerm) + 3, Len(strIn)))

    For startIndex = 1 To Len(Step1)
        If IsNumeric(Mid(Step1, startIndex, 1)) Then Exit For
    Next
    For endIndex = Len(Step1) To 1 Step -1
        If IsNumeric(Mid(Step1, endIndex, 1)) Then Exit For
    Next

    getNumbersFromString = Mid(Step1, startIndex, endIndex - startIndex + 1)

End Function

Исходный неправильный ответ:

Я думаю, что что-то вроде следующего поможет вам:

Function getNumbersFromString(strIn As String) As String
    For Each char In Split(StrConv(strIn, 64), vbNullChar)
        If IsNumeric(char) Then getNumbersFromString = getNumbersFromString & char
    Next char
End Function

Это разбивает входящую строку на массив, где каждый элемент является символом.Затем он просто проверяет, является ли он числовым.Если это так, он добавляется к выводу.

Вы можете использовать его как UDF, поэтому в свою ячейку вы можете просто вставить:

=getNumbersFromString(A1)

Если вы хотите, чтобы числа только после вашего "seq" термин, который вы можете сделать что-то вроде:

Function getNumbersFromStringAfterTerm(strIn As String, strTerm As String) As String
    For Each char In Split(StrConv(Mid(strIn, InStr(1, strIn, strTerm), Len(strIn)), 64), vbNullChar)
        If IsNumeric(char) Then getNumbersFromStringAfterTerm = getNumbersFromStringAfterTerm & char
    Next char
End Function

, который будет использоваться как:

=getNumbersFromStringAfterTerm(A1, "seq")
...