역사에 대한 훼손을 위해 발악하는 그들을 끝까지 추적해서

말살해버려야 합니다.

* 문제
VBA는 스크립트 언어로, 오류가 발생하면 Macro에 포함된 모든 전역 변수가 초기화 된다. (실질적으로 프로그램이 재시작하는 것으로 생각하면 된다.) 이로 인해, 프로그램이 지속될 수 있도록 전역변수들을 외부에 저장해야 할 필요성이 있다.

* 해결
변수들의 데이터를 저장할 클래스(clsInfoBackUp) 개발
변수명을 key로 하여, 데이터를 저장하며, 배열에 대해서는 배열의 차원수 및 크기를 저장할 수 있다.
특정 형식을 가진 Txt 파일로 가지고 있는 데이터를 저장할 수 있으며, 해당 파일로부터 데이터를 가져올 수 있다.

# clsInfoBackUp 클래스는 파일로 올렸습니다. 이용하기 편하게 ^^
  클래스가 800라인이 넘어가서 복사하기 힘들듯 해서요.ㅎㅎ

정보 저장 및 불러오기
오류가 발생할 수 있는 단계 직전에 아래의 코드를 삽입한다.
전역변수의 데이터를 확인한 후, 데이터가 유지되고 있으면, 저장하고, 소실되었다면 백업파일로부터 정보를 가져온다.

   
If Len(gstrPubVariable) = 0 Then
   Call modPublicDefs.LoadPubData
Else
   Call modPublicDefs.SavePubData
End If


clsInfoBackUp의 사용

사용중인 모든 전역변수를 그 이름을 key로 해서 데이터를 저장하고, 불러오는 함수를 작성한다.

   
Public Sub SavePubData() 
    Dim oBackUp As New clsInfoBackUp 
       
    Call oBackUp.AddValue("gstrLoginName", gstrLoginName) 
    Call oBackUp.AddValue("gstrUserID", gstrUserID) 
 
    oBackUp.SaveData 
    oBackUp.Clear 
    Set oBackUp = Nothing 
End Sub 
  
Public Sub LoadPubData() 
    Dim oBackUp As New clsInfoBackUp 
    Call oBackUp.LoadData 
    
    gstrLoginName = oBackUp.GetValue("gstrLoginName") 
    gstrUserSid = oBackUp.GetValue("gstrUserID") 
    oBackUp.Clear
    Set oBackUp = Nothing
End Sub


#Tip
때에 따라... 매우 많은 전역변수가 있을 것인데, 엑셀을 사용하면 편하다.
전역변수 선언을 모두 엑셀에 복사하고, 데이터를 나누어서 변수명만을 가져오고, 엑셀의 수식을 통해서 코드를 작성!!!
생각보다 짧은 시간이 소모된다.
엑셀은 정말 신적인 존재다.ㅠㅠ

# 아래 코드 중에 에러를 체크하고 핸들링하는 부분이 있는 데...
솔직히 나는 아직 에러 핸들링을 잘못하는 편이다. 아래에 포한된 부분들은 어디선가 복사를 하다보니;;

   
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "clsInfoBackUp"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
'/***********************************************************************************
' 파일명    : clsInfoBackUp
' 작성자    : 정진우
' 목적      : VBA는 script 언어로 코드 수행 중, 오류가 발생하면 모든 전역 변수가 초기화된다.
'             이로인해, 전역변수에 대한 backup이 필요하여, 이 backup은 text file로 이뤄진다.
' 사용방식  : 전역 변수가 정의된 모듈(modPublicDefs)에 SavePubData, LoadPubData를 정의해 이를 통해 사용한다.
'             LoadPubData, SavePubData 사용!
'             오류 발생 가능성이 존재하여, backup이 필요한 시점에 모든 전역 변수 정보를 AddValue 함수를 통해 저장하고,
'             SaveData 함수를 통해, file을 생성한다.
'             그리고 전역 변수를 다시 사용할 시점에 LoadData를 통해 file에 저장된 데이터를 가져오고,
'             GetValue를 통해, 전역 변수 데이터를 재할당한다.
'             본 클래스는 데이터 저장을 hashtable 형태로 하며, 그 key는 변수명으로 한다.
' 사용파일  :
' 제한사항  :
' 오류처리  :
' Remark    :
'               key와 data는 '|'를 구분자로 하여, file에 저장된다.
'                   key|data
'               array에 대한 저장은 다음의 형식으로 저장된다.
'               1. Array Info: varName(Array Dimension)|LBound-UBound{|LBound-UBound}*
'               2. Array Data: varName-index{-index}|data
'                   # {...} : 묶음
'                   # * : 0...n개 반복
'                   # AddData, GetData 등을 참조
'               Ex_
'                   # Define As
'                     dim array(,)
'                     redim array(1 to 5, 2 to 8)
'                   # Added to Table
'                     Array Info: key: array(2), data: 1-5|2-8
'                     Array Data(1,2): key: array-1-2, data: value12
'                     Array Data(3,6): key: array-3-6, data: value36
'                   # Save in file
'                     array(2)|1-5|2-8
'                     array-1-2|value12
'                     array-3-6|value36
' 이력사항
'           2012. 01/11 정진우
'               1. 생성
'/***********************************************************************************
Option Explicit

