EXCEL - VBA

한글이 아닌 엑셀로 하는 메일 머지(3)

별동산 2024. 3. 29. 08:12
반응형


문제는 여기를 참고 바랍니다.

고지서__개별인쇄(예시).xlsx
0.02MB

 
 

3. 해법 2 : 이름뿐만 아니라 나머지 내용까지 매크로로 처리하는 방법

 

가. 논리

이번에는 셀 값을 Vlookup함수가 아니라 다른 시트의 셀 주소로 연결하는 방법과
같은 연번에서 이름이 반복될 경우 고지서에 한꺼번에 인쇄하는 매크로를 만들어 보겠습니다.
 
(1) 셀 값을 다른 시트의 셀 주소로 연결하기
예를 들어 고지서 시트의 회사명(성명)인 D6셀에는 명단 시트의 E열의 값이 입력되어야 합니다.
이 때는 연결키가 없어도 됩니다.

그리고, 토지 소재지인 시군, 읍면, 리동은 명단 시트의 G, H, i 열과 연결되면 됩니다.
 
(2) 같은 연번에서 이름이 반복될 경우 인쇄하기
"같은 연번"이란 병합된 셀로서 처리 줄과 윗 줄의 A1셀이 동일한 경우이고,
"이름이 반복된다"는 것은 처리 셀과 처리 셀의 위셀의 성명이 같다는 것입니다.
 

나. 작성된 매크로

개발 도구 - Visual Basic을 눌러 VB Editor를 연 후
삽입 - 모듈을 눌러 Module 1을 추가한 후
아래 코드를 붙여 넣습니다.
 

Option Explicit

Sub 고지서인쇄()
    Dim sht1 As Worksheet, sht2 As Worksheet
    Dim i As Long, endRow As Integer, n As Integer
    
    Set sht1 = Sheets(1)
    Set sht2 = Sheets(2)
    
    endRow = sht2.Range("a" & Rows.Count).End(xlUp).Row
    n = 11
    
    For i = 7 To endRow
        With sht2
            '병합 셀이고, 이전 행과 이름이 같을 경우 같은 고지서로 인쇄
            If .Range("A" & i).MergeCells = True And .Range("e" & i) = .Range("e" & (i - 1)) Then
                With sht1
                    '사용료 내역 입력
                    Call inputEach(sht1, sht2, n, i)
                    '사용료를 핪산 한 금액으로표시
                    .Range("E27") = sht2.Range("P" & i).MergeArea.Range("a1")   '사용료
                End With
                n = n + 1
                
            Else
                n = 11
                With sht1
                    '기존 내역 삭제
                    .Range("B11:J21").ClearContents
                    
                    '회사명(성명) 한번 표시
                    .Range("D6") = sht2.Range("E" & i)      '회사명(성명)
                    
                    '사용료 내역 입력
                    Call inputEach(sht1, sht2, n, i)
                    
                    '납부금액 계 산식과 사용료 입력
                    .Range("E26") = "=sum(E27:E29)"         '납부금액 계
                    .Range("E27") = sht2.Range("O" & i)     '사용료
                    
                End With
                n = n + 1
            End If
            
            '인쇄 조건
            '병합 셀이 아닌 경우이거나
            '병합 셀인 경우는 연번 셀이 0인 경우는 아래 셀과 성명이 달라야 하고,
            '연번 셀이 0보다 크다면 윗 셀과 성명이 다를 경우
            If (.Range("a" & i).MergeCells = False) Or _
                (.Range("a" & i).MergeCells = True And _
                    (Range("a" & i) = 0 And .Range("E" & i) <> .Range("E" & (i + 1))) Or _
                    (Range("a" & i) > 0 And .Range("E" & i) <> .Range("E" & (i - 1))) _
                ) Then
                
                ActiveSheet.PrintPreview
                
            End If
            
        End With
    Next
End Sub

Sub inputEach(sht1, sht2, n, i)
    '공통된 부분인 사용료 세부 내역 입력
    With sht1
        .Range("B" & n) = sht2.Range("G" & i)   '시군
        .Range("D" & n) = sht2.Range("H" & i)   '읍면
        .Range("E" & n) = sht2.Range("i" & i)   '리동
        .Range("F" & n) = sht2.Range("j" & i)   '지번
        .Range("G" & n) = sht2.Range("L" & i)   '사용면적
        .Range("H" & n) = sht2.Range("O" & i)   '사용료
        .Range("i" & n) = sht2.Range("M" & i)   '사용용도
    End With
End Sub

 
 

다. 실행

ActiveSheet.PrintOut을 ActiveSheet.PrintPreview로 바꾸고 실행하면
미리 보기 상태로 인쇄 화면이 열립니다.
 
인쇄 미리 보기 닫기 버튼을 눌러야 다음 페이지로 이동합니다.

 
다른 부분은 어려운 것이 아닌데, 강감찬인 경우 고지서에 내역이 2줄로 표시되는지 확인이 중요합니다.
제대로 인쇄됩니다. 사용료는 2건이고, 사용료 계가 2건의 합계인 170,570으로 잘 표시됩니다.

 

고지서__개별인쇄(주소연결 완성).xlsm
0.04MB
반응형