VBA 코드 변경사항 분석 문서(mod_FileData_Copy모듈, mod_Menu01_DSD_File 모듈)

은아·2025년 7월 18일

VBA 코드 변경사항 분석 문서(mod_FileData_Copy모듈)

DSD_Data_Copy 함수의 개선 버전과 원본 버전을 비교하여 주요 변경사항을 정리하였습니다.

주요 변경사항

1. 함수 구조 개편

새로 추가된 함수들

  • DSD_Data_Copy_Improved: 기존 DSD_Data_Copy의 개선된 버전
  • Store_XBRL_Backup_Data: XBRL 데이터 백업을 위한 새로운 함수
  • Restore_XBRL_Backup_Data: 백업된 XBRL 데이터 복원을 위한 새로운 함수
  • WorksheetExists: 워크시트 존재 여부 확인 함수

함수 재정의

' 기존 함수를 새로운 방식으로 교체
Sub DSD_Data_Copy(strPath As String, Optional targetSheets As String = "")
    Call DSD_Data_Copy_Improved(strPath, targetSheets)
End Sub

2. 전역 변수 추가

수정된 코드에서는 XBRL 데이터 백업을 위한 전역 변수들이 추가되었습니다:

Private g_XBRL_Backup_Data As Variant
Private g_XBRL_Backup_Formulas As Variant
Private g_XBRL_Backup_Formats As Variant
Private g_Has_Backup_Data As Boolean

3. 매개변수 변경

DSD_Data_Copy_Improved 함수

  • 새로운 매개변수 추가: Optional targetSheets As String = ""
  • 특정 시트만 선택적으로 업데이트할 수 있는 기능 추가

4. 업데이트 모드 처리 로직 추가

업데이트 모드 확인

'## 업데이트 모드 확인
If rng_Refresh_List.Cells(i, 5).value = "DSD Update" Then
    isUpdateMode = True
End If

사용자 선택 다이얼로그

  • 기존 시트 덮어쓰기 vs 건너뛰기 옵션 제공
  • 복잡한 3단계 선택에서 2단계 선택으로 단순화

5. XBRL 데이터 백업 및 복원 시스템

백업 프로세스

  • 수식과 값을 별도로 저장
  • 서식 정보(NumberFormat, HorizontalAlignment, Font.Bold) 포함
  • 수식을 텍스트 형태로 완전 백업
'## 수식을 완전한 텍스트로 저장
If cell.HasFormula Then
    backup_Data(r, c) = cell.Formula  ' 예: =D8
    backup_Formulas(r, c) = True
Else
    backup_Data(r, c) = cell.value
    backup_Formulas(r, c) = False
End If

복원 프로세스

  • 백업된 데이터와 서식을 원래 위치에 복원
  • 수식의 경우 원본 수식 그대로 복원

6. 제거된 기능들

복잡한 테이블 처리 로직 제거

원본 코드에 있던 다음 기능들이 제거되었습니다:

  • 테이블 경계선 분석 및 병합 처리
  • 구분/Content/Head/Data 영역 분석
  • 복잡한 셀 병합 및 데이터 재배치
  • "-"로 시작하는 말주석 정리
  • 정규식을 이용한 패턴 매칭

제거된 변수들

' 제거된 변수들
Dim rng_Table, rng_Temp As Range
Dim rng_LeftTop, rng_RightBottom As Range
Dim rng_LeftTop_Temp, rng_RightBottom_Temp, rng_Line_Temp As Range
Dim iTable, iRow, iCol As Integer
Dim name_Temp As Name

7. 코드 구조 단순화

메인 처리 로직

  • 복잡한 테이블 분석 대신 단순한 데이터 복사 방식 채택
  • UsedRange를 이용한 직접적인 데이터 이관
  • 불필요한 중첩 루프 제거

8. 처리 결과 메시지 개선

상세한 상태 메시지

'## 처리 결과 기록
If ws_New_Sheet Is Nothing Then
    rng_Refresh_List.Cells(i, 9).value = "'DSD 업데이트 완료 (기존 시트 덮어쓰기)"
Else
    rng_Refresh_List.Cells(i, 9).value = "'DSD 업데이트 완료 (새 시트: " & str_New_SheetName & ")"
End If

변화된 점

기능 변화

  • 추가: XBRL 데이터 보존 기능
  • 추가: 선택적 시트 업데이트 기능
  • 제거: 고급 테이블 서식 처리 기능
  • 단순화: 사용자 인터페이스

수정된 코드는 복잡한 테이블 처리 기능을 제거하고 XBRL 데이터 보존에 중점을 두었습니다. 고급 테이블 서식 처리 기능은 삭제하였고 그 부분은 다시 한번 살펴봐주셔도 됩니다.


VBA 코드 변경사항 분석 (mod_Menu01_DSD_File 모듈)

DSD_File_Select와 DSD_Sheet_Add 함수의 수정 버전과 원본 버전을 비교하여 주요 변경사항을 정리하였습니다.

1. DSD_File_Select 함수 변경사항

1.1 변수 타입 변경

' 기존 코드
Dim iRow As Integer

' 수정된 코드  
Dim iRow As Long
  • 변경 이유: Long 타입이 더 큰 범위의 숫자를 처리할 수 있어 변경

2. DSD_Sheet_Add 함수 변경사항

2.1 함수 시그니처 변경:

