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

[기초방] VBA 100제 #41 [ 테이블 정렬하기 ]

by 일등미노왕국 2023. 3. 15.

 

이번 41번문제는 표를 간단한 테이블 형태로 변경하는것인데..엑셀을 하는 사람들은 절대로 이러한 41번 형태의 테이블로 data를 작성하면 안된다.

 

엑셀에서 많이 사용되는 것중하나인 빈셀들을 윗셀의 값을 참조하는 코드는 아래와 같다.

rngU.SpecialCells(4).FormulaR1C1 = "=R[-1]C"

 

vtemp = Application.Transpose(rngA(1, -4).Resize(Application.CountIf(rngAll.Columns(2), rngA(1, -3)), 1))

vtemp에서 타임파트중 같은 파트들을 Countif를 통해서 그 크기를 Resise의 행의 크기로 하여 배열화 하면 2차원 배열이 됨으로 이를 Transpose를 통해 1차원 배열로 만든다.

이같은 일련의 코드를 작성하는 이유는 같은 회차의 이름들을 콤마로 연결하려하는데 이는 1차원배열만 Join으로 연결할 수 있기 때문이다.

str = Join(vtemp, ",")

슬슬 배열에 관한 문제를 준비를 해야하는 시기가 온거 같다..

기초방 50번부터는 배열에 관한 문제로 구성하려 한다.

그럼 오늘도 맛있는 코드 냠냠

더보기
Option Explicit

Sub 기초방41()

    Dim rngAll As Range: Set rngAll = [c6:h18]
    Dim rngA As Range
    Dim rngU As Range, rngX As Range: Set rngX = [j6]
    Dim str$
    Dim vtemp
    
    Sheets("문제").[c5:h18].Copy Sheets("결과").[c5]
    [j6:n9].ClearContents
    
    Set rngU = Union(rngAll.Columns(2), rngAll.Columns(3), rngAll.Columns(4)) '= 타임파트 시작시간 종료시간을 rngU로 설정
        rngU.NumberFormatLocal = "h:mm;@"                                     '= rngU영역에 숫자 포멧을 시간 형태로 해라
        rngU.SpecialCells(4).FormulaR1C1 = "=R[-1]C"                          '= 비어있는 셀에 바로 윗 셀을 참조
    
        [j5:n5] = Array("타임파트", "작업자", "시작시간", "종료시간", "총생산수")
        
        For Each rngA In rngAll.Columns(6).Cells
            
            If rngA(1, -3) <> rngA(0, -3) Then                                 '= 타임파트가 달라지면
            
               rngA = Application.SumIf(rngAll.Columns(2), rngA(1, -3), rngAll.Columns(5))  '= 각 횟수의 총 생산수를 sumif로 구해라
               vtemp = Application.Transpose(rngA(1, -4).Resize(Application.CountIf(rngAll.Columns(2), rngA(1, -3)), 1))
                                                                                
                                                                                '= Counif로 구한 영역의 2차원 배열을 1차원 배열로 바꾼후
               str = Join(vtemp, ",")                                           '= 바꾼 1차원 배열을 콤마로 결합해라
               
               rngX = rngA(1, -3): rngX.Next = str: rngX(1, 3) = rngA(1, -2)    '= 41-1 표 형태로 해당 데이터들을 출력해라
               rngX(1, 4) = rngA(1, -1): rngX(1, 5) = rngA
               
               Haja_format rngX
               
               str = "": Set rngX = rngX.Offset(1)                              '= 다음 파트를 위한 초기화 작업
            End If
            
        Next rngA
        
        MsgBox "테이블 출력을 완료했습니다."
        
End Sub

Function Haja_format(rngX As Range)

    Dim i&
    
    For i = 1 To 150
    
        rngX.Resize(1, 5).Font.Bold = True
    
    Next i
    
        rngX.Resize(1, 5).Font.Bold = False

End Function

기초방41.xlsm
0.03MB

댓글