본문 바로가기
엑셀 (Excel)/엑셀 매크로 VBA

Excel Macro - 조건값이 병합된 셀 영역일 경우 합계 구하는 매크로 코드 구현하기

by ★√★ 2021. 3. 15.

 안녕하세요, 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 달아 주시면, 검증 결과를 통해, 수정하도록 하겠습니다.]

728x90

댓글


// 내부링크를 현재창으로 열기 // Open internal links in same tab