이 부분은 작동되는 부분이 아닌듯하여 기존 코드로 가도 될 것 같습니다. (특정 시트 업데이트 기능이라 적어놓은 부분은 제외해도 됨)

' 기존 코드
Sub DSD_Sheet_Add()

' 수정된 코드
Sub DSD_Sheet_Add(Optional updateSpecificSheets As Boolean = False, Optional sheetList As String = "")
  • 추가된 매개변수:
    • updateSpecificSheets: 특정 시트만 업데이트할지 여부
    • sheetList: 업데이트할 시트 목록

2.2 변수 타입 변경

' 기존 코드
Dim iRow_Refresh As Integer, iRow As Integer, i As Integer

' 수정된 코드
Dim iRow_Refresh As Long, iRow As Long, i As Long

2.3 새로운 변수 추가

' 수정된 코드에만 있는 변수들
Dim ws_Existing As Worksheet
Dim bSheetExists As Boolean

2.4 시트 생성 조건 변경

' 기존 코드
If ws_Index.Cells(i, "E").value = "Y" And InStr(1, ws_Index.Cells(i, "F").value, "생성 필요") > 0 Then

' 수정된 코드
If ws_Index.Cells(i, "E").value = "Y" Then 'And InStr(1, ws_Index.Cells(i, "F").value, "생성 필요") > 0 Then
  • 변경 사항: 옆 비고에서 생성 필요를 계속 적어야 한다는 점이 불편하여 "생성 필요" 조건 체크를 주석 처리하여 비활성화

2.5 특정 시트 선택적 업데이트 기능 추가(추가하지 않아도 될 듯합니다.)

' 수정된 코드에만 있는 로직
'## 특정 시트만 업데이트하는 경우 해당 시트인지 확인
If updateSpecificSheets Then
    If InStr(1, "/" & sheetList & "/", "/" & Trim(ws_Index.Cells(i, "D").value) & "/") = 0 Then
        GoTo NextIteration  '## 해당 시트가 아니면 건너뛰기
    End If
End If

2.6 기존 시트 업데이트 로직 추가

기존 코드에서는 중복 시트명이 있으면 에러로 처리했지만, 수정된 코드에서는 업데이트 옵션을 제공:

' 기존 코드 (중복 시트 에러 처리)
ElseIf InStr(1, str_ALL_SheetName, UCase("/" & str_SheetName & "/")) <> 0 Then
    MsgBox "생성 대상 시트 중 기존시트와 중복된 시트명이 있습니다.", vbInformation, "생성 시트 이름 확인"
    GoTo StopRun

' 수정된 코드 (업데이트 옵션 제공)
If InStr(1, str_ALL_SheetName, UCase("/" & str_SheetName & "/")) <> 0 Then
    '## 기존 시트가 있는 경우 업데이트 모드로 처리
    On Error Resume Next
    Set ws_Existing = ThisWorkbook.Sheets(str_SheetName)
    On Error GoTo 0
    
    If Not ws_Existing Is Nothing Then
        '## 사용자에게 업데이트 여부 확인
        If MsgBox("기존 시트 '" & str_SheetName & "'가 이미 존재합니다." & Chr(10) & _
                  "DSD 부분만 업데이트하시겠습니까?" & Chr(10) & Chr(10) & _
                  "※ XBRL 데이터는 보존됩니다.", vbQuestion + vbYesNo, "기존 시트 업데이트") = vbYes Then
            
            '## 갱신목록에 업데이트 모드로 기록
            rng_Refresh_List.Cells(iRow_Refresh + 1, 5).value = "DSD Update"
        Else
            GoTo NextIteration
        End If
    End If

2.7 NextIteration 라벨 추가

' 수정된 코드에만 있는 라벨
NextIteration:
    Next

2.8 갱신목록 처리 방식 변경

' 기존 코드 (모든 시트를 새로 생성)
For i = 1 To rng_Refresh_List.Rows.Count
    '## 시트 생성
    Set ws_New = ThisWorkbook.Sheets.Add(after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))

' 수정된 코드 (새 시트만 생성, 업데이트는 별도 처리)
For i = 1 To rng_Refresh_List.Rows.Count
    '## DSD New인 경우만 새 시트 생성
    If rng_Refresh_List.Cells(i, 5).value = "DSD New" Then
        '## 시트 생성
        Set ws_New = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))

2.11 삭제된 코드

기존 코드에서 제거된 부분:

'## 생성된 시트기록 (갱신목록)
'@@rng_Refresh_List.Cells(i, 6).value = "'" & Format(Now(), "yyyy-MM-dd HH:mm:ss")

주석 처리된 마지막 부분:

' 기존 코드 (주석 처리되어있음)
'    Application.GoTo ws_Index.Cells(i, "A"), True
'    Application.GoTo ws_Index.Cells(i, "D"), False

주요 기능 변화 요약

추가된 기능

  1. 기존 시트 업데이트 모드: 중복 시트 발견 시 업데이트 옵션 제공
  2. XBRL 데이터 보존: 업데이트 시 기존 XBRL 데이터 유지

수정된 기능

  1. 데이터 타입: Integer → Long 변경
  2. 새 생성과 업데이트를 구분하여 처리

제거된 기능

  1. "생성 필요" 조건 체크
  2. 타임스탬프 기록: 시간 기록 제거
profile
Junior Developer 개발 기술 정리 블로그

0개의 댓글