Private Const backupFilePath As String = "D:\NewSpot\Txt\"
Private Const backupFileName As String = "PublicDefsBackUp.txt"

Private Type hashtable
    key As Variant
    value As Variant
End Type

Private hashtbl() As hashtable
Private GetErrMsg As String

'/***********************************************************************************
' 함수명    : Class_Initialize
' 작성자    : 정진우
' 설명      : 생성자
' 리턴값    :
' 매개변수
' Psedo-Code
'
' Remark
' 이력사항
'           2012. 01/11 정진우
'               1. 생성
'/***********************************************************************************
Public Sub Class_Initialize()
    GetErrMsg = ""
    On Error GoTo CreateErr
        ReDim hashtbl(0)
    Exit Sub

CreateErr:
    GetErrMsg = Err.Description
End Sub

'/***********************************************************************************
' 함수명    : Class_Terminate
' 작성자    : 정진우
' 설명      : 파괴자
' 리턴값    :
' 매개변수
'           param     :
' Psedo-Code
'
' Remark
' 이력사항
'           2012. 01/11 정진우
'               1. 생성
'/***********************************************************************************
Private Sub Class_Terminate()
    'Set hashtbl = Nothing
End Sub

'/***********************************************************************************
' 함수명    : GetValue
' 작성자    : 정진우
' 설명      : 지정한 키에 대한 값을 반환한다.
' 리턴값    :
' 매개변수
'           key     : 데이터를 알아낼 key
' Psedo-Code
'           hashtable에 대한 순차검색을 수행한다.
'           key값이 동일하면, 일반 변수이며, key에 "("가 포함되면 array 변수이다.
'           Array 변수의 경우 "()"로 묶음 값이 차원의 개수이다.
' Remark
' 이력사항
'           2012. 01/11 정진우
'               1. 생성
'/***********************************************************************************
Public Function GetValue(key As Variant) As Variant
    GetErrMsg = ""
    On Error GoTo GetValueErr
        Dim found As Boolean
        Dim i As Long
        found = False
        
        For i = 1 To UBound(hashtbl)
            If hashtbl(i).key = key And IsEmpty(hashtbl(i).key) = False Then
                GetValue = hashtbl(i).value
                Exit Function
            ElseIf InStr(1, hashtbl(i).key, key & "(", vbBinaryCompare) > 0 Then
                'Array Value
                Dim startIndex As Long
                Dim endIndex As Long
                startIndex = InStr(1, hashtbl(i).key, "(")
                endIndex = InStr(startIndex, hashtbl(i).key, ")")
                Dim dimCnt As Long
                dimCnt = CLng(Mid(hashtbl(i).key, startIndex + 1, endIndex - startIndex - 1))
                Select Case dimCnt
                    Case 1
                        GetValue = GetArrayValue1(key)
                    Case 2
                        GetValue = GetArrayValue2(key)
                    Case 3
                        GetValue = GetArrayValue3(key)
                    Case 4
                        GetValue = GetArrayValue4(key)
                    Case Else
                End Select
                Exit Function
            End If
        Next i
        
        Err.Raise 9997, , "Key [" & CStr(key) & "] not found"

    Exit Function

GetValueErr:
    GetValue = ""
    GetErrMsg = Err.Description
End Function

