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

[기초방] VBA 100제 #21 [ 반별 총점/평균 구하기 ]

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

 

과목의 총점 평균 구하기는 엑셀을 시작하면서 늘 반복적으로 해왔던 일이었으리라...

그래서 이러한 문제는 수식을 이용해서 풀어나가는게 맞다고 본다.

같은 방 크루인 무지님의 코드이다. 수식으로 풀고 마지막에 수식을 값으로 변경하는 코드를 사용하였다.

수식으로 풀면서 좋은건 영역을 선택한 후 수식을 입력하게 되면 영역을 순환하지 않고 바로 그 영역에 수식이 들어감으로 코드가 훨씬 짧아진다.

 

무지님의 코드에 사용된 Sumifs 와 본인의 코드인 Application.Sumifs와의 사용을 비교하여 보길 바란다.

엑사남님은 늘 말한다. VBA에 전에 엑셀함수라고 항상 기본에 충실하자...

 

 

그래도 이건 아니지 않니???

모~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~카

타도 닥터..브레드

진짜 세상은 넓다.

더보기

 

Option Explicit
Dim rngAll As Range
Sub 기초방21()

    Dim rngX As Range: Set rngX = [c6]
    Dim rngSubtotal As Range
    Dim rngA As Range
    Dim i&
    
    Application.ScreenUpdating = False
    
    Do Until IsEmpty(rngX)                                                          '= 개인별 총점 / 평균구하기
    
        rngX(1, 9) = Application.Sum(rngX(1, 4).Resize(1, 5))
        rngX(1, 10) = Application.Average(rngX(1, 4).Resize(1, 5))
    
        Set rngX = rngX.Offset(1)
        
    Loop
 
    Application.DisplayAlerts = False                                               '= 이미 만들어진 반평균 시트 삭제
        Sheets("반평균").Delete
    Application.DisplayAlerts = True
    
    Haja_Format
    
    Set rngAll = [c5].CurrentRegion
    
    rngAll.RemoveDuplicates Array(1, 2), 1                                          '= 학년 , 반 기준으로 중복 제거 / 헤드 있음
    
    Set rngSubtotal = [e6:i14]                                                      '= 과목의 평균을 출력할 영역 설정
    
    For Each rngA In rngSubtotal                                                    '= 과목의 평균을 구할 영역을 순환해라
        With Sheets("데이터")
        
            rngA = Format(Application.SumIfs(.Columns(rngA.Column + 1), .Columns("d"), Cells(rngA.Row, "c"), .Columns("e"), Cells(rngA.Row, "d")) _
                        / Application.CountIfs(.Columns("d"), Cells(rngA.Row, "c"), .Columns("e"), Cells(rngA.Row, "d")), "#.0")
        
            
        End With                                                                    '= Sumifs + Countifs를 통해서 학년&반별 과목 평균을 구해라
    Next rngA
    
    Application.ScreenUpdating = True

End Sub

Function Haja_Format()
    
    Set rngAll = [c5].CurrentRegion

    With rngAll
    
        .HorizontalAlignment = xlCenter
        .Borders.LineStyle = 1
        .Sort [d5], 1, [e5], , 1, [c5], 1, 1
        
        Sheets.Add after:=Sheets("데이터")                                      '= 반평균 시트 추가
        ActiveSheet.Name = "반평균"
        
        rngAll.Copy [c5]                                                        '= 반평균시트에 데이터시트의 전체 데이터를 복사해라
        Columns("k:l").Delete: Columns("c").Delete                              '= 학년&반별 과목 평균을 구하기 위래 총점, 평균 / 이름 열을 삭제해라
        
    End With

End Function

기초방21.xlsm
0.08MB

댓글