본문 바로가기
VBA

[VBA] 배열 슬라이싱(feat. 배열맛집)

by 일등미노왕국 2022. 12. 7.

오늘은 배열 슬라이싱에 관해서 알아보자.

 

본인이 쓴글에 간간히 배열 슬라이싱에 관해서 구문을 이용한적은 있지만, 요즘 채팅방에서 학구열이 너무 높아져서 배열에 대해서 좀 더 깊이 다루는 문제를 만들어 보았다. 

 

배열 슬라이싱에 관해서 무궁무궁한 질문과 답들이 올라온다

특히 파이썬으로 들어가면 NumPy를 통한 OpenCV문제등 배열을 쪼개고 붙히고 나누는 상황들이 많이 발생하게 된다.

이참에 배열에 좀 더 깊이 들어가시길 바란다.

시작은 Application.index로 시작한다. 이것으로부터 시작하여 배열을 나누고 붙히고 쪼개면 된다.

이글을 읽는 본인들은 기존보다는 더 고급진 당신의 배열의 퀄을 높히기 위해서 들어왔을 것이다. 

당신의 한층 더 단단한 배열에 힘을 주었길 바란다.

 

# Ubound(vall,1) -> 2차원 배열의 행의 최댓값

# Ubound(vall,2) -> 2차원 배열의 열의 최댓값

# Application.index(배열, p ) -> 배열의 p행값을 모두 가져온다

# Application.index(배열, ,q ) -> 배열의 q열값을 모두 가져온다

# Application.index(배열, p,q ) -> 배열의 p행, q열값을 모두 가져온다

 

 

더보기
Sub 배열문제()

    Dim Vall: Vall = Sheets("데이터").[a2:g17]                        '= 데이터 시트의 배열값 담기
    Dim rowV                                                          '= 열의 Row값을 배열화 해라
    Dim rowCnt: rowCnt = UBound(Vall, 1)                              '= 배열의 행의 최대길이
    
    [g6].Resize(1, UBound(Vall, 2)) = Application.Index(Vall, 3)
   '= Vall의 3행의 전체를 [F6]을 기준으로 배열의 가로값만큼 안에 뿌려라
   
    [g7].Resize(1, UBound(Vall, 1)) = Application.Transpose(Application.Index(Vall, , 2))
   '= Vall의 2열의 값을 가져오는데 가로로 뿌려야 하기 때문에 트랜스포스를 하고 가로의 길이는 배열의 세로의 길이만큼으로 하여 영역에 뿌려라
   
    [g8] = Application.Index(Vall, 2, 5)
   '= 2행 5열의 값
    
    
    rowV = Application.Evaluate("ROW(1:" & UBound(Vall, 1) & ")")     '= 엑셀 함수 Row을 통해서 rowV에 배열로 담아라
    
    With Sheets("통합")
            .[b11].Resize(rowCnt, 2) = Application.Index(Vall, rowV, Array(1, 2))  '= Vall에서 배열 각 행의 1,2열만 가져와라
            .[e11].Resize(rowCnt, 1) = Application.Index(Vall, , 3)
            .[g11].Resize(rowCnt, 1) = Application.Index(Vall, , 5)
            .[i11].Resize(rowCnt, 2) = Application.Index(Vall, rowV, Array(6, 7))  '= Vall에서 배열 각 행의 6,7열만 가져와라
            .[b29].Resize(5, 3) = Application.Index(Vall, Application.Transpose(Array(3, 6, 10, 13, 15)), Array(1, 4, 6))
    End With
    
    Call 서식
    
End Sub

Sub 서식()
    Dim rngAll As Range
    
        Set rngAll = [f6].CurrentRegion
        Set rngAll = rngAll.SpecialCells(2)
        rngAll.Borders.LineStyle = 2
        
        Set rngAll = [b10:j26]
        Set rngAll = rngAll.SpecialCells(2)
        rngAll.Borders.LineStyle = 2
        
        Set rngAll = [b29:d33]
        rngAll.Borders.LineStyle = 2
    
    MsgBox "배열 문제가 완성되었습니다."

End Sub

배열문제입니다..xlsm
0.02MB

댓글