대량 엑셀 파일 처리를 위한 기본 프레임워크
다수의 워크북을 자동으로 열고 작업한 후 저장하여 닫는 일괄 처리 루틴은 반복적인 오피스 업무 자동화에서 핵심적인 역할을 한다. 아래 코드는 사용자가 선택한 여러 개의 Excel 파일을 순차적으로 열어 처리하는 구조를 제공한다.
Sub ExecuteWorkbookBatch()
Dim index As Integer
Dim fileArray As Variant
Dim book As Workbook
Dim wasAlreadyOpen As Boolean
On Error GoTo ErrorHandler
' 사용자에게 파일 선택 대화상자 표시
fileArray = Application.GetOpenFilename("Excel Files, *.xls;*.xlsx", , "처리할 파일 선택", , True)
If IsArray(fileArray) = False Then
Debug.Print "선택된 파일이 없습니다."
Exit Sub
End If
Application.ScreenUpdating = False
For index = LBound(fileArray) To UBound(fileArray)
Dim filePath As String
filePath = CStr(fileArray(index))
If IsWorkBookActive(filePath) Then
Set book = Workbooks(GetFileNameFromPath(filePath))
Debug.Print "이미 열려 있음: " & book.Name
wasAlreadyOpen = True
Else
Set book = Workbooks.Open(filePath, ReadOnly:=False)
Debug.Print "열기 완료: " & book.Name
wasAlreadyOpen = False
End If
Application.StatusBar = book.Name & " 처리 중..."
' 실제 처리 로직 삽입 위치
Debug.Print "여기에 각 통합 문서에 대한 작업 코드를 추가하세요."
' 처음부터 열었으면 닫기
If Not wasAlreadyOpen Then
book.Close SaveChanges:=True
Debug.Print "저장 및 종료: " & book.Name
End If
Next index
Set book = Nothing
Exit Sub
ErrorHandler:
Application.StatusBar = False
Application.ScreenUpdating = True
MsgBox "오류 발생: " & Err.Description
End Sub
워크북의 열림 상태 확인 방법
특정 파일이 현재 Excel 세션에서 열려 있는지를 판단하는 것은 불필요한 재오픈을 방지하고 충돌을 피하기 위해 중요하다. 다음 함수는 전달된 경로 또는 이름을 기준으로 해당 통합 문서가 열려 있는지 확인한다.
Function IsWorkBookActive(fileNameOrPath As String) As Boolean
Dim wb As Workbook
Dim shortName As String
On Error Resume Next
shortName = GetFileNameFromPath(fileNameOrPath)
For Each wb In Workbooks
If StrComp(wb.Name, shortName, vbTextCompare) = 0 Then
IsWorkBookActive = True
Exit Function
End If
Next wb
IsWorkBookActive = False
End Function
' 전체 경로에서 파일명만 추출
Function GetFileNameFromPath(fullPath As String) As String
Dim pos As Integer
pos = InStrRev(fullPath, "\")
If pos > 0 Then
GetFileNameFromPath = Mid(fullPath, pos + 1)
Else
GetFileNameFromPath = fullPath
End If
End Function
문자열 비교 및 검색 함수 활용
VBA에서는 문자열 조작을 위한 내장 함수들을 제공한다. 특히 InStr, InStrRev, StrComp는 조건 분기나 데이터 정제 과정에서 유용하게 사용된다.
- InStr: 특정 문자열 내에서 서브스트링의 첫 번째 등장 위치를 반환함 (시작 인덱스 지정 가능)
- InStrRev: 오른쪽 끝에서부터 왼쪽 방향으로 검색하여 마지막 위치를 찾음
- StrComp: 두 문자열을 비교하고 -1, 0, 1 값을 반환함. 비교 모드는
vbBinaryCompare(대소문자 구분) 또는vbTextCompare(비구분)로 설정 가능
Worksheets 컬렉션 접근 방식
통합 문서 내 시트에 접근할 때는 인덱스 또는 이름을 사용할 수 있으며, 명시적으로 Item 메서드를 호출해도 동일한 결과를 얻는다.
Sub AccessWorksheetExamples()
With ThisWorkbook.Worksheets
' 인덱스 기반 접근
Debug.Print .Item(1).Name
' 이름 기반 접근
Debug.Print .Item("Sheet1").Name
End With
End Sub
외부 링크 관리 자동화
다른 파일에 의존하는 링크가 포함된 통합 문서의 경우, 원본 파일 이동이나 이름 변경 시 문제가 발생할 수 있다. 이를 사전에 점검하고 갱신하는 절차가 필요하다.
' 모든 Excel 기반 링크 출력
Sub DisplayLinkedSources(book As Workbook)
Dim links As Variant
Dim i As Integer
links = book.LinkSources(xlExcelLinks)
If Not IsEmpty(links) Then
For i = 1 To UBound(links)
Debug.Print "연결됨: " & links(i)
Next i
Else
Debug.Print book.Name & "에는 링크가 없습니다."
End If
End Sub
' 링크 경로 수정
Sub UpdateLinkSource(book As Workbook, oldPath As String, newPath As String)
On Error Resume Next
book.ChangeLink Name:=oldPath, NewName:=newPath, Type:=xlExcelLinks
End Sub
' 링크 상태 조회
Function FetchLinkHealth(book As Workbook, linkPath As String) As String
Dim status As Long
Dim result As String
status = book.LinkInfo(linkPath, xlLinkInfoStatus)
Select Case status
Case xlLinkStatusOK: result = "정상"
Case xlLinkStatusMissingFile: result = "파일 없음"
Case xlLinkStatusSourceNotOpen: result = "원본 미열림"
Case xlLinkStatusInvalidName: result = "잘못된 이름"
Case Else: result = "알 수 없는 상태"
End Select
FetchLinkHealth = result
End Function
Workbook 속성 정보 추출
현재 열려 있는 통합 문서의 다양한 속성을 프로그래밍 방식으로 확인할 수 있다. 이는 호환성 검사나 자동 보고서 생성에 유용하다.
Sub ShowWorkbookMetadata(book As Workbook)
Debug.Print "이름: " & book.Name
Debug.Print "전체 경로: " & book.FullName
Debug.Print "형식: " & DescribeFileFormat(book.FileFormat)
Debug.Print "읽기 전용: " & IIf(book.ReadOnly, "예", "아니오")
Debug.Print "변경됨: " & IIf(book.Saved, "저장됨", "저장 필요")
End Sub
Function DescribeFileFormat(formatCode As Long) As String
Select Case formatCode
Case xlWorkbookNormal: DescribeFileFormat = "일반 통합 문서"
Case xlCSV: DescribeFileFormat = "CSV"
Case xlExcel9795: DescribeFileFormat = "Excel 97-2003"
Case Else: DescribeFileFormat = "기타 (" & formatCode & ")"
End Select
End Function
통합 문서 수준 이벤트 응답
VBA에서는 ThisWorkbook 객체에 특정 이벤트 핸들러를 연결하여 사용자의 동작에 반응할 수 있다. 예를 들어, 통합 문서가 열리거나 시트가 변경될 때 특정 작업을 수행하도록 설정할 수 있다.
Private Sub Workbook_Open()
Dim response As VbMsgBoxResult
response = MsgBox("이 통합 문서의 이벤트 기능을 활성화하시겠습니까?", vbYesNo, "이벤트 설정")
ThisWorkbook.Sheets(1).Range("EventToggle") = IIf(response = vbYes, "Enabled", "Disabled")
End Sub
Private Sub Workbook_SheetChange(ByVal ws As Object, ByVal target As Range)
If IsEventEnabled() Then
Debug.Print ws.Name & "의 범위 " & target.Address & "이(가) 수정되었습니다."
End If
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If IsEventEnabled() Then
Debug.Print "통합 문서를 종료합니다. 안녕히 가세요!"
End If
End Sub
Function IsEventEnabled() As Boolean
Dim setting As String
setting = ThisWorkbook.Sheets(1).Range("EventToggle").Value
IsEventEnabled = (StrComp(setting, "Enabled", vbTextCompare) = 0)
End Function