Files
vba/src/module/Global_Cache.bas
2026-04-17 12:30:18 +09:00

311 lines
9.4 KiB
QBasic

' ============================================================
' Module Name: Global_Cache
' Module Desc: Global Cache Module, Shared caches across all worksheets
' Module Methods:
' - RefreshM1Cache / ClearM1Cache
' - RefreshM1KukanDCache / ClearM1KukanDCache
' - RefreshM2Cache / ClearM2Cache
' - RefreshZ1Cache / ClearZ1Cache
' - RefreshZ2Cache / ClearZ2Cache
' - RefreshZ3Cache / ClearZ3Cache
' - RefreshO1Cache / ClearO1Cache
' - RefreshO2Cache / ClearO2Cache
' ============================================================
' Cache Variables
Public m1Cache As Object
Public m1KukanDCache As Object
Public z1Cache As Object
Public z2Cache As Object
Public z3Cache As Object
Public o1Cache As Object
Public o2Cache As Object
Public m2Cache As Object
' m1Cache - used by M2_Kukan_detail, Tukin_C1
' m1KukanDCache - nested dict {D: {F: [G]}}
' z1Cache - used by M1_Kukan, Tukin_C1
' z2Cache
' z3Cache
' o1Cache - used by Tukin_C1
' o2Cache
' m2Cache - nested dictionary for Tukin_C1
' ============================================================
' M1 Cache - { 区間コード[C]: [value1-7] }
' ============================================================
Public Sub RefreshM1Cache()
Set m1Cache = Nothing
On Error GoTo RefreshError
Set m1Cache = LoadLookup("M1", keyCol:=3, valueCols:=Array(3, 4, 5, 6, 7, 9, 12), startRow:=7)
On Error GoTo 0
If m1Cache Is Nothing Or m1Cache.Count = 0 Then
Err.Raise 1001, "RefreshM1Cache", "M1 reference data is empty"
End If
Exit Sub
RefreshError:
Err.Raise 1002, "RefreshM1Cache", "Failed to load M1 lookup cache: " & Err.Description
End Sub
Public Sub ClearM1Cache()
Set m1Cache = Nothing
End Sub
' Refresh M1_KukanD cache - nested dict {D: {F: [G]}}
' Structure: { 交通機関区分[D]: { 利用区間発名[F]: [利用区間着名G] } }
Public Sub RefreshM1KukanDCache()
Set m1KukanDCache = Nothing
Set m1KukanDCache = CreateObject("Scripting.Dictionary")
Dim wsM1 As Worksheet
On Error Resume Next
Set wsM1 = ThisWorkbook.Worksheets("M1")
If wsM1 Is Nothing Then Exit Sub
On Error GoTo 0
Dim lastRow As Long: lastRow = wsM1.Cells(wsM1.Rows.Count, 3).End(xlUp).Row
If lastRow < 7 Then Exit Sub
Dim r As Long
For r = 7 To lastRow
Dim dValue As String: dValue = Trim(wsM1.Cells(r, 4).Value) ' D column
Dim fValue As String: fValue = Trim(wsM1.Cells(r, 6).Value) ' F column
Dim gValue As String: gValue = Trim(wsM1.Cells(r, 7).Value) ' G column
If dValue = "" Or fValue = "" Then GoTo NextRow2
' Outer level: D column (交通機関区分)
If Not m1KukanDCache.Exists(dValue) Then
Dim innerDict As Object: Set innerDict = CreateObject("Scripting.Dictionary")
m1KukanDCache.Add dValue, innerDict
End If
' Inner level: F column (利用区間発名) -> array of G values
Set innerDict = m1KukanDCache(dValue)
If Not innerDict.Exists(fValue) Then
Dim arr As Object: Set arr = CreateObject("Scripting.Dictionary")
innerDict.Add fValue, arr
End If
Set arr = innerDict(fValue)
If gValue <> "" And Not arr.Exists(gValue) Then
arr.Add gValue, True
End If
NextRow2:
Next r
End Sub
Public Sub ClearM1KukanDCache()
Set m1KukanDCache = Nothing
End Sub
' ============================================================
' M2 Cache - Nested Dictionary
' Structure: { 区間コード[C]: { 券種[I]: { コード[J]: K } } }
' ============================================================
Public Sub RefreshM2Cache()
Set m2Cache = Nothing
Set m2Cache = CreateObject("Scripting.Dictionary")
Dim wsM2 As Worksheet
On Error Resume Next
Set wsM2 = ThisWorkbook.Worksheets("M2")
If wsM2 Is Nothing Then Exit Sub
On Error GoTo 0
Dim lastRow As Long: lastRow = wsM2.Cells(wsM2.Rows.Count, 3).End(xlUp).Row
If lastRow < 7 Then Exit Sub
Dim r As Long
For r = 7 To lastRow
Dim kukanCode As String: kukanCode = Trim(wsM2.Cells(r, 3).Value) ' C column
Dim kanshu As String: kanshu = Trim(wsM2.Cells(r, 9).Value) ' I column
Dim code As String: code = Trim(wsM2.Cells(r, 10).Value) ' J column
Dim name As String: name = Trim(wsM2.Cells(r, 11).Value) ' K column
If kukanCode = "" Or kanshu = "" Or code = "" Then GoTo NextRow
' Outer level: kukanCode
If Not m2Cache.Exists(kukanCode) Then
Dim innerDict As Object: Set innerDict = CreateObject("Scripting.Dictionary")
m2Cache.Add kukanCode, innerDict
End If
' Middle level: kanshu
Set innerDict = m2Cache(kukanCode)
If Not innerDict.Exists(kanshu) Then
Dim innermostDict As Object: Set innermostDict = CreateObject("Scripting.Dictionary")
innerDict.Add kanshu, innermostDict
End If
' Inner level: code -> name
Set innermostDict = innerDict(kanshu)
If Not innermostDict.Exists(code) Then
innermostDict.Add code, name
End If
NextRow:
Next r
End Sub
Public Sub ClearM2Cache()
Set m2Cache = Nothing
End Sub
' ============================================================
' Z1 Cache
' ============================================================
Public Sub RefreshZ1Cache()
Set z1Cache = Nothing
On Error GoTo RefreshError
Set z1Cache = LoadLookup("Z1", keyCol:=3, valueCols:=Array(4), startRow:=7)
On Error GoTo 0
If z1Cache Is Nothing Or z1Cache.Count = 0 Then
Err.Raise 1001, "RefreshZ1Cache", "Z1 reference data is empty"
End If
Exit Sub
RefreshError:
Err.Raise 1002, "RefreshZ1Cache", "Failed to load Z1 lookup cache: " & Err.Description
End Sub
Public Sub ClearZ1Cache()
Set z1Cache = Nothing
End Sub
' ============================================================
' Z2 Cache
' ============================================================
Public Sub RefreshZ2Cache()
Set z2Cache = Nothing
On Error GoTo RefreshError
Set z2Cache = LoadLookup("Z2", keyCol:=3, valueCols:=Array(4), startRow:=7)
On Error GoTo 0
If z2Cache Is Nothing Or z2Cache.Count = 0 Then
Err.Raise 1001, "RefreshZ2Cache", "Z2 reference data is empty"
End If
Exit Sub
RefreshError:
Err.Raise 1002, "RefreshZ2Cache", "Failed to load Z2 lookup cache: " & Err.Description
End Sub
Public Sub ClearZ2Cache()
Set z2Cache = Nothing
End Sub
' ============================================================
' Z3 Cache
' ============================================================
Public Sub RefreshZ3Cache()
Set z3Cache = Nothing
On Error GoTo RefreshError
Set z3Cache = LoadLookup("Z3", keyCol:=3, valueCols:=Array(4), startRow:=7)
On Error GoTo 0
If z3Cache Is Nothing Or z3Cache.Count = 0 Then
Err.Raise 1001, "RefreshZ3Cache", "Z3 reference data is empty"
End If
Exit Sub
RefreshError:
Err.Raise 1002, "RefreshZ3Cache", "Failed to load Z3 lookup cache: " & Err.Description
End Sub
Public Sub ClearZ3Cache()
Set z3Cache = Nothing
End Sub
' ============================================================
' O1 Cache
' ============================================================
Public Sub RefreshO1Cache()
Set o1Cache = Nothing
Set o1Cache = CreateObject("Scripting.Dictionary")
Dim wsO1 As Worksheet
On Error Resume Next
Set wsO1 = ThisWorkbook.Worksheets("O1")
If wsO1 Is Nothing Then Exit Sub
On Error GoTo 0
Dim lastRow As Long
lastRow = wsO1.Cells(wsO1.Rows.Count, 3).End(xlUp).Row
If lastRow < 7 Then Exit Sub
Dim r As Long
For r = 7 To lastRow
Dim cVal As String
cVal = Trim(wsO1.Cells(r, 3).Value) ' C column
Dim eVal As String
eVal = Trim(wsO1.Cells(r, 5).Value) ' E column
Dim fVal As String
fVal = Trim(wsO1.Cells(r, 6).Value) ' F column
If cVal = "" Or eVal = "" Then GoTo NextO1
' Outer: C column
If Not o1Cache.Exists(cVal) Then
Dim innerDict As Object
Set innerDict = CreateObject("Scripting.Dictionary")
o1Cache.Add cVal, innerDict
End If
' Inner: E column -> array of F values
Set innerDict = o1Cache(cVal)
If Not innerDict.Exists(eVal) Then
Dim arr As Object
Set arr = CreateObject("Scripting.Dictionary")
innerDict.Add eVal, arr
End If
Set arr = innerDict(eVal)
If fVal <> "" And Not arr.Exists(fVal) Then
arr.Add fVal, True
End If
NextO1:
Next r
End Sub
Public Sub ClearO1Cache()
Set o1Cache = Nothing
End Sub
' ============================================================
' O2 Cache
' ============================================================
Public Sub RefreshO2Cache()
Set o2Cache = Nothing
On Error GoTo RefreshError
Set o2Cache = LoadLookup("O2", keyCol:=3, valueCols:=Array(4), startRow:=7)
On Error GoTo 0
If o2Cache Is Nothing Or o2Cache.Count = 0 Then
Err.Raise 1001, "RefreshO2Cache", "O2 reference data is empty"
End If
Exit Sub
RefreshError:
Err.Raise 1002, "RefreshO2Cache", "Failed to load O2 lookup cache: " & Err.Description
End Sub
Public Sub ClearO2Cache()
Set o2Cache = Nothing
End Sub