VB(A)/당근쨈 & Chronicle

[& Chronicle] 불규칙한 그룹의 문자열 구분

당근쨈 2017. 5. 3. 08:16
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=102020101&docId=112564336&page=1#answer2 에 올라온 질문입니다.

하나의 그룹마다 공백으로 이루어져있고, 알파벳부분과 나머지 부분으로 구분하여 셀에 출력하는 내용입니다.
그룹 안에는 데이터가 3개도 있고 4개도 있는 등 불규칙합니다. 아래의 두 가지가 질문에서 파악할 수 있는 규칙입니다.

        1. 하나의 그룹마다 공백으로 이루어져있다.
        2. 각 그룹의 첫번째 데이터와 나머지 데이터를 분리한다.

먼저 Chronicle님의 수식을 보겠습니다. - http://blog.naver.com/asaph16/220997237905
아래와 같이 보조열을 이용하여 영문자와 그렇지 않은 것을 구분한 것이 인상적입니다.
다음은 매크로의 풀이과정입니다.
        1. SpecialCells로 데이터가 있는 셀만 영역으로 지정한 뒤
        2. Areas를 이용하여 각 그룹을 순환합니다.
        3. 그룹 안에서 첫번째 데이터와 나머지 데이터를 구분하여 배열에 삽입합니다.
Option Base 1
Sub Macro()
 
    Dim AllArea As Range
    Dim SingleArea As Range
    Dim SingleRange As Range
    Dim v() As String
    Dim i As Integer
    
    '변수 설정
    Set AllArea = Range("A1", Cells(Rows.Count, 1).End(3)).SpecialCells(2)
    ReDim v(AllArea.Areas.Count, 2)
    i = 1
    
    For Each SingleArea In AllArea.Areas    '그룹들을 순환
        
        For Each SingleRange In SingleArea  '각 그룹의 셀을 순환
            
            '그룹의 첫번째 셀이면 첫번째 배열에,
            '그렇지 않으면 두번째 배열에 데이터 삽입
            If SingleArea.Rows(1).Row = SingleRange.Row Then
                v(i, 1= SingleRange
            Else
                v(i, 2= v(i, 2& " " & SingleRange
            End If
            
        Next SingleRange
        
        '첫 공백 없애고 다음 배열로 이동
        v(i, 2= Trim(v(i, 2))
        i = i + 1
    
    Next SingleArea
    
    '기존 데이터 초기화 후 결과 출력
    With Range("C1")
        If .Value <> "" Then .CurrentRegion.ClearContents
        .Resize(UBound(v, 1), 2= v
    End With
    
End Sub
 
cs
엑셀에서의 문제풀이는 생각하는 과정입니다. 알고리즘을 짤 수 있으면 나머지 기술은 거들 뿐이지요.
특히 매크로의 장점은 결과물이 깔끔하다는 것에 있습니다.
문자+연결하기.xlsm