본문 바로가기
VBA/엑사남_기초방

[기초방] VBA 100제 #56 [ 문자열 조합 + 정렬하기 ]

by 일등미노왕국 2023. 7. 7.

문자열을 조합하는 구문이다.

 

56번은 엑셀 365함수를 이용하여 textjoin을 함수의 빈셀포함을 적용하면 나오는 똑같은 결과를 가져오는 구문이다.

VBA 의 join함수를 사용하려면 1차원 배열 형태여야 하기 때문에  2차원 배열을 1차원화 하는 방법을 가져와야 한다.

Vtemp = rngA.Resize(1, 5)
V = Application.Index(Vtemp, 1, Array(1, 2, 3, 4, 5)) 
Cells(rngA.Row, "h") = Join(V, ",")

영역을 동적배열로 다이렉트로 가져오게 되면 2차원 배열이 되는데 이 2차원 배열을 1차원 배열화 하려면  슬라이싱 작업을 거쳐야 한다. Array(1, 2, 3, 4, 5)는 열의 갯수를 의미한다.

 

56-1은 셀에 출력 후 가로 정렬을 통해서 Sort를 한후 중복값을 제거하면 된다.

 

rngX.Copy Cells(rngA.Row, "j")     
 Set rngJ = Cells(rngA.Row, "j").Resize(1, 5)
 rngJ.Sort rngJ(1), 1, Orientation:=xlLeftToRight  '= 가로정렬


For i = 1 To rngJ.SpecialCells(2).Cells.Count      '= 중복값제거를 위한 순환
             
     If InStr(str, CLng(rngJ(i))) = 0 Then str = IIf(str = "", rngJ(i), str & "," & rngJ(i))
             
 Next i

 

이렇게 뿌려진 데이터는 지저분하기 때문에 가로 정렬인 경유에는 왼쪽에서 오른쪽으로 삭제를 해줘야 깔끔하게 유지할 수 있다.

Cells(rngA.Row, "k").Resize(1, 4).Delete Shift:=xlToLeft

솔직히 늘 이야기 하지만 이런 배열의 정렬은 ArrayList가 값이다.

 

ArrayList관련 글도 여러편 포스팅했으니까. 확인해서 내것으로 만드길 바란다.

 

더보기
Option Explicit

Sub 기초방56()

    Dim rngAll As Range: Set rngAll = [b5:b30]
    Dim rngA As Range, rngX As Range, rngJ As Range
    Dim Vtemp, V
    Dim str$, i&
    
    [H5:J30].ClearContents                      '= 초기화
    
    Application.ScreenUpdating = False          '= 화면 업데이트 정지
    
    For Each rngA In rngAll                     '= 전체순환
    
        Vtemp = rngA.Resize(1, 5)               '= 영역을  임시배열에 담아라
        V = Application.Index(Vtemp, 1, Array(1, 2, 3, 4, 5)) '= 2차원배열을 1차원배열로..
        Cells(rngA.Row, "h") = Join(V, ",")     '= join을 통한 문자열 출력
        
        Set rngX = rngA.Resize(1, 5)            '= 56_1 시작
        
             rngX.Copy Cells(rngA.Row, "j")     '= 56_1 출력할 셀에 값 출력
             Set rngJ = Cells(rngA.Row, "j").Resize(1, 5)
             rngJ.Sort rngJ(1), 1, Orientation:=xlLeftToRight  '= 가로정렬
             
                    
             For i = 1 To rngJ.SpecialCells(2).Cells.Count     '= 중복값제거를 위한 순환
             
                 If InStr(str, CLng(rngJ(i))) = 0 Then str = IIf(str = "", rngJ(i), str & "," & rngJ(i))
             
             Next i
            
             Cells(rngA.Row, "k").Resize(1, 4).Delete Shift:=xlToLeft  '= 출력한 셀값 제거
        
        
        Cells(rngA.Row, "j") = str               '= 고유값 + 정렬된 값을 출력
        
        str = ""
        
    Next rngA
    
    Application.ScreenUpdating = True


End Sub

 

같은 방 크루인 시훈아빠의 코드를 첨부할테니 더 다양한 방법으로 다각화에 성공하길 바란다.

 

기초방56.xlsm
0.02MB

댓글