색상별로 시간합계 구하기 (SumIF 함수 사용)
배경색상별로 합계를 구하는 VBA Code 입니다.
기존 자료에 비해서 코드가 더 최적화되어 결과를 산출하는 속도가 빠릅니다.
더 빠르게 최적화 하는 방법도 가능할 거 같은데 아직은 능력이 부족하여 ㅠㅠ
Option Explicit
Sub SameColor_SumIF()
Dim rngC, rngT As Range '// 각 셀을 넣을 변수
Dim rngData, tempData As Range '// 전체 데이터 영역을 넣을 변수
Dim sumData As Range '// Data 시트 합계를 낼 영역 변수
Dim rngVariable As Range '// 구분자 영역 변수
Dim i As Integer
Dim oldTime As Single '// 걸린 시간 구하는 변수 지정
oldTime = Timer '// 시간 변수 설정
Application.ScreenUpdating = False '//화면 업데이트 (일시) 정지
Set rngData = Range([B2], Cells(Rows.Count, "B").End(3))
Set sumData = Range([B2], Cells(Rows.Count, "B").End(3))
Set rngT = [D2]
Columns("D:E").EntireColumn.Clear '// 값을 산출할 열 전체를 초기화
'-------------------- C열에 색상 및 색상값 복사 ---------------------------
For Each rngC In rngData
rngC.Offset(0, 1).Value = rngC.Interior.ColorIndex
rngC.Offset(0, 1).Interior.ColorIndex = rngC.Interior.ColorIndex
Next rngC
'-------------------- C열 기준으로 색상 및 합계 구하기 --------------------
Set tempData = Range([C2], Cells(Rows.Count, "C").End(3))
For Each rngC In tempData
Set rngVariable = Range(rngT, rngT.End(4)) '// 범위가 계속 변함
'// COUNTIF(범위,조건) : 범위에서 조건에 맞는게 몇개인지 카운트하라
If Application.CountIf(rngVariable, rngC) = 0 Then
rngT.Offset(i) = rngC
rngT.Offset(i).Interior.ColorIndex = rngC.Interior.ColorIndex
rngT.Offset(i, 1) = Application.SumIf(tempData, rngC, sumData)
i = i + 1
End If
Next rngC
'--------------- 가운데 정렬, 선그리기, 시간표시, 내림차순 정렬 ----------------------
With ActiveSheet '// 현재 시트
.Cells(1, "D").Value = "색상"
.Cells(1, "E").Value = "시간합계"
'--------------- 가운데 정렬, 선그리기 ----------------------------
.Range(.[D1], .Cells(Rows.Count, "E").End(3)).HorizontalAlignment = xlCenter
.Range(.[E2], .Cells(Rows.Count, "E").End(3)).NumberFormat = "h:mm:ss" '// 시간표시
.Range(.[D1], .Cells(Rows.Count, "E").End(3)).Borders.LineStyle = 1 '// 사용영역 선그리기
.Range(.[D1], .Cells(Rows.Count, "E").End(3)).Sort .[E2], 2 '// 값을 내림차순으로 정렬
End With
'---------------- D열 색상만 남기고 값은 지우기 -------------------------------------
Columns(3).EntireColumn.Clear '// 임시로 값을 복사했던 열 초기화
Range(rngT, rngT.End(4)).ClearContents '//D2 부터 내용 삭제
'------------------ 개체변수 초기화(메모리 비우기) -----------------------------------
Set rngData = Nothing
Set rngVariable = Nothing
Set sumData = Nothing
MsgBox "총 " & Format(Timer - oldTime, "#0.00") & " : 초 소요"
End Sub
VBA Code 파일 첨부합니다.
'업무 능력 향상 > 엑셀 VBA 활용' 카테고리의 다른 글
AutoFilter를 이용하여 찾는 내용이 포함된 셀의 행 가져오기 VBA (1) | 2014.02.08 |
---|---|
AutoFilter를 이용한 셀 일치하는 Row 자동 가져오기 VBA (0) | 2014.02.05 |
색상 개수와 색깔 표시하기 (동일 시트) - CountIF 함수 이용 (0) | 2014.02.01 |
업체별 공급가액 합계 및 정렬 2 (SUMIF 함수 사용) (0) | 2014.02.01 |
AutoFilter로 시트별로 분리 저장 (4) | 2014.01.30 |