'/***********************************************************************************
' 함수명    : GetArrayValue1
' 작성자    : 정진우
' 설명      : 1차원으로 구성된 정보를 반환한다.
' 리턴값    :
' 매개변수
'           key     :
' Psedo-Code
'
' Remark
' 이력사항
'           2012. 01/12 정진우
'               1. 생성
'/***********************************************************************************
Private Function GetArrayValue1(key As Variant) As Variant
    GetErrMsg = ""
On Error GoTo GetArrayValue1Err
    
    Dim i As Long
    Dim arrayInfo As Variant
    Const dimCnt As Integer = 1
    arrayInfo = GetValue(key & "(" & CStr(dimCnt) & ")")
    Dim lowBound(1 To dimCnt) As Long
    Dim upBound(1 To dimCnt) As Long
    
    For i = 1 To dimCnt
        arrayInfo = GetBoundary(arrayInfo, lowBound(i), upBound(i))
    Next i
    
    Dim arrayValue()
    ReDim arrayValue(lowBound(1) To upBound(1) _
                     )

    For i = 1 To dimCnt
        arrayInfo = GetBoundary(arrayInfo, lowBound(i), upBound(i))
    Next i
    
    For i = lowBound(1) To upBound(1)
        arrayValue(i) = GetValue(key & "-" & CStr(i))
    Next i
    
    GetArrayValue1 = arrayValue
    
    Exit Function

GetArrayValue1Err:
    GetArrayValue1 = Null
    GetErrMsg = Err.Description
End Function

'/***********************************************************************************
' 함수명    : GetArrayValue2
' 작성자    : 정진우
' 설명      : 2차원으로 구성된 정보를 반환한다.
' 리턴값    :
' 매개변수
'           key     :
' Psedo-Code
'
' Remark
' 이력사항
'           2012. 01/12 정진우
'               1. 생성
'/***********************************************************************************
Private Function GetArrayValue2(key As Variant) As Variant
    GetErrMsg = ""
On Error GoTo GetArrayValue2Err
    
    Dim i As Long
    Dim j As Long
    Dim arrayInfo As Variant
    Const dimCnt As Integer = 2
    arrayInfo = GetValue(key & "(" & CStr(dimCnt) & ")")
    Dim lowBound(1 To dimCnt) As Long
    Dim upBound(1 To dimCnt) As Long
    
    For i = 1 To dimCnt
        arrayInfo = GetBoundary(arrayInfo, lowBound(i), upBound(i))
    Next i
    
    Dim arrayValue()
    ReDim arrayValue(lowBound(1) To upBound(1) _
                     , lowBound(2) To upBound(2) _
                     )
    
    For i = lowBound(1) To upBound(1)
        For j = lowBound(2) To upBound(2)
            arrayValue(i, j) = GetValue(key & "-" & CStr(i) & "-" & CStr(j))
        Next j
    Next i
    
    GetArrayValue2 = arrayValue
    
    Exit Function

GetArrayValue2Err:
    GetArrayValue2 = Null
    GetErrMsg = Err.Description
End Function

'/***********************************************************************************
' 함수명    : GetArrayValue3
' 작성자    : 정진우
' 설명      : 3차원으로 구성된 정보를 반환한다.
' 리턴값    :
' 매개변수
'           key     :
' Psedo-Code
'
' Remark
' 이력사항
'           2012. 01/12 정진우
'               1. 생성
'/***********************************************************************************
Private Function GetArrayValue3(key As Variant) As Variant
    GetErrMsg = ""
On Error GoTo GetArrayValue3Err
    
    Dim i As Long
    Dim j As Long
    Dim k As Long
    Dim arrayInfo As Variant
    Const dimCnt As Integer = 3
    arrayInfo = GetValue(key & "(" & CStr(dimCnt) & ")")
    Dim lowBound(1 To dimCnt) As Long
    Dim upBound(1 To dimCnt) As Long
    
    For i = 1 To dimCnt
        arrayInfo = GetBoundary(arrayInfo, lowBound(i), upBound(i))
    Next i
    
    Dim arrayValue()
    ReDim arrayValue(lowBound(1) To upBound(1) _
                     , lowBound(2) To upBound(2) _
                     , lowBound(3) To upBound(3) _
                     )
    
    For i = lowBound(1) To upBound(1)
        For j = lowBound(2) To upBound(2)
            For k = lowBound(3) To upBound(3)
                arrayValue(i, j, k) = GetValue(key & "-" & CStr(i) & "-" & CStr(j) & "-" & CStr(k))
            Next k
        Next j
    Next i
    
    GetArrayValue3 = arrayValue
    
    Exit Function

