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

[기초방] VBA 100제 #67 [ 테이블 요약하기 ]

by 일등미노왕국 2023. 10. 1.

앞으로 포스팅할 내용들은 365 함수와 연계하여 작성 하도록 하려고 한다.

 

중요한 이유는  VBA보다는 엑셀 함수를 사용하여 짧고 빠르게 해결할 수 있는 문제들이기 때문이다.

본인이 아무리 코드를 줄인다고 해도, 막강한 365 함수를 이겨낼 수 없다.

 

기초방 67번같은 경우,

각 상품의 날짜와 품목을 키로 하여 각각의 판매 합계와 갯수, 평균, 최대 최소값을 구하는 것인데.

크루_무지 Code
크루_시훈아빠Code

일반적으로 이러한 문제를 접근하기 위해서는 앞서 공개한 크루들의 코드처럼 엑셀 함수로 푸는것이 정석이고 정답이라고 말하고 싶다.

 

코드 자체는 엑셀 함수 기반이라서 큰 어려움은 없을 것이다.

 

더보기
Option Explicit

Sub 기초방67()

    Dim rngAll As Range: Set rngAll = [a5].CurrentRegion
    Dim rngX As Range: Set rngX = [f6]
    Dim vtemp, result, rowv
    Dim List As Range, Key1 As Range, Key2 As Range
    Dim i&
    
    With Application
        On Error Resume Next
            ActiveSheet.ListObjects(1).Unlist                           '= 표개체 삭제
        On Error GoTo 0
        
        ActiveSheet.ListObjects.Add(1, rngAll).Name = "Table1"          '= 표설정
        ActiveSheet.ListObjects(1).TableStyle = "TableStyleMedium5"
    
        [f5].Resize(1, 7) = Array("날짜", "상품", "매출", "판매횟수", "평균", "최대값", "최소값")
        
        vtemp = .Unique(ActiveSheet.ListObjects("Table1").DataBodyRange.Columns("A:B"))
        vtemp = .SortBy(vtemp, .Index(vtemp, , 1), 1, .Index(vtemp, , 2), 1)
        
        Set List = Range("Table1[매출]")
        Set Key1 = Range("Table1[날짜]")
        Set Key2 = Range("Table1[상품]")
            
        
        result = Array(.Index(vtemp, , 1), .Index(vtemp, , 2), _
                .SumIfs(List, Key1, .Index(vtemp, , 1), Key2, .Index(vtemp, , 2)), _
                .CountIfs(Key1, .Index(vtemp, , 1), Key2, .Index(vtemp, , 2)), _
                .AverageIfs(List, Key1, .Index(vtemp, , 1), Key2, .Index(vtemp, , 2)), _
                .MaxIfs(List, Key1, .Index(vtemp, , 1), Key2, .Index(vtemp, , 2)), _
                .MinIfs(List, Key1, .Index(vtemp, , 1), Key2, .Index(vtemp, , 2)))
      
       rowv = Application.Evaluate("ROW(1:" & UBound(vtemp, 1) & ")")
        
       For i = 0 To 6
            rngX.Resize(UBound(vtemp, 1), 1) = .Index(result(i), rowv, 1)
            Set rngX = rngX.Offset(, 1)
       Next i
    
   End With

End Sub

 

result 배열에 하나씩 값들을 담아서 순차적으로 뿌려주는 구문이다.

 

이 글을 보는 사람에게 물어보려한다.

본인의 장황한 코드가 셀 하나에 모두 표기되는 365함수...

이게 본인이 365를 배워야 하는 이유라고 생각한다.

기초방67.xlsm
0.03MB

댓글