- 최초 작성일: 2000-10-13
- 최종 수정일: 2026-09-30
- 조회수: 11 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 파일 입출력에 관한 미셀러니
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
지난 시간에 기본적인 텍스트 파일 입/출력 방법들에 대해서는 설명을 드렸습니다. 이것들을 잘 응용하시면 어지간한 텍스트 파일 입/출력 작업은 일도 아닐 것입니다. 이번 시간에는 이러한 것들을 응용하여 Excel을 열고 닫을 때마다 작업 시간들이 기록되도록 하는 방법과 두 개의 텍스트 파일을 가지고 함께 작업하는 방법에 대해 알아보도록 하지요.
파일 입출력에 관한 미셀러니
핵심 요약: 로그 기록과 파일 복사
Append 모드로 로그를 덧붙이고, 두 파일을 동시에 열어 InStr로 조건에 맞는 줄만 다른 파일로 복사합니다.
- 1단계: Workbook_Open과 BeforeClose 이벤트에서 Open For Append로 로그 파일을 엽니다.
- 2단계: Print #으로 사용자와 시각을 기록하고 Close로 닫습니다.
- 3단계: 두 파일을 열고 InStr로 조건에 맞는 줄만 Print #2로 내보냅니다.
Step 1: 파일을 열고 닫을 때마다 기록 남기기
아마 이 파일을 열었을 때 메시지 박스가 하나 나타나면서 "…ExcelLogInOut.txt…"라는 메시지가 나타났을 것입니다. 이것은 특정 파일을 열거나 종료할 때, 그 흔적을 별도의 텍스트 파일에 남겨둠으로써 사용자가 언제 파일을 열어보았는지 그리고 얼마동안 작업을 하였는지 등을 알 수 있게 됩니다.
코드는 엄청 간단합니다. 이 프로시저는 Workbook_Open과 BeforeClose 이벤트를 사용하므로 VB Editor 상태에서 프로젝트 탐색기에 보면 ThisWorkbook 오브젝트가 있는데 이것을 더블클릭하고 해당 이벤트를 선택한 다음 코드를 작성합니다.
Option Explicit
Dim strUserName As String
Dim strPath As String
'//프로시저를 실행하기 전에 외부 변수를 선언합니다. 이렇게 해 두면 다른 프로시저에서
'//별도의 선언없이도 함께 사용을 할 수 있습니다.
Private Sub Workbook_Open()
Dim Msg As String
strUserName = Application.UserName & "님의 "
strPath = ThisWorkbook.Path & Application.PathSeparator
Open strPath & "ExcelLogInOut.txt" For Append As #1
'//다른 것은 특별한 것이 없는데 바로 이 부분에서 주의를 하셔야 합니다. 즉 Output 문장을
'//사용하면 새로운 파일이 생성되므로 매번 로그인/아웃 기록을 파일 맨 밑에 덧붙이기 위해
'//Append Statement를 사용했습니다.
Print #1, strUserName & " LogIn Time: " & Now
'//Print Statement에 대해서는 지난 시간에 설명을 드렸지요? 탭으로 구분된 파일을 생성할
'//때, 사용합니다.
Close #1
Msg = strPath & "폴더에 " & vbCr
Msg = Msg & "ExcelLogInOut.txt 파일이 생성되었습니다"
MsgBox Msg, , "LogIn 파일 생성//Exceller"
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'//파일을 닫기 전에 기록을 남기기 위해 Workbook_BeforeClose 이벤트를 사용했습니다.
'//코드는 Workbook_Open의 그것과 거의 같습니다.
strUserName = Application.UserName & "님의 "
strPath = ThisWorkbook.Path & Application.PathSeparator
Open strPath & "ExcelLogInOut.txt" For Append As #1
Print #1, strUserName & " LogOut Time: " & Now
Close #1
End Sub
이렇게 하면 이 파일을 열 때 마다 LogIn 기록이 남게 됩니다. 이번에는 LogOut을 할 때마다 기록이 남도록 하기 위한 방법입니다. 마찬가지로 Event 프로시저를 사용합니다.
이해 하시겠지요?
여러분 PC에 OOO.Log 또는 OOLogOO.txt 등의 파일이 곳곳에 있을 것입니다. 이러한 파일들은 모두 위에서 설명드린 것과 비슷한 방법을 사용해서 사용자들의 작업내역을 기록해 둔 파일입니다. WinZip 압축 유틸리티를 사용하시는 분들은 C:\ 밑에 Winzip.log 파일을 워드패드 등으로 열어 보세요. 그동안의 작업내용들이 고스란히 기록되어 있는 것을 확인하실 수 있습니다.
사용자 이름과 작업 시각을 파일에 남기는 기능은 개인 정보 및 사내 보안 정책과 관련될 수 있으므로 사용 전에 대상자에게 알려야 합니다. 또한 Application.UserName은 엑셀 옵션에서 바꿀 수 있으므로 정확한 사용자 식별용으로는 적합하지 않을 수 있습니다.
Step 2: 특정 문자열이 있는 줄만 다른 파일로 복사하기
이번에는 또다른 것을 하나 해 보도록 하지요. 텍스트 파일 중에서 특정한 문자열을 포함하고 있는 라인만을 다른 파일로 복사하는 방법입니다. 버튼을 눌러 보세요.
아래 코드는 TextIn.txt 파일에서 "3월"이 포함된 줄만 MakeFile.txt 파일로 복사합니다(TextIn.txt는 월별 자료가 한 줄씩 들어 있는 텍스트 파일이며 강좌 파일과 같은 폴더에 둡니다).
Sub MakeAnotherFile()
Dim strTemp As String
Dim strData As String
Dim Msg As String
Open ThisWorkbook.Path & "\TextIn.txt" For Input As #1
Open ThisWorkbook.Path & "\MakeFile.txt" For Output As #2
strTemp = "3월"
'//지금까지와는 달리 두 개의 파일을 오픈하였습니다. 하나는 Input 문으로, 다른 하나는
'//Output 문으로 열었습니다.
Do While Not EOF(1)
Line Input #1, strData
If InStr(1, strData, strTemp) Then Print #2, strData
'//InStr() 함수는 VBA 함수로 특정 문자열 중에서 지정한 문자열이 처음으로 나타난 위치를
'//알려주는 함수입니다. 따라서 3월 이라는 문자열이 포함된 레코드(라인)이면 #2 파일로
'//내보냅니다. InStr()은 중요한 함수이므로 도움말을 참고하시기 바랍니다.
Loop
Close
'//Close Statement 뒤에 #1, #2 등과 같은 file number list를 생략하면 Open문으로 연 모든
'//파일들을 닫습니다.
Msg = "MakeFile.txt 파일이 생성되었습니다" & vbCr
Msg = Msg & "파일을 열어서 확인해 보세요"
MsgBox Msg, , "파일 생성//Exceller"
End Sub
몇 줄 안되는 짧은 코드이지만 아주 유용한 것이니까 잘 익혀두시기 바랍니다.
마무리
다음 시간에…
정리 — 파일 입출력 활용 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 덧붙이기 | Open 경로 For Append As #1 | 파일 끝에 계속 추가 |
| 기록 | Print #1, 텍스트 & Now | 사용자와 시각 기록 |
| 열기·닫기 이벤트 | Workbook_Open / Workbook_BeforeClose | 자동 실행 |
| 문자열 검색 | InStr(1, strData, strTemp) | 특정 문자열 위치 확인 |
| 모두 닫기 | Close | 열린 모든 파일 닫기 |
자주 묻는 질문 (FAQ)
Q1. 파일을 열고 닫은 기록은 어떻게 남기나요?
Workbook_Open과 Workbook_BeforeClose 이벤트에서 Append 모드로 텍스트 파일을 열어 시각을 기록하면 됩니다.
Q2. Append 모드는 무엇인가요?
기존 파일 내용을 지우지 않고 맨 아래에 새 내용을 덧붙이는 파일 열기 방식입니다.
Q3. Close 문에 파일 번호를 생략하면 어떻게 되나요?
Open 문으로 연 모든 파일이 닫힙니다.
마치며
Append 모드와 InStr만 알아도 로그 기록과 조건 추출 같은 실무 자동화를 간단히 구현할 수 있습니다.