엑셀로 로그나 DB 추출 데이터를 열다 보면 "데이터가 다 안 들어왔다"는 말을 듣게 되는 경우가 있습니다. 대부분 시트 한 장의 행 수 한도에 걸린 겁니다. Excel 2010 기준으로 워크시트 하나의 최대 크기는 1,048,576행 × 16,384열입니다. 열 이름으로는 A부터 XFD까지죠. 이 크기는 Excel 2007에서 xlsx 형식이 나오면서 정해졌고 이후 버전에서도 같습니다.
예전 xls 파일은 한도가 훨씬 작다
Excel 2003 이전 형식(xls)은 65,536행 × 256열(IV열까지)입니다. 지금도 거래처에서 xls로 받은 파일을 그대로 열어 작업하면 이 한도가 그대로 적용됩니다. 제목 표시줄에 "호환 모드"가 떠 있으면 예전 형식이라는 뜻이니, 큰 데이터를 붙여 넣기 전에 xlsx로 다른 이름으로 저장부터 해 두는 게 좋습니다. 6만 행에서 잘리는 증상이 나오면 거의 이 경우입니다.
| 항목 | xlsx (2007 이후) | xls (2003 이전) |
|---|---|---|
| 최대 행 수 | 1,048,576 | 65,536 |
| 최대 열 수 | 16,384 (XFD) | 256 (IV) |
자주 부딪히는 한도가 몇 가지 더 있습니다. 셀 하나에 들어가는 문자는 최대 32,767자인데, 화면에 다 보이지는 않고 수식 입력줄에서 확인됩니다. 수식 하나의 길이는 8,192자까지입니다. 웹 페이지 본문이나 JSON 문자열을 셀에 통째로 넣는 매크로를 만들 때 이 문자 수 한도를 넘기면 뒷부분이 잘리니 미리 길이를 확인하는 게 안전합니다.
매크로에서 한도를 하드코딩하지 말 것
VBA에서 마지막 행을 찾을 때 Range("A65536").End(xlUp) 처럼 숫자를 박아 둔 옛날 코드가 아직 많이 돌아다닙니다. xlsx 시트에서 6만 행을 넘는 데이터를 다루면 이 코드는 엉뚱한 행을 반환합니다. 버전과 형식에 상관없이 동작하게 하려면 시트가 알려 주는 값을 쓰면 됩니다.
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
Rows.Count 는 xlsx에서 1,048,576, xls에서 65,536을 돌려주니 어느 파일이든 맞게 동작합니다. VB.NET에서 Interop으로 엑셀을 다룰 때도 같은 방식으로 Rows.Count 를 읽어 쓰면 됩니다.
백만 행을 넘는 데이터라면
한도 근처까지 데이터를 채우면 한도 안이라도 파일이 무거워지고 계산·필터가 눈에 띄게 느려집니다. 백만 행을 넘기는 원본은 시트를 여러 장으로 나누거나, 원본은 CSV나 DB에 두고 엑셀에는 집계 결과만 가져오는 쪽이 현실적입니다. 엑셀에서 CSV를 열 때도 한도를 넘는 행은 버려지니, 행 수가 많은 CSV는 먼저 줄 수를 확인하고 여는 습관을 들이면 데이터 누락을 피할 수 있습니다.