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

[기초방] VBA 100제 #55 [ 색상그룹평균 ]

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

 

색상그룹의 평균을 구하는 구문이다.

 

이런 문제는 딕셔너리로 하면 더 빠르고 코드도 간단하겠지만 기초방이라는것을 감안하여 임시배열을 통해서 풀어보았다.

더보기
Option Explicit

Sub 색상평균구하기()

    Dim rngAll As Range: Set rngAll = Range([h5], [h5].End(4))
    Dim rngA As Range
    Dim color$, r&, n&
    Dim vtemp
    
    ReDim vtemp(rngAll.Cells.Count, 1)                  '= 임시배열 크기
    
    With [m4].CurrentRegion.Offset(1)                   '= 초기화
        .Interior.color = xlNone
        .ClearContents
    End With
 
    For Each rngA In rngAll
    
        If InStr(color, rngA.Interior.color) > 0 Then   '= 색상을 누적할건데 기존 색상인지 확인
        
            r = Application.Match(rngA.Interior.color, Application.Index(vtemp, , 1), 0)
        
            Cells(4 + r, "n") = Cells(4 + r, "n") + rngA(1, 2)       '= 연령값 누적
            Cells(4 + r, "o") = Cells(4 + r, "o") + rngA(1, 3)       '= 경력값 누적
            
            vtemp(r - 1, 1) = vtemp(r - 1, 1) + 1                    '= 횟수 카운팅에 +1
            
        
        Else                                                         '= 새로운 색상이면
        
            rngA.Resize(1, 3).Copy Cells(Rows.Count, "m").End(3)(2)  '= 평균 영역에 복붙하고
            color = color & "_" & rngA.Interior.color                '= 컬러를 누적하고
            vtemp(n, 0) = rngA.Interior.color                        '= 배열의 처음값에 색상값을 저장
            vtemp(n, 1) = 1                                          '= 배열의 두번째값에 출현 횟수
            n = n + 1                                                '= 배열을 카운팅하기 위한 변수 n
        
        End If
    
    Next rngA

    색상평균 vtemp                                                    '= 배열값을 파라미터로 보냄

End Sub

Function 색상평균(vtemp As Variant)

    Dim rngA As Range
    Dim n&
    
    For Each rngA In [n5:n11]                                       '= 평균 영역을 순환해라
        
        rngA = WorksheetFunction.RoundUp(rngA / vtemp(n, 1), 0)     '= 연령평균을 출현횟수로 나누어라
        rngA(1, 2) = WorksheetFunction.RoundUp(rngA(1, 2) / vtemp(n, 1), 0)  '= 경력을 출현횟수로 나누어라
        n = n + 1                                                   '= 다음 배열을 위한 변수 n
        
    Next rngA

End Function

코드 진행은 이렇다. 색상의 누적을 구하면서 영역의 색상값의 기존유무를 판단하여 그에 맞는 퍼포먼스를 하는것이다.

 

딕셔너리로 했으면 키값과 벨류값으로 구분해서 기존에 있는 색상을 더해주면 되는데, 그럴 수가 없기 때문에 코드가 좀 지저분해진거 같아 기분이 좋지 않다...

 

아 딕셔너리 마려워

 

다음 소개할 코드는 같은 크루인 잔머리님의 중복값제거를 통해 구한 구문이다.

배울때는 많은 코드를 보는것이 너무나 중요하기에 천천히 읽어보길 바란다.

기초방 55.xlsm
0.03MB

 

댓글