GetArrayValue3Err:
    GetArrayValue3 = Null
    GetErrMsg = Err.Description
End Function

'/***********************************************************************************
' 함수명    : GetArrayValue4
' 작성자    : 정진우
' 설명      : 4차원으로 구성된 정보를 반환한다.
' 리턴값    :
' 매개변수
'           key     :
' Psedo-Code
'
' Remark
' 이력사항
'           2012. 01/12 정진우
'               1. 생성
'/***********************************************************************************
Private Function GetArrayValue4(key As Variant) As Variant
    GetErrMsg = ""
On Error GoTo GetArrayValue4Err
    
    Dim i As Long
    Dim j As Long
    Dim k As Long
    Dim l As Long
    Dim arrayInfo As Variant
    Const dimCnt As Integer = 4
    arrayInfo = GetValue(key & "(" & CStr(dimCnt) & ")")
    Dim lowBound(1 To dimCnt) As Long
    Dim upBound(1 To dimCnt) As Long
    
    For i = 1 To dimCnt
        arrayInfo = GetBoundary(arrayInfo, lowBound(i), upBound(i))
    Next i
    
    Dim arrayValue()
    ReDim arrayValue(lowBound(1) To upBound(1) _
                     , lowBound(2) To upBound(2) _
                     , lowBound(3) To upBound(3) _
                     , lowBound(4) To upBound(4) _
                     )
    
    For i = lowBound(1) To upBound(1)
        For j = lowBound(2) To upBound(2)
            For k = lowBound(3) To upBound(3)
                For l = lowBound(4) To upBound(4)
                    arrayValue(i, j, k) = GetValue(key & "-" & CStr(i) & "-" & CStr(j) & "-" & CStr(k))
                Next l
            Next k
        Next j
    Next i
    
    GetArrayValue4 = arrayValue
    
    Exit Function

GetArrayValue4Err:
    GetArrayValue4 = Null
    GetErrMsg = Err.Description
End Function

'/***********************************************************************************
' 함수명    : GetBoundary
' 작성자    : 정진우
' 설명      : 가장 앞에 위치한 "n-m"으로 구성된 array index 정보를 '-'를 기준으로 분할한다.
' 리턴값    : 가장 앞에 위치한 차원 정보를 제거한 info 정보
' 매개변수
'           info     : array index 정보 n1-m1{|n2-m2}
'           lowBound : 하한
'           UpLound  : 상한
' Psedo-Code
'           차원 구분자(|)를 통해 분할하고, 가장 앞에 위치한 차원 정보를 ref 매개변수에 할당하고, 남은 정보를 반환한다.
' Remark
' 이력사항
'           2012. 01/12 정진우
'               1. 생성
'/***********************************************************************************
Private Function GetBoundary(ByVal info As String, ByRef lowBound As Long, ByRef upBound As Long) As String
    Dim index As Long
    index = InStr(1, info, "-")
    Dim dimIndex As Long
    dimIndex = InStr(index, info, "|")
    
    If dimIndex = 0 Then
        lowBound = CLng(Mid(info, 1, index - 1))
        upBound = CLng(Mid(info, index + 1, Len(info)))
        GetBoundary = ""
    Else
        lowBound = CLng(Mid(info, 1, index - 1))
        upBound = CLng(Mid(info, index + 1, dimIndex - index - 1))
        GetBoundary = Mid(info, dimIndex + 1, Len(info))
    End If
    
End Function

