извлечь несколько выражений - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть ячейка, которая содержит имена пользователей, назначенные таким проектам

,FC757_random_name,AP372_another_one,FC782_again_different,FC082_samesamebutdifferent,

Мне нужно только извлечь буквенно-цифровые значения, с которых начинаются выражения, поэтому все находится между , и _.

Я заставил его работать для одного выражения со следующим, но мне нужны все они.

= MID(A1;FIND(",";A1)+1;FIND("_";A1)-FIND(",";A1)-1)

Я также возился с текстом в данные, но не мог заставить его работать сразу для нескольких строк. В идеале это будет работать только с формулами, но я думаю (/ боюсь) мне понадобятся VBA или макросы, с которыми я никогда раньше не работал.

Вся помощь будет оценена!

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Я полагаю, что вы ищете что-то вроде этого Нажмите Alt + F11, затем выберите Вставить> Модуль и вставьте следующий код:

Public Function GetUsers(UserNameProject As String)

Dim userArray() As String
Dim users As String
Dim intPos As Integer

'this will split the users into an array based on the commas
userArray = Split(UserNameProject, ",")

'loop through the array and process any non blank element and extract user
'based on the position of the first underscore
For i = LBound(userArray) To UBound(userArray)
      If Len(Trim(userArray(i))) > 0 Then
        intPos = InStr(1, userArray(i), "_")
        users = users & "," & Left(userArray(i), intPos - 1)
      End If
Next

GetUsers = users

End Function

Если ваша строка находится в A1, используйте =GetUsers(A1) в соответствующей ячейке. Я думаю, это должно помочь вам начать!

0 голосов
/ 24 апреля 2018

Чтобы очистить данные от лишних запятых, используйте эту формулу в ячейке B1:

=TRIM(SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(SUBSTITUTE(A1;" ";"||");";";" "));" ";";");"||";" "))

Затем используйте эту формулу в ячейке C1 и копируйте вверх и вниз, чтобы извлечь только часть, которую вы хотите из каждого раздела:

=IFERROR(INDEX(TRIM(LEFT(SUBSTITUTE(TRIM(MID(SUBSTITUTE($B1;";";REPT(" ";LEN($B1)));LEN($B1)*(ROW($A$1:INDEX($A:$A;LEN($B1)-LEN(SUBSTITUTE($B1;";";""))+1))-1)+1;LEN($B1)));"_";REPT(" ";LEN($B1)));LEN($B1)));COLUMN(A1));"")
0 голосов
/ 24 апреля 2018

Вот пользовательская функция на основе .

Option Explicit

Function extractMultipleExpressions(str As String, _
                  Optional delim As String = ", ")
    Dim n As Long, nums() As Variant
    Static rgx As Object, cmat As Object

    'with rgx as static, it only has to be created once; beneficial when filling a long column with this UDF
    If rgx Is Nothing Then
        Set rgx = CreateObject("VBScript.RegExp")
    End If
    extractMultipleExpressions = vbNullString

    With rgx
        .Global = True
        .MultiLine = False
        .Pattern = "[A-Z]{2}[0-9]{3}"
        If .Test(str) Then
            Set cmat = .Execute(str)
            'resize the nums array to accept the matches
            ReDim nums(cmat.Count - 1)
            'populate the nums array with the matches
            For n = LBound(nums) To UBound(nums)
                nums(n) = cmat.Item(n)
            Next n
            'convert the nums array to a delimited string
            extractMultipleExpressions = Join(nums, delim)
        End If
    End With
End Function

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...