Excel VBA | フィールド定義表から自動でチェックを組み立てる仕組み(メタデータ駆動)

Excel VBA VBA
スポンサーリンク

キャッシュをJSONファイルに保存して、Excelを閉じても再利用できるバージョン

これまでの「DB定義をキャッシュ」では、Excelを閉じるとキャッシュが消えてしまいました。
ここでは キャッシュをJSONファイルに保存 しておき、次回Excelを開いたときに再利用できる仕組みを作ります。


キャッシュの仕組み

  1. 初回実行時
    • DBから定義を取得
    • JSONファイルに保存(例:FieldDefCache.json
    • メモリにもキャッシュ
  2. 次回以降
    • JSONファイルが存在すればそれを読み込む
    • DB接続は不要
  3. 定義更新時
    • キャッシュをクリアして再取得 → JSONを上書き

VBAコード例

Option Explicit
Private g_FieldDefs As Collection ' メモリキャッシュ
Private Const CACHE_FILE As String = "FieldDefCache.json"

' --- 定義を取得(JSONキャッシュ優先) ---
Function GetFieldDefinitions() As Collection
    If g_FieldDefs Is Nothing Then
        ' JSONキャッシュがあれば読み込み
        If Dir(ThisWorkbook.Path & "\" & CACHE_FILE) <> "" Then
            Set g_FieldDefs = LoadDefsFromJSON(ThisWorkbook.Path & "\" & CACHE_FILE)
        End If
        
        ' なければDBから取得して保存
        If g_FieldDefs Is Nothing Then
            Set g_FieldDefs = LoadDefsFromDB()
            SaveDefsToJSON g_FieldDefs, ThisWorkbook.Path & "\" & CACHE_FILE
        End If
    End If
    Set GetFieldDefinitions = g_FieldDefs
End Function

' --- DBから定義を取得 ---
Function LoadDefsFromDB() As Collection
    Dim conn As Object, rs As Object, sql As String, defs As New Collection
    
    Set conn = CreateObject("ADODB.Connection")
    conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\FieldDef.accdb;"
    
    sql = "SELECT 列番号, 項目名, 必須, 型, 最小値, 最大値, 最大文字数, 正規表現 FROM FieldDefinitions"
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open sql, conn
    
    Do Until rs.EOF
        defs.Add Array(rs(0).Value, rs(1).Value, rs(2).Value, rs(3).Value, _
                       rs(4).Value, rs(5).Value, rs(6).Value, rs(7).Value)
        rs.MoveNext
    Loop
    rs.Close: conn.Close
    
    Set LoadDefsFromDB = defs
End Function

' --- JSONに保存 ---
Sub SaveDefsToJSON(defs As Collection, filePath As String)
    Dim fso As Object, ts As Object, def As Variant, json As String
    Dim i As Long
    
    json = "["
    For i = 1 To defs.Count
        def = defs(i)
        json = json & "{""列番号"":" & def(0) & ",""項目名"":""" & def(1) & """,""必須"":""" & def(2) & """,""型"":""" & def(3) & """,""最小値"":""" & def(4) & """,""最大値"":""" & def(5) & """,""最大文字数"":""" & def(6) & """,""正規表現"":""" & def(7) & """}"
        If i < defs.Count Then json = json & ","
    Next i
    json = json & "]"
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.CreateTextFile(filePath, True, True) ' Unicode
    ts.Write json
    ts.Close
End Sub

' --- JSONから読み込み ---
Function LoadDefsFromJSON(filePath As String) As Collection
    Dim fso As Object, ts As Object, text As String
    Dim json As Object, item As Variant, defs As New Collection
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.OpenTextFile(filePath, 1, False, -1)
    text = ts.ReadAll
    ts.Close
    
    ' JSONをパース(要: Microsoft Scripting Runtime + JSONライブラリ)
    ' 例: VBA JSON (https://github.com/VBA-tools/VBA-JSON)
    Set json = JsonConverter.ParseJson(text)
    
    For Each item In json
        defs.Add Array(item("列番号"), item("項目名"), item("必須"), item("型"), _
                       item("最小値"), item("最大値"), item("最大文字数"), item("正規表現"))
    Next item
    
    Set LoadDefsFromJSON = defs
End Function

' --- キャッシュクリア ---
Sub ClearFieldDefCache()
    Set g_FieldDefs = Nothing
    If Dir(ThisWorkbook.Path & "\" & CACHE_FILE) <> "" Then
        Kill ThisWorkbook.Path & "\" & CACHE_FILE
    End If
    MsgBox "キャッシュをクリアしました。次回はDBから再取得します。", vbInformation
End Sub
VB

ポイント

  • 初回はDB → JSON保存
  • 次回以降はJSONからロード
  • VBA-JSONライブラリVBA-tools/VBA-JSON)を利用してパース
  • ClearFieldDefCache でキャッシュを削除し、再取得可能

応用アイデア

  • JSONに「更新日時」を入れて、一定期間経過したら自動で再取得。
  • JSONをネットワーク共有フォルダに置いて、複数ユーザーで共通利用。
  • JSONを暗号化してセキュリティを強化。

👉 これで Excelを閉じてもキャッシュが残り、次回起動時に即利用可能 になります。

タイトルとURLをコピーしました