'/***********************************************************************************
' 함수명    : AddValue
' 작성자    : 정진우
' 설명      : key를 바탕으로 변수의 데이터를 저장한다.
' 리턴값    : 변수가 포함된 인덱스, 기존에 저장된 key일 경우 -1을 반환한다.
' 매개변수
'           key     : 데이터에 대한 유일한 key
'           value   : 데이터의 값
' Psedo-Code
'
' Remark
' 이력사항
'           2012. 01/11 정진우
'               1. 생성
'/***********************************************************************************
Public Function AddValue(key As Variant, value As Variant) As Long
    GetErrMsg = ""
    On Error GoTo AddErr

        Dim idx As Long
        Dim i As Long
        Dim valueType As String
        valueType = TypeName(value)
        
        If InStr(valueType, "(") > 0 Then
            Dim cntDim As Long
            cntDim = GetDimensionCount(value)
            
            Select Case cntDim
                Case 1
                    idx = AddArrayValue1(key, value)
                Case 2
                    idx = AddArrayValue2(key, value)
                Case 3
                    idx = AddArrayValue3(key, value)
                Case 4
                    idx = AddArrayValue4(key, value)
                Case Else
                    idx = -1
            End Select
            AddValue = idx
            Exit Function
        End If
        
        idx = UBound(hashtbl) + 1
        
        Dim htVal As hashtable
        htVal.key = key
        htVal.value = IIf(IsNull(value) Or IsEmpty(value), Null, value)

        For i = 1 To UBound(hashtbl)
            If hashtbl(i).key = key Then Err.Raise 9999, , "Key [" & CStr(key) & "] is not unique"
        Next i

        ReDim Preserve hashtbl(idx)

        hashtbl(idx) = htVal
        AddValue = idx
    Exit Function

AddErr:
    AddValue = 0
    GetErrMsg = Err.Description
End Function

'/***********************************************************************************
' 함수명    : AddArrayValue1
' 작성자    : 정진우
' 설명      : 1차원으로 정의된 array의 값들을 저장한다.
' 리턴값    :
' 매개변수
'           param     :
' Psedo-Code
'
' Remark
' 이력사항
'           2012. 01/11 정진우
'               1. 생성
'/***********************************************************************************
Private Function AddArrayValue1(key As Variant, value As Variant) As Integer
    GetErrMsg = ""
    On Error GoTo AddArrayValue1Err
    
    Dim idx As Long
    Dim i As Long
    'save array info
    idx = AddValue(key & "(1)", CStr(LBound(value, 1)) & "-" & CStr(UBound(value, 1)))
    For i = LBound(value, 1) To UBound(value, 1)
        'save array data
        idx = AddValue(key & "-" & CStr(i), value(i))
    Next i
    AddArrayValue1 = idx
    Exit Function

AddArrayValue1Err:
    AddArrayValue1 = -1
    GetErrMsg = Err.Description
End Function

'/***********************************************************************************
' 함수명    : AddArrayValue2
' 작성자    : 정진우
' 설명      : 2차원으로 정의된 array의 값들을 저장한다.
' 리턴값    :
' 매개변수
'           param     :
' Psedo-Code
'
' Remark
' 이력사항
'           2012. 01/11 정진우
'               1. 생성
'/***********************************************************************************
Private Function AddArrayValue2(key As Variant, value As Variant) As Integer
    GetErrMsg = ""
    On Error GoTo AddArrayValue2Err
    
    Dim idx As Long
    Dim i As Long
    Dim j As Long
    'save array info
    idx = AddValue(key & "(2)", CStr(LBound(value, 1)) & "-" & CStr(UBound(value, 1)) _
                                & "|" & CStr(LBound(value, 2)) & "-" & CStr(UBound(value, 2)) _
                                )
    For i = LBound(value, 1) To UBound(value, 1)
        'save array data
        For j = LBound(value, 2) To UBound(value, 2)
            idx = AddValue(key & "-" & CStr(i) & "-" & CStr(j), value(i, j))
        Next j
    Next i
    AddArrayValue2 = idx
    Exit Function

AddArrayValue2Err:
    AddArrayValue2 = -1
    GetErrMsg = Err.Description
End Function

'/***********************************************************************************
' 함수명    : AddArrayValue3
' 작성자    : 정진우
' 설명      : 3차원으로 정의된 array의 값들을 저장한다.
' 리턴값    :
' 매개변수
'           param     :
' Psedo-Code
'
' Remark
' 이력사항
'           2012. 01/11 정진우
'               1. 생성
'/***********************************************************************************
Private Function AddArrayValue3(key As Variant, value As Variant) As Integer
    GetErrMsg = ""
    On Error GoTo AddArrayValue3Err
    
    Dim idx As Long
    Dim i As Long
    Dim j As Long
    Dim k As Long
    'save array info
    idx = AddValue(key & "(3)" _
        , CStr(LBound(value, 1)) & "-" & CStr(UBound(value, 1)) _
          & "|" & CStr(LBound(value, 2)) & "-" & CStr(UBound(value, 2)) _
          & "|" & CStr(LBound(value, 3)) & "-" & CStr(UBound(value, 3)) _
          )
    For i = LBound(value, 1) To UBound(value, 1)
        'save array data
        For j = LBound(value, 2) To UBound(value, 2)
            For k = LBound(value, 3) To UBound(value, 3)
                idx = AddValue(key & "-" & CStr(i) & "-" & CStr(j) & "-" & CStr(k), value(i, j, k))
            Next k
        Next j
    Next i
    AddArrayValue3 = idx
    Exit Function

