- 최초 작성일: 2000-10-17
- 최종 수정일: 2026-09-30
- 조회수: 10 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: auto_open과 256 Column보다 큰 텍스트 파일 불러오기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번 시간에는 질문 두 가지를 살펴봅니다.
질문 하나
auto_open에 대해 설명해 주셨으면 합니다. 대충 무슨 매크로인지는 알겠는데 좀 자세한 설명을 부탁드린다는 질문입니다.
윈도우 기반 하에서 작동되는 대부분의 프로그램은 Event-driven Program 이라고 할 수 있습니다(물론 아닌 것도 있지만...). 프로시저의 경우에도 일반 VBA 모듈에 작성한 일반 프로시저와 코드창에 작성한 이벤트 프로시저, 이렇게 두 가지로 구분 됩니다(이러한 용어는 Exceller가 편의상 붙여본 이름입니다. 정식용어가 아니므로 책에 안나온다고 해서 항의하지 마세요 ^^)
이벤트라는 것은 "컴퓨터에게 주어지는 어떤 행위"라고 할 수 있습니다. 예를 들어, 마우스 버튼을 클릭하면 Click 이벤트가 발생하고, UserForm을 실행하면 Initialize 이벤트와 Activate 이벤트가 함께 발생합니다. VB(A)에서는 어떤 이벤트가 그에 대응하는 프로시저가 함께 발생하는데 이러한 프로시저를 "이벤트 프로시저" 라고 부릅니다.
auto_open 프로시저도 바로 이벤트 핸들러 프로시저 중 하나입니다. 즉 해당 파일이 오픈될 때마다 실행되는 프로시저이지요. 예전에 Dos를 OS로 사용할 때, 컴퓨터를 부팅시키면 Autoexec.bat라는 배치파일이 자동으로 실행되었지요? 바로 이것과 비슷한 역할을 수행하는 것이 auto_open 프로시저입니다. 이 프로시저와 반대역할을 수행하는 auto_close라는 프로시저도 있습니다.
auto_open과 256 Column보다 큰 텍스트 파일 불러오기
핵심 요약: auto_open과 열 수 제한 넘기
auto_open은 파일을 열 때 자동 실행되는 프로시저이고, 256열이 넘는 텍스트 파일은 열 번호를 세어 두 번째 시트로 넘겨 저장합니다.
- 1단계: 시트가 2개인 새 통합 문서를 만듭니다.
- 2단계: Line Input으로 한 줄씩 읽고 문자를 분석해 콤마 기준으로 셀에 채웁니다.
- 3단계: 열 번호가 256이 되면 두 번째 시트의 A1로 옮겨 계속 채웁니다.
질문 2: 256열보다 큰 데이터 불러오기
회사 서버에서 텍스트 형태의 자료를 받아와 엑셀에서 불러와 매월 분석을 하고 있는데, 얼마 전부터 자료가 많아서 완전히 읽혀지지 않는다는 질문입니다. 자료는 10만 행이 넘는다고 하셨습니다.
예제로 사용될 텍스트 파일 예제를 하나 만들어야 하니까 아래의 버튼을 누르세요. 순서대로 안하고 이것저것 누르며 에러가 나니까 반드시 순서대로 하시기 바랍니다.
그리고 모듈을 사용해서 텍스트 파일을 읽어오는 것이기 때문에 보통 "파일-열기" 메뉴를 사용했을 때보다 속도가 좀 느립니다. 버튼을 누르고 차나 한잔 하고 오시기 바랍니다. 이렇게 좋은 가을날 밤, 키보드나 두들기고 있는 Exceller의 노고에 경의를 표하면서… (농담입니다. 하하하!!!) 근데 청량한 밤공기가 너무도 좋군요!!!
예제 텍스트 파일(300개 필드가 있는 LongText.txt)을 만드는 코드는 아래와 같습니다(20행 × 300열의 숫자를 콤마로 구분해 기록합니다).
Sub MakeLongText()
Dim r As Long
Dim c As Integer
Open ThisWorkbook.Path & "\LongText.txt" For Output As #1
For r = 1 To 20
For c = 1 To 300
If c <> 300 Then
Write #1, r * c;
Else
Write #1, r * c
End If
Next c
Next r
Close #1
MsgBox "LongText.txt 파일이 생성되었습니다", , "파일 생성//Exceller"
End Sub
정상적으로 파일 생성 완료 메시지 박스가 나타났습니까? 그렇다면 이제 이 파일이 어떻게 생겼는지 텍스트 에디터(워드패드나 울트라 에디터, 텍스트 패드 등…)를 실행시킨 다음, 현재 이 강좌파일과 같은 폴더 밑에 있는 "LongText.txt" 파일을 열어서 살펴보시기 바랍니다. 분명히 필드가 300개가 있는지 한번 확인해 보세요.
확인하셨으면 이것을 워크시트 상에 불러와 보도록 하겠습니다. 만약 이 Text 파일을 문자열 마법사를 통해 불러오면 256열 까지만 Importing 되고 나머지는 읽어들이지를 못합니다.
어떻습니까? 1~256열까지의 자료는 Sheet1에 저장이 되고 나머지 257~300열까지의 자료들은 Sheet2에 차곡차곡 저장이 되지요? 코드를 보도록 하겠습니다.
Sub ImportLongFile()
Dim rngImport As Range
Dim i As Integer
Dim intSheets As Integer
Dim intLine As Long
Dim r As Long
Dim c As Integer
Dim strData As String
Dim strChar As String
Dim strText As String
intSheets = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 2
Workbooks.Add
Application.SheetsInNewWorkbook = intSheets
'//여기까지는 시트를 2개 가진 새로운 워크북을 하나 만들기 위한 과정입니다.
Open ThisWorkbook.Path & "\LongText.txt" For Input As #1
Set rngImport = ActiveWorkbook.Sheets(1).Range("A1")
Application.DisplayStatusBar = True
Application.ScreenUpdating = False
'//시간이 좀 걸리니까 화면갱신을 False로 지정했습니다. 즉 화면을 갱신하지 않습니다.
Do While Not EOF(1)
intLine = intLine + 1
Line Input #1, strData
Application.StatusBar = intLine & " Record Importing..."
'//Line Input Statement에 의해 텍스트 파일을 한 라인씩 읽어들입니다. 그럴 때마다
'//현재 몇 라인을 Importing 했는지를 상태표시줄에 나타냅니다.
For i = 1 To Len(strData)
strChar = Mid(strData, i, 1)
'//이제 라인 내의 각 문자열 값을 strChar 변수에 저장한 다음 순환문을 돌면서
'//여러 가지 조건분기를 시작합니다.
If c = 256 Then
c = 0
Set rngImport = ActiveWorkbook.Sheets(2).Range("A1")
End If
'//만약 256열 이상이면 현재 워크북 두번째 시트의 A1 셀을 rngImport 오브젝트 변수에
'//저장합니다.
If strChar <> "," And strChar <> Chr(34) Then strText = strText & strChar
If strChar = "," Or i = Len(strData) Then
rngImport.Offset(r, c) = strText
c = c + 1
strText = ""
End If
'//strChar의 값이 콤마이거나 맨 끝 문자일 경우에는 해당 셀에 strText값을 뿌려주고
'//필요한 변수값을 변화시킵니다. 여기서 strTemp는 콤마나 인용부호가 아닌 보통의
'//문자열인 경우 해당 값을 계속 누적시켜 놓은 임시 문자열 변수입니다.
'//그리고 strChar 변수값이 Chr(34), 즉 " 이 아닐 경우에는 strText 변수에 그 값을
'//계속 담아둡니다.
Next i
c = 0
r = r + 1
Set rngImport = ActiveWorkbook.Sheets(1).Range("A1")
Loop
Close #1
Application.ScreenUpdating = True
Application.StatusBar = ""
'//작업이 끝났으면 Open했던 파일을 닫고 ScreenUpdating 속성을 다시 True로 돌립니다.
End Sub
이 강좌는 열이 256개까지였던 옛 버전(Excel 2003 이전)을 기준으로 합니다. Excel 2007 이후에는 워크시트가 16,384열(XFD), 1,048,576행까지 지원되므로 이런 나누어 불러오기가 필요한 경우가 훨씬 줄었습니다. 그보다 큰 자료는 Power Query 등을 이용하는 것이 좋습니다.
숙제
오래간만에 숙제를 하나 내 드릴까요? 열 방향으로 256열 보다 큰 자료를 불러오는 방법에 대해 이제 아셨으니까 이것을 응용해서 65536행 보다 큰 자료를 Importing하는 코드를 한번 만들어 보세요. 기본적인 논리는 비슷하니까 조금만 응용하시면 될 것입니다.
마무리
다음 시간에 또…
정리 — 256열 초과 불러오기 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 새 통합 문서 | Application.SheetsInNewWorkbook = 2 | 시트가 2개인 문서 만들기 |
| 한 줄 읽기 | Line Input #1, strData | 줄 단위로 읽기 |
| 열 나누기 | If c = 256 Then | 두 번째 시트로 전환 |
| 진행 표시 | Application.StatusBar | 상태표시줄에 진행 상황 표시 |
| 화면 갱신 | Application.ScreenUpdating = False | 속도 향상 |
자주 묻는 질문 (FAQ)
Q1. auto_open 프로시저는 무엇인가요?
해당 파일이 열릴 때마다 자동으로 실행되는 프로시저이며, 반대 역할의 auto_close도 있습니다.
Q2. 이벤트 프로시저란 무엇인가요?
클릭이나 폼 실행 같은 이벤트가 발생할 때 그에 대응해 자동으로 실행되는 프로시저입니다.
Q3. 256열이 넘는 텍스트 파일은 어떻게 불러오나요?
한 줄씩 읽어 열 번호를 세다가 256열이 되면 다른 시트에 이어서 채우는 방식으로 불러올 수 있습니다.
마치며
열 방향으로 나누어 불러오는 방법을 익혔다면 행 방향으로도 같은 원리를 응용할 수 있습니다.