반응형
문제는 여기를 참고 바랍니다.
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으로 잘 표시됩니다.
반응형
'EXCEL - VBA' 카테고리의 다른 글
조건부 서식을 인쇄할 때 제거하는 방법 (0) | 2024.04.27 |
---|---|
VBA로 ColorIndex에 대한 색 표시하기 (0) | 2024.04.12 |
한글이 아닌 엑셀로 하는 메일 머지(2) (2) | 2024.03.28 |
한글이 아닌 엑셀로 하는 메일 머지(1) (0) | 2024.03.27 |
ChatGPT를 이용해서 VBA 코드 짜기(2) (0) | 2024.03.21 |