AddArrayValue3Err:
    AddArrayValue3 = -1
    GetErrMsg = Err.Description
End Function

'/***********************************************************************************
' 함수명    : AddArrayValue4
' 작성자    : 정진우
' 설명      : 4차원으로 정의된 array의 값들을 저장한다.
' 리턴값    :
' 매개변수
'           param     :
' Psedo-Code
'
' Remark
' 이력사항
'           2012. 01/11 정진우
'               1. 생성
'/***********************************************************************************
Private Function AddArrayValue4(key As Variant, value As Variant) As Integer
    GetErrMsg = ""
    On Error GoTo AddArrayValue4Err
    
    Dim idx As Long
    Dim i As Long
    Dim j As Long
    Dim k As Long
    Dim l As Long
    'save array info
    idx = AddValue(key & "(3)" _
        , CStr(LBound(value, 1)) & "-" & CStr(UBound(value, 1)) _
          & "|" & CStr(LBound(value, 2)) & "-" & CStr(UBound(value, 2)) _
          & "|" & CStr(LBound(value, 3)) & "-" & CStr(UBound(value, 3)) _
          & "|" & CStr(LBound(value, 4)) & "-" & CStr(UBound(value, 4)) _
          )
    For i = LBound(value, 1) To UBound(value, 1)
        'save array data
        For j = LBound(value, 2) To UBound(value, 2)
            For k = LBound(value, 3) To UBound(value, 3)
                For l = LBound(value, 4) To UBound(value, 4)
                    idx = AddValue(key & "-" & CStr(i) & "-" & CStr(j) & "-" & CStr(k) & "-" & CStr(l), value(i, j, k, l))
                Next l
            Next k
        Next j
    Next i
    AddArrayValue4 = idx
    Exit Function

AddArrayValue4Err:
    AddArrayValue4 = -1
    GetErrMsg = Err.Description
End Function

'/***********************************************************************************
' 함수명    : SaveData
' 작성자    : 정진우
' 설명      : 사전 정의된 파일에 현재 table에 존재하는 데이터를 저장한다.
' 리턴값    :
' 매개변수
' Psedo-Code
'
' Remark
' 이력사항
'           2012. 01/11 정진우
'               1. 생성
'/***********************************************************************************
Public Sub SaveData()
    Dim FSO As FileSystemObject
    Dim FSOFile As TextStream
    Dim FilePath As String
    Dim i As Long
    
    Call modFile.CreateDirectory(backupFilePath)
    If modFile.Exists(backupFilePath & backupFileName) = True Then modFile.DeleteFile (backupFilePath & backupFileName)
    
    Set FSO = New FileSystemObject
     ' opens  file in write mode
    Set FSOFile = FSO.OpenTextFile(backupFilePath & backupFileName, 2, True)
     'loop round adding lines
    For i = 1 To UBound(hashtbl)
        If IsNull(hashtbl(i).value) Then
            FSOFile.WriteLine ((hashtbl(i).key) & "|@NULL")
        Else
            FSOFile.WriteLine (CStr(hashtbl(i).key) & "|" & CStr(hashtbl(i).value))
        End If
    Next i
    
    FSOFile.Close
    
End Sub

'/***********************************************************************************
' 함수명    : LoadData
' 작성자    : 정진우
' 설명      : 사전 정의된 파일에 저장된 값들을 가져온다.
' 리턴값    :
' 매개변수
' Psedo-Code
'
' Remark
' 이력사항
'           2012. 01/11 정진우
'               1. 생성
'/***********************************************************************************
Public Sub LoadData()
    Dim FSO As FileSystemObject
    Dim FSOFile As TextStream
    Dim FilePath As String
    Dim line As String
    Dim key As Variant
    Dim value As Variant
    Dim i As Long

