안녕하세요, Davey입니다. 오늘 포스팅할 내용은 Excel Macro 입니다. 오랜만에 Excel Macro 관련된 포스팅을 하게 되었는데요. 오늘 설명 드릴 Excel Macro는 조건 값이 조건값이 병합된 셀 영역일 경우 합계 구하는 Macro 입니다.
약간 말만 보면 어렵게 느껴질 수 있고, 설명이 부족할 수 있지만, 그림을 가지고 설명을 드리면 그래도 이해가 쉬우실 듯합니다.
1. 조건 값이 조건값이 병합된 셀 영역 Source Data 준비하기
: Excel Macro를 보여 드릴려면, Source Data 준비해야 합니다. 물론, 연습하실려면, 자신에게 편한 Source Data를 준비하셔서 해야봐야 진짜 제대로 이해가 잘 되실 겁니다. 저는 아래와 같이 Source Data를 준비하였습니다.
1) 조건 1: "A" column에 병합된 셀이 있음. 2) 조건 2: 이름별로 총 사과 수확개수를 "E","F" Column에 출력
- 이제 좀 이해 되셨나요?! "A"이 셀병합되어 있는 셀이 있기 때문에, 조건을 주기가 까다롭습니다. 그래서 이럴 때 사용하는 Macro를 준비해 봤습니다.
2. 조건값이 병합된 셀 영역일 경우 합계 구하는 매크로 코드 구현하기
: 위 1번에 설명 드린 Source Data와 조건 1,2를 만족하는 매크로 코드를 구현해보도록 하겠습니다. 일단 변수의 정의를 구속하는 "Option Explicit" 먼저 입력하면서 시작하도록 하겠습니다. 아래 사항 코드 블록 참조 부탁 드립니다. 필요 시 각 코드 마다 주석 처리를 해서 설명을 추가 하였습니다. 참조하세요!
Option Explicit
Sub sum_Of_Merge_Area()
Dim Line1 As Long '시작행과 계속적으로 Row의 Value를 가져갈 변수
Dim Merged_Counting_Area As Long '병합된 조건 발견 시, 합산해야할 셀의 총 개수를 입력하는 변수
Application.ScreenUpdating = False ' 화면 업데이트 되는 항목을 정지, 속도 측면에서 정지를 추천
Line1 = 2 '시작행을 지정, 2행부터 시작
Do 'Do Loop를 실행
Cells(Rows.Count, "E").End(3)(2) = Cells(Line1, 1) '종단셀 D열 윗방향 바로 아래셀에 제목, _
처음에는 Header 바로 밑에 값.
If Cells(Line1, 1).MergeCells Then '셀병합 되어 있다면
Merged_Counting_Area = Cells(Line1, 1).MergeArea.Cells.Count '셀병합 영역의 셀 개수를 변수에 넣음
'셀 병합셀 개수만큼 B열의 영역합을 구하여 종단셀 E열 윗방향 바로 아래셀에 값에 입력
Cells(Rows.Count, "F").End(3)(2) = Application.Sum(Cells(Line1, 1).Offset(, 1).Resize(Merged_Counting_Area))
Line1 = Line1 + Merged_Counting_Area - 1 '행 + 셀병합 영역 셀개수 - 1 만큼 행 늘려감
Else '셀병합아 안되어 있는 경우는, 그냥 단순 입력 수행
Cells(Rows.Count, "F").End(3)(2) = Cells(Line1, 2) '종단셀 E열 윗방향 바로 아래셀에 값, _
처음에는 Header 바로 밑에 값.
End If
Line1 = Line1 + 1 '행을 1씩 늘려감
Loop Until IsEmpty(Cells(Line1, 2)) '합산해야 할 Value가 없을 때까지 무한 반복
' 결과값을 가지는 Table에 사면 실선 처리하여 보기 좋게 함.
Range("E1").CurrentRegion.Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
End Sub
이상입니다. 셀병합 시 조건 주기에 좀 까다로운데, 이런 매크로 하나 있으면 나름대로 유용하게 사용할 수 있을 거 같습니다. 중간 코드를 보시면, if 문을 줬기 때문에, 그냥 병합되지 않은 셀로만 이뤄진 테이블에도 이용이 가능하니까, 한번 보시고, 이용해보시는 걸 추천 드립니다. 그럼 오늘도 매크로 공부하시느라고 수고 하셨습니다. 항상 말씀 드리지만, 같이 공부하고, 같이 성장하시죠! 감사합니다.
제 Posting이 조금이나마 정보 전달에 도움이 되셨길 빌며, 되셨다면, 구독, 댓글, 공감 3종 세트 부탁 드립니다. 감사합니다.
[저작권이나, 권리를 침해한 사항이 있으면 언제든지 Comment 부탁 드립니다. 검토 후 수정 및 삭제 조치 하도록 하겠습니다. 그리고, 기재되는 내용은 개인적으로 습득한 내용이므로, 혹 오류가 발생할 수 있을 가능성이 있으므로, 기재된 내용은 참조용으로만 봐주시길 바랍니다. 게시물에, 오류가 있을때도, Comment 달아 주시면, 검증 결과를 통해, 수정하도록 하겠습니다.]
'엑셀 (Excel)' 카테고리의 다른 글
엑셀 Excel 인쇄 제목 만드는 방법 (1) | 2022.05.18 |
---|---|
Option Explicit 의미와 적용 유무에 따른 코드 구현 방법 (feat. 엑셀 매크로 VBA) (0) | 2021.04.25 |
Excel 엑셀 매크로 - 테이블 Header 를 이용하여 오름차순 정렬하는 매크로 구현하기 (1) | 2021.03.15 |
Excel 엑셀 매크로 - Beforeprint 이벤트로 Print Line 설정 하기 (0) | 2021.03.15 |
Excel 엑셀 매크로 - 이름 관리자 오류 및 중복 해결 Macro (0) | 2021.03.14 |
댓글