2026-09-03
먼저 안 되는 것부터 말씀드립니다. 엑셀의 행 높이 자동 맞춤은 병합된 셀의 글자 양을 계산에 넣지 않습니다. 버그가 아니라 설계가 그렇습니다.
자동 맞춤은 "이 셀의 글자가 이 열 너비 안에서 몇 줄이 되는가"를 셀 단위로 계산합니다. 그런데 병합 셀의 글자는 여러 열에 걸쳐 있어서, 엑셀 입장에서는 그 높이를 어느 열에 물어야 할지 정할 수 없습니다. 그래서 아예 계산에서 빼 버립니다. 결과적으로 병합 셀은 "빈 셀"로 취급되고, 그 행에 남은 일반 셀 중 가장 낮은 높이로 맞춰집니다. 열 너비 자동 맞춤이 된 것처럼 보인 이유도 같습니다. 그 열에 병합 안 된 일반 셀이 섞여 있어서 그 셀 기준으로 맞춰진 것뿐입니다.
방법 1. 병합을 없애고 같은 모양을 냅니다. 가로로만 병합했다면 병합 자체가 필요 없습니다. 네 단계입니다.
1. 해당 범위 병합 해제
2. 범위 선택 후 Ctrl + 1
3. 맞춤 탭 > 가로 > 선택 영역의 가운데로
4. 텍스트 줄 바꿈 체크(Alt + H + W)
보기에는 병합과 구분이 안 되는데, 자동 맞춤·정렬·필터·복사가 전부 정상으로 돌아옵니다. 셀 하나하나는 병합되지 않은 상태라 자동 맞춤이 글자를 다시 세기 시작합니다.
방법 2. 병합을 유지해야 하면 매크로를 씁니다. Alt + F11 > 삽입 > 모듈에 붙여 넣고, 대상 범위를 선택한 뒤 실행합니다.
Sub 병합셀_행높이_맞춤()
Dim 셀 As Range, 조각 As Range, 대상 As Range
Dim 총너비 As Double, 새높이 As Double
Dim 임시 As Worksheet, 원본 As Worksheet
If TypeName(Selection) <> "Range" Then Exit Sub
Set 원본 = ActiveSheet
Set 대상 = Intersect(Selection, 원본.UsedRange)
If 대상 Is Nothing Then Exit Sub
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set 임시 = Worksheets.Add
원본.Activate
For Each 셀 In 대상.Cells
If 셀.MergeCells Then
If 셀.Address = 셀.MergeArea.Cells(1, 1).Address _
And 셀.MergeArea.Rows.Count = 1 Then
총너비 = 0
For Each 조각 In 셀.MergeArea.Cells
총너비 = 총너비 + 조각.ColumnWidth
Next 조각
With 임시.Range("A1")
.ClearContents
.ColumnWidth = 총너비
.WrapText = True
.Font.Name = 셀.Font.Name
.Font.Size = 셀.Font.Size
.Font.Bold = 셀.Font.Bold
.NumberFormat = 셀.NumberFormat
.Value = 셀.Value
.EntireRow.AutoFit
새높이 = .RowHeight + 2
If 새높이 > 409 Then 새높이 = 409
셀.MergeArea.RowHeight = 새높이
.ClearContents
End With
End If
End If
Next 셀
임시.Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
임시 시트에 같은 글꼴·같은 총너비의 셀을 하나 만들어 놓고, 거기서 진짜 자동 맞춤을 돌린 다음 그 높이를 병합 셀에 옮겨 적는 방식입니다. 엑셀이 안 해 주는 계산을 대신 시켜 놓고 답만 가져오는 셈입니다.
하나, 텍스트 줄 바꿈이 꺼져 있으면 무조건 한 줄입니다. 줄 바꿈이 꺼진 셀은 글자가 몇 자든 한 줄로 취급되므로 자동 맞춤은 높이를 최소로 줄입니다. 줄 바꿈부터 켜고 시작하셔야 합니다.
둘, 세로 병합(위아래 여러 행 병합)은 위 매크로도 건너뜁니다. 어느 행에 높이를 얼마씩 나눠 줄지 정할 근거가 없어서 계산이 성립하지 않습니다. MergeArea.Rows.Count = 1 조건이 그래서 들어가 있습니다. 세로 병합은 맞추는 게 아니라 푸는 쪽이 답입니다.
셋, 열 너비를 바꾸면 높이는 따라오지 않습니다. 너비를 건드린 뒤에는 자동 맞춤을 다시 실행해야 합니다. 인쇄 직전에 여백을 조정하고 그대로 출력하면 아랫줄이 잘립니다.
넷, 행 높이 상한은 409.5포인트입니다. 글자가 그보다 많으면 자동 맞춤이 성공해도 뒷부분은 안 보입니다. 위 코드가 409에서 자르는 것도 그 때문이고, 이 경우는 높이가 아니라 글자를 나눠야 합니다.
다섯, 매크로는 실행 취소가 안 됩니다. VBA가 실행되면 실행 취소 기록이 지워집니다. 반드시 사본에서 먼저 돌려 보시기 바랍니다.
주문·정산 내역 파일에서 병합은 높이 문제로 끝나지 않습니다. 병합 영역의 값은 실제로 왼쪽 위 한 칸에만 있고 나머지 칸은 빈 셀입니다. 그래서 VLOOKUP·XLOOKUP·SUMIF의 조건 범위에 병합 열이 들어가면 두 번째 행부터는 조용히 0이나 빈칸이 나옵니다. 오류 메시지가 안 뜨기 때문에 합계가 틀어져도 바로 못 알아챕니다. 정렬과 필터에서는 "이 작업을 수행하려면 병합하려는 셀의 크기가 모두 같아야 합니다"가 뜨고, 피벗 테이블은 병합 헤더를 필드 이름으로 못 읽습니다.
한 줄로 줄이면, 병합 셀 행 높이 자동 맞춤이 안 되는 것은 엑셀이 병합 셀의 글자를 세지 않기 때문이고, 해결은 병합을 풀고 "선택 영역의 가운데로"를 쓰거나 임시 시트에서 높이를 계산해 옮겨 적는 매크로를 쓰는 두 갈래입니다. 보고서용 표지 한 장이면 매크로로 버텨도 되지만, 매달 돌리는 정산 파일이라면 병합을 없애는 쪽이 나중에 손이 훨씬 덜 갑니다.
지금 그 파일, 어디가 문제인지 먼저 보시겠습니까
CSV 를 넣으면 계산이 틀어지는 자리를 찾아 드립니다. 무료이고 파일은 서버로 올라가지 않습니다 — 브라우저 안에서만 처리되고 저희도 내용을 볼 수 없습니다.
매달 같은 순서로 고치고 계신다면 그 순서를 프로그램으로 옮겨둔 것이 있습니다 — 쇼핑몰 월 정산 자동화. 되는지부터 보시려면 무료 진단.