On Error GoTo LoadDataErr
    
    If modFile.Exists(backupFilePath & backupFileName) = False Then
        MsgBox "BackUp 파일이 존재하지 않습니다. 시스템 관리자에게 문의하세요.", vbOKOnly
        Exit Sub
    End If
    
    Call Clear
    
    Set FSO = New FileSystemObject
     ' opens  file in write mode
    Set FSOFile = FSO.OpenTextFile(backupFilePath & backupFileName, ForReading)
    Do Until FSOFile.AtEndOfStream
        line = FSOFile.ReadLine
        i = InStr(line, "|")
        key = Mid(line, 1, i - 1)
        value = Mid(line, i + 1, Len(line))
        If value = "@NULL" Then
            Call AddValue(key, Null)
        Else
            Call AddValue(key, value)
        End If
    Loop
    
    FSOFile.Close
    
    Set FSOFile = Nothing
    Set FSO = Nothing
    
LoadDataErr:
    GetErrMsg = Err.Description
    
End Sub

'/***********************************************************************************
' 함수명    : RemoveValue
' 작성자    : 정진우
' 설명      : 요청한 key로 정의된 데이터를 삭제한다.
' 리턴값    :
' 매개변수
'           key : 제거하고자 하는 데이터의 key
' Psedo-Code
'
' Remark
' 이력사항
'           2012. 01/11 정진우
'               1. 생성
'/***********************************************************************************
Public Function RemoveValue(key As Variant) As Boolean
    GetErrMsg = ""
    On Error GoTo RemoveErr

        Dim i As Long, idx As Long
        Dim htTemp() As hashtable
        idx = 1

        For i = 1 To UBound(hashtbl)
            If InStr(1, hashtbl(i).key, key) > 0 And IsEmpty(hashtbl(i).key) = False Then
                ReDim Preserve htTemp(idx)
                htTemp(idx).key = hashtbl(i).key
                htTemp(idx).value = hashtbl(i).value
                idx = idx + 1
            End If
        Next i

        'If UBound(hashtbl) = UBound(htTemp) Then Err.Raise 9998, , "Key [" & CStr(key) & "] not found"

        hashtbl = htTemp
        RemoveValue = True
    Exit Function

RemoveErr:
    RemoveValue = False
    GetErrMsg = Err.Description
End Function

'/***********************************************************************************
' 함수명    : GetValueCount
' 작성자    : 정진우
' 설명      : 현재 저장된 값들의 개수를 반환한다.
' 리턴값    :
' 매개변수
' Psedo-Code
'
' Remark
' 이력사항
'           2012. 01/11 정진우
'               1. 생성
'/***********************************************************************************
Public Function GetValueCount() As Long
    GetErrMsg = ""
    On Error GoTo GetValueCountErr
        GetValueCount = UBound(hashtbl)
    Exit Function

GetValueCountErr:
    GetValueCount = 0
    GetErrMsg = Err.Description
End Function

'/***********************************************************************************
' 함수명    : Clear
' 작성자    : 정진우
' 설명      : 모든 데이터를 삭제한다.
' 리턴값    :
' 매개변수
' Psedo-Code
'
' Remark
' 이력사항
'           2012. 01/11 정진우
'               1. 생성
'/***********************************************************************************
Public Sub Clear()
    ReDim hashtbl(0)
End Sub

'/***********************************************************************************
' 함수명    : GetNumberOfDimensions
' 작성자    : 정진우
' 설명      : Array의 차원을 반환한다.
' 리턴값    :
' 매개변수
'           aryVariable : 차원을 알아낼 대상
' Psedo-Code
'           VBA는 Array 변수의 차원을 알아낼 수 있는 내부 함수가 없다.
'           따라서, 각 차원의 크기를 알 수 있는 함수를 통해
'           함수 수행 시 오류가 발생하면, 그 차원은 존재하지 않는다.
' Remark
' 이력사항
'           2012. 01/11 정진우
'               1. 생성
'/***********************************************************************************
Private Function GetDimensionCount(aryVariable) As Long
    'Sets up the error handler.
    On Error GoTo FinalDimension
    Dim dimNum As Long
    Dim errorCheck As Long
    'Visual Basic for Applications arrays can have up to 60000
    'dimensions; this allows for that.
    For dimNum = 1 To 60000
        'It is necessary to do something with the LBound to force it
        'to generate an error.
        errorCheck = LBound(aryVariable, dimNum)
    Next dimNum
    GetDimensionCount = -1
    Exit Function
' The error routine.
FinalDimension:
    GetDimensionCount = dimNum - 1
End Function