Excel 셀에서 여러 부분 문자열 추출


0

나는 각 셀이 다음과 같은 하나 또는 그 이상의 항목을 포함 할 수있는 끔찍한 형식의 열이 있습니다 (이 중 하나에는 두 개가 포함됨).

ACTI-U-9754 - Some description MDCF-U-9791 - Some other description

11 개의 문자열을 별도의 열로 추출해야하며, 수식을 사용하는 것이 더 바람직합니다. 위의 셀에는 다음과 같이 표시되어야합니다.

ACTI-U-9754
MDCF-U-9791

이 특정 시나리오를 다루는 예제를 찾지 못했습니다.


1
코드는 항상 xxxx-x-xxxx와 같은 형식입니까? 더 큰 데이터 샘플을 게시 할 수 있습니까? VBA 또는 Power Query와 관련된 접근 방식에 대해 열려 있습니까?
teylyn

1
센터 캐릭터는 항상 "U"입니까? "항목"당 몇 개의 하이픈이 있습니까? (코드 내 2 개, 정확히 1 개의 설명 접두사, 설명 내의 임의의 숫자도 가능) 첫 번째 4 문자는 항상 대문자입니까? 마지막 4 문자는 항상 숫자입니까?
fixer1234

예, 코드의 형식은 항상 같습니다. xxxx-x-xxxx
Jozef

-귀하의 설명 에 a 가 나타날 수 있습니까?
카일

VBA의 사용은 코드의 형식을 얼마나 정확하게 예측할 수 있는지에 달려 있습니다. 형식을 xxxx-x-xxxx로 확인했지만 코드가 항상 중간에 -U-가 있는지 알려 주시면 정규식과 VBA가 필요하지 않으므로 순수 수식이 작동합니다.
Terry

답변:


1

나는 단순한 수식 방법을 생각할 수 없다는 것이 두려운 것이지만, RegEx를 사용하는 VBA 방법은 당신에게 어떤 용도로든 사용할 수 있기 때문에 여기에 있습니다. RegEx 패턴은 코드가 항상 같다고 가정 4 letters - 1 letter - 4 digits합니다. 물론 필요에 따라 수정할 수 있습니다. 문자와 숫자의 가정이 잘못되었지만 형식이 항상 4-1-4 인 경우 .{4}\-.\-.{4}대신 다음을 사용할 수 있습니다 .

여기에 이미지 설명을 입력하십시오.

Sub GetCodes()
    Dim strPattern: strPattern = "\w{4}\-\w\-\d{4}"   'Pattern to match
    Dim colNumber: colNumber = 1                        'Column number containing strings (In this case, 1, for column A)
    Dim rowCount: rowCount = 1                          'Row number to start from
    Range("B1").Select                                  'Cell to start new column from

    'Create a new RegEx engine instance
    Dim rgx: Set rgx = CreateObject("vbscript.regexp")

    'Set out RegEx instance to allow Global (More than 1 result per text), MultiLine (Incase there are any carriage returns in the cell), IgnoreCase (Allow both upper and lowercase, which isn't needed with \w but included to be sure) and Pattern, the patter defined above.
    With rgx
        .Global = True
        .MultiLine = True
        .IgnoreCase = True
        .Pattern = strPattern
    End With

    'Begin a loop that ends once we hit an empty cell
    Do
        'Get all our RegEx matches and store them in rgxMatches
        Dim rgxMatches: Set rgxMatches = rgx.Execute(Cells(rowCount, colNumber).Value)
        Dim rgxMatch
        'Loop through our matches
        For Each rgxMatch In rgxMatches
            'Write the match into the active cell
            ActiveCell.Value = rgxMatch.Value
            'Go down one row, ready to write the next cell if there is one
            ActiveCell.Offset(1, 0).Select
        Next

        'Increment our row count so the next loop uses the next row
        rowCount = rowCount + 1
    Loop Until IsEmpty(Cells(rowCount, colNumber))

    'Clean up after
    Set rgx = Nothing
    Set rgxMatches = Nothing
End Sub

여기에 이미지 설명을 입력하십시오.


귀하의 코드는 오직 하나의 입력 셀과 함께 작동하지만, 나는 그가 많은 포맷을해야한다고 생각합니다. 이 경우 어떻게 코드를 사용할 수 있습니까?
Máté Juhász,

오케이, 더 깊이 읽고 지금 코드를 이해합니다. 그러나 나는 아직도 당신이 VBA를 잘 모르는 사람에 대한 답변으로 이것을 게시하는 데 동의 할 수 없습니다. 그의 데이터가 U2에서 시작한다면 무엇을 바꿀지를 어떻게 알 수 있을까요?
Máté Juhász,

흠. 공정한 점이지만, 내 대답이 응답으로 덜 유효하게하는지 확신 할 수 없습니다. 코드는 그가 원하는 것을 수행하고, 소스가 수정이 필요한 경우 바로 거기에 있습니다. 나는 공식이 아니고 그가 원하는 것이 아닐지도 모른다는 우려를 제기했지만, 개인적으로는 VBA가 매머드 수식보다 읽고 이해하기가 훨씬 쉽지만 유사한 업무에 필요합니다.) 제가 노트북에 돌아 왔을 때 도움이된다면 몇 가지 의견을 추가하겠습니다.
Jonno

@ MátéJuhász이게 더 명확하다고 생각되면 알려주십시오. 일반적으로 사용자가 정의한 첫 번째 변수를 편집하려는 변수를 만듭니다.
Jonno
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.