Files
vba/documents/Tukin_Design_Document.md
2026-05-28 20:57:47 +09:00

17 KiB
Raw Blame History

Commuter Allowance Editor — Design Document

1. Project Overview

Item Value
Application Excel 2021 (.xlsm)
Purpose Edit commuter certification by referencing master data
Module tuk (通勤 = commutation)
Entry Point メインメニュー (Main Menu sheet)

2. Sheet Inventory

2.1 Editor Sheets

C1 — 通勤手当CSV編集 (Commuter Allowance Editor)

  • HeaderRow: 6 | StartRow: 8 | StartCol: C | EndCol: BC
  • Encoding: shift_jis | HasHeader: Yes
  • Role: Main editing sheet — direct cell editing only, no CSV import
  • Key columns:
    • C: 職員番号 (Employee ID) — triggers address + transport dropdowns
    • S/AA/AI/AQ: 区間N区間コード (Section N Route Code) — triggers fill from M1 + dropdown cascade
    • T/AB/AJ/AR: 区間N交通機関 (Section N Transport Type)
    • U/AC/AK/AS: 区間N発 (Section N Departure Station)
    • V/AD/AL/AT: 区間N着 (Section N Arrival Station)
    • W/AE/AM/AU: 区間N券種 (Section N Ticket Type)
    • X/AF/AN/AV: 区間Nコード (Section N Code)
    • AY: 決定事項区分コード (Determination Category)
    • BB: 手当月額の決定区分コード (Monthly Amount Decision Category)

M1 — 区間メンテナンス (Route Maintenance)

  • HeaderRow: 5 | StartRow: 7 | StartCol: C | EndCol: N
  • Encoding: shift_jis | HasHeader: Yes
  • Role: Route master — defines routes (code → transport + departure + arrival + fare)
  • Key columns:
    • C: 利用区間コード (Route Code)
    • D: 交通機関区分 (Transport Category)
    • E: 交通機関名称 (Transport Name)
    • F: 利用区間発名 (Departure Station)
    • G: 利用区間着名 (Arrival Station)
    • I: 運賃 (Fare)
    • J: 現金の場合の1箇月運賃 (Monthly Fare Cash)
    • K: 連絡 (Connection)
    • L: 特別料金区分 (Special Fare Category)
    • M: 特別料金券種 (Special Fare Ticket Type)
    • N: 特別料金負担額 (Special Fare Burden Amount)

M2 — 区間詳細メンテナンス (Route Detail Maintenance)

  • HeaderRow: 6 | StartRow: 8 | StartCol: C | EndCol: R
  • Encoding: shift_jis | HasHeader: Yes
  • Role: Route detail master — ticket types and pricing per route code
  • Key columns:
    • C: 利用区間コード (Route Code) — join key with M1
    • I: 券種 (Ticket Type: 0=普通, 1=定期券, 2=回数券, 3=プリペイドカード)
    • J: コード (Ticket Code)
    • K: 名称 (Ticket Name)
    • L: 1箇月運賃/販売額 (Monthly Fare / Sales Price)
    • M: 定期額/券1(額)/利用額 (Monthly / Ticket1 Amount / Usage Amount)
    • N: 定期支給期間/券1(枚)/特別料金 (Monthly Issue Period / Ticket1 Qty / Special Fare)
    • O: 特別料金/券2(額) (Special Fare / Ticket2 Amount)
    • P: 券2(枚) (Ticket2 Quantity)
    • Q: 端数(額) (Fractional Amount)
    • R: 特別料金 (Special Fare)

2.2 Master / Config Sheets (Z-series)

Z1 — (222)交通機関マスタ (Transport Master)

  • HeaderRow: 5 | StartRow: 7 | StartCol: C | EndCol: I
  • Encoding: utf-8 | HasHeader: No
  • Role: Transport type catalog (dropdown source for C1 T/AB/AJ/AR)
  • Columns: C=区分 (code), D=交通機関名称 (name), E=ポップアップ名称, F=コメント, G=略式名称, H=表示しない, I=略称

Z2 — (223)通勤_決定事項区分一覧 (Determination Category List)

  • HeaderRow: 5 | StartRow: 7 | StartCol: C | EndCol: G
  • Encoding: utf-8 | HasHeader: No
  • Role: Determination categories for AY column dropdown
  • Columns: C=区分 (code), D=画面用名称, E=ポップアップ用名称, F=コメント, G=表示しない

Z3 — (224)通勤_手当月額の決定区分一覧 (Monthly Amount Decision Category List)

  • HeaderRow: 5 | StartRow: 7 | StartCol: C | EndCol: H
  • Encoding: utf-8 | HasHeader: No
  • Role: Monthly amount decision categories for BB column dropdown
  • Columns: C=区分 (code), D=画面用名称, E=ポップアップ用名称, F=コメント, G=表示しない, H=名称2

Z4 — (221)利用区間発着名区分 (Route Station Name Category)

  • HeaderRow: 5 | StartRow: 7 | StartCol: C | EndCol: H
  • Encoding: utf-8 | HasHeader: No
  • Role: Station name catalog grouped by line (rosen). Used for M1 F/G column dropdowns.
  • Columns: C=区分 (station code), D=画面用名称/駅名 (station display name), E=ポップアップ名称, F=コメント/路線名 (line name), G=正式名称, H=表示しない
  • Note: E column (ポップアップ名称) is populated but currently ignored by code. Code reads F (路線名) and D (駅名) only.

2.3 Ticket Master Sheets (T-series)

T1 — (244)通勤_定期券名称区分一覧 (Commuter Pass Name Category)

  • HeaderRow: 5 | StartRow: 7 | StartCol: C | EndCol: G
  • Encoding: utf-8 | HasHeader: No
  • Role: Periodic commuter pass types (dropdown source for W/AE/AM/AU)
  • Columns: C=区分 (code), D=画面用名称, E=ポップアップ用名称, F=コメント, G=表示しない

T2 — (245)通勤_回数券名称区分一覧 (Fare Ticket Name Category)

  • HeaderRow: 5 | StartRow: 7 | StartCol: C | EndCol: M
  • Encoding: utf-8 | HasHeader: No
  • Role: Frequency ticket types with pricing breakdown
  • Columns: C=区分, D=画面用名称, E=ポップアップ用名称, F=コメント, G=表示しない, H=販売額, I=券1(額), J=券1(枚), K=券2(額), L=券2(枚), M=端数額
  • Feature: ZeroFillCols = H,I,J,K,L,M — when C column (区分) is edited and H~M are empty, they are auto-filled with "0"

T3 — (246)通勤_プリペイドカード名称区分一覧 (Prepaid Card Name Category)

  • HeaderRow: 5 | StartRow: 7 | StartCol: C | EndCol: I
  • Encoding: utf-8 | HasHeader: No
  • Role: Prepaid card types with pricing
  • Columns: C=区分, D=画面用名称, E=ポップアップ用名称, F=コメント, G=表示しない, H=販売額, I=利用額

2.4 Other / Reference Sheets

O1 — 住所情報 (Address Information)

  • HeaderRow: 5 | StartRow: 6 | StartCol: C | EndCol: F
  • Encoding: shift_jis | HasHeader: Yes
  • Role: Employee address lookup (keyed by employee number)
  • Columns: C=社員番号, D=更新日, E=住所1, F=住所2

O2 — (507)発信者一覧 (Sender List)

  • HeaderRow: 5 | StartRow: 6 | StartCol: C | EndCol: O
  • Encoding: utf-8 | HasHeader: No
  • Role: Sender/official name list for dropdown (O2Cache)
  • Columns: C=区分, D=画面用名称, E=ポップアップ用名称, F=コメント, G=表示しない, H=発信者名称, I=発信者氏名, J=所属区分From), K=所属区分To), L=研究科区分, M=ソート順From), N=ソート順To), O=諸手当認定者区分

O3 — (220)通勤手当届出事由区分 (Notification Reason Category)

  • HeaderRow: 5 | StartRow: 6 | StartCol: C | EndCol: I
  • Encoding: utf-8 | HasHeader: No
  • Role: Notification reason categories for C1 G column dropdown (Todoke)
  • Columns: C=区分, D=画面用名称, E=ポップアップ名称, F=コメント, G=表示しない, H=備考, I=からまで

Enum — Dropdown Enum Values

  • Role: Stores all enum values used in dropdown validation
  • Sections (each keyed by column position):
    • Col A (KeyCol=1): 特別料金区分 (tokubetuList: 普通=0, 定期券=1, 回数券=2, プリペイドカード=3)
    • Col C (KeyCol=3): 券種 (kenshuList)
    • Col F (KeyCol=6): 連絡 (renrakuList)
    • Col H (KeyCol=8): 往復区分 (oufukuList: 1=片道, 2=往復)
    • Col K (KeyCol=11): 交替制 (koutaiList: 0=非該当, 1=該当)
    • Col N (KeyCol=14): 非該当者認定簿出力区分 (higaitouList: 1=出力, 2=非出力)
    • Col Q (KeyCol=17): エラーメッセージ (errorList)

Caches — Pre-rendered Dropdown Cache

  • Role: Stores pre-built validation lists for named-range based dropdowns
  • Layout: Each row is a pre-formatted "code:name" string used as named-range source

3. Cache Architecture

3.1 Cache Dictionary Keys

Constant Sheet Structure Key Value
CACHE_Z1 Z1 Dict(code → Array(name)) transport code Array(transport name)
CACHE_Z2 Z2 Dict(code → Array(name)) determination code Array(display name)
CACHE_Z3 Z3 Dict(code → Array(name)) decision code Array(display name)
CACHE_Z4ROSEN Z4 Dict(rosen → Dict(station → True)) line name Dict of all stations on that line
CACHE_T1 T1 Dict(code → Array(name)) ticket type code Array(display name)
CACHE_T2 T2 Dict(code → Array(all fields)) ticket code Array(C,D,E,F,G,H,I,J,K,L,M)
CACHE_T3 T3 Dict(code → Array(all fields)) card code Array(C,D,E,F,G,H,I)
CACHE_O1 O1 Dict(empNo → Array(addr1, addr2)) employee number Array(address1, address2)
CACHE_O2 O2 Dict(code → Array(name)) sender code Array(official name)
CACHE_O3 O3 Dict(code → Array(name)) reason code Array(display name)
CACHE_M1 M1 Dict(code → Array(all cols)) route code Array(C,D,E,F,G,H,I,J,K,L,M,N)
CACHE_M2 M2 Dict(code → Dict(ticketType → Array(detail))) route code Dict of ticket type → Array(I,J,K,L,M,N,O,P,Q,R)

3.2 Special Enum Caches

Constant Source Key Value
tokubetuList Enum sheet Col A int (0-3) name string
kenshuList Enum sheet Col C int name string
renrakuList Enum sheet Col F int name string
oufukuList Enum sheet Col H code name string
koutaiList Enum sheet Col K code name string
higaitouList Enum sheet Col N code name string
errorList Enum sheet Col Q error code error message

3.3 m1KukanDCache (Special Derived Cache)

  • Type: Dict(transportCode & "|" & fromStation → Dict(toStation → True))
  • Purpose: Fast lookup of valid arrival stations given transport + departure
  • Derivation: Built from M1 sheet at runtime: groups M1 rows by D(transport) + F(fromStation), keys are G(toStation)
  • Used by: BuildZ4StationToDropdown → C1 M1 KukanD cascade

4. Module Architecture

4.1 Module Summary

Module Responsibility
Common_Constants Error code constants (1001-1009, 2001+)
Common_Global_Cache All cache loading, refresh, and lookup. Sheet config definitions (RefreshSheetDict). Global Scripting.Dictionary objects.
Common_Functions CSV helpers (GetCSVHeader, CleanCSVField), validation helpers (CheckRequired, CheckAlphanumeric, etc.), utility functions (FormatDateInput, GetCode, MakeSelect)
Common_Selector Dropdown builder functions (BuildTransportList, BuildTodokeList, etc.) and Z4 cascade dropdowns (BuildZ4StationFromDropdown, BuildZ4StationToDropdown)
Common_File_Utils CSV file read/write (ReadCSV, WriteCSV), BOM handling
Common_Button Button action handlers: CSV_Import, Validation, CSV_Export, Sort, Filter, Fit. RunValidationSilent wrapper.
Common_Shape Icon/shape alignment utilities (AlignIconsByCenter)

4.2 Sheet Class Summary

Class Sheet Key Methods Notes
C1 C1 Worksheet_Change, FillAddressFromO1, FillTransportFromM1KukanD, FillDepartureFromM1KukanD, FillArrivalFromM1KukanD, FillKukanFromM1, FillCodeFromM2, ValidateRow Main editor. No CSV import.
M1 M1 Worksheet_Change, Validate, BuildM1StationDropdown Route master with Z4 cascade dropdowns
M2 M2 Worksheet_Change, Validate Route detail master, ticket pricing
T1 T1 Validate Periodic pass name master
T2 T2 Worksheet_Change, Validate Frequency ticket master with ZeroFillCols feature
T3 T3 Validate Prepaid card master
Z1 Z1 Validate Transport type master
Z2 Z2 Validate Determination category master
Z3 Z3 Validate Monthly amount decision master
Z4 Z4 Validate Station name / line master
O1 O1 Validate Employee address master (empty stub)
O2 O2 Validate Sender list (empty stub)
O3 O3 Validate Notification reason master (empty stub)

5. Data Flow

5.1 C1 Editing Flow (4 Kukan Sections)

User edits C (職員番号)
  → FillAddressFromO1: O1Cache lookup → populate I/J dropdowns
  → BuildTransportList → T/AB/AJ/AR dropdown (Z1Cache)

User selects T (交通機関)
  → BuildZ1StationDropdown → U/AC/AK/AS dropdown (Z1Cache)

User selects U (発)
  → BuildZ4StationFromDropdown → F column (from station) dropdown (Z4RosenCache filtered by transport)
  OR: BuildM1KukanDDropdown → V/AD/AL/AT dropdown (m1KukanDCache: transport+from → to stations)

User selects S (区間コード)
  → FillKukanFromM1: M1Cache lookup → fills T/U/V/W/Y with pre-defined values
  → BuildM2Dropdown → W/AE/AM/AU dropdown (M2Cache by route code)
  → BuildM2CodeDropdown → X/AF/AN/AV dropdown (M2Cache by route+券種)

User selects W (券種)
  → BuildM2CodeDropdown → X/AF/AN/AV dropdown (M2Cache: route+券種 → code)

User edits X (コード)
  → FillCodeFromM2: M2Cache lookup → fills AF/AG/AH with M2 details

5.2 CSV Import Flow

CSV_Import_Button clicked
  → User selects CSV file
  → ReadCSV (Common_File_Utils): shift_jis decode, BOM strip
  → GetCSVHeader: extract header row
  → LoadLookup: build/refresh cache for target sheet
  → DO_CSV_Import: parse rows, write to sheet cells
  → RunValidationSilent: call Sheet.Validate per row
  → HandleError on validation failure

5.3 Validation Flow

RunValidationSilent(sheet) → for each data row
  → Sheet.Validate(ws, rowNum, lastDataRow)
  → On error: Err.Raise → caught by HandleError in caller
  → Returns error count

6. Key Constants

6.1 CACHE_ Constants (defined in Common_Global_Cache)

CACHE_Z4ROSEN = "Z4Rosen"
CACHE_T1      = "T1"
CACHE_T2      = "T2"
CACHE_T3      = "T3"
CACHE_O1      = "O1"
CACHE_O2      = "O2"
CACHE_O3      = "O3"
CACHE_M1      = "M1"
CACHE_M2      = "M2"

6.2 Validation Error Codes

1001: ERR_CACHE_NOT_FOUND
1002: ERR_CACHE_EMPTY
1003: ERR_VALIDATION_FAILED
1004: ERR_CONFIG_NOT_FOUND
1005: ERR_CONFIG_INVALID
1006: ERR_CONFIG_EMPTY_PARAM
1007: ERR_SHEET_MISSING
2001: ERR_VALIDATION
5001-5009: File/CSV errors

6.3 MakeSelect Format

All dropdown values use code:name format:

  • Display: "001:JR 東北線" → MakeSelect("001", "JR 東北線")
  • GetCode("001:JR 東北線") → "001"
  • GetDisplay("001:JR 東北線") → "JR 東北線" (via mid/InStr)

7. Column Layout Reference

C1 — 58 columns (C to BG)

Column Header Type
C 職員番号 string(8)
D 事実発生年月日 date
E 提出年月日 date
F 受理年月日 date
G 届出の事由コード enum(O3)
H 届出の備考 string(40)
I 住所1 string
J 住所2 string
K 運賃改正・法改正年月日 date
L 出勤予定日数 number(2)
M 往復区分 enum(oufukuList)
N 交替制 enum(koutaiList)
O 算出式 string(80)
P 自動車等使用距離 number(3)
Q 自動車等支給額 number(6)
R 自動車等駐車場代 number(6)
S~Y 区間1 (コード/交通/発/着/券種/コード/期間) mixed
Z 区間1支給開始年月 date
AA~AG 区間2 mixed
AH 区間2支給開始年月 date
AI~AM 区間3 mixed
AN 区間3支給開始年月 date
AO~AS 区間4 mixed
AT 区間4支給開始年月 date
AU 決定事項区分コード enum(Z2)
AV 非該当の理由 string
AW 非該当者認定簿出力区分 enum(higaitouList)
AX 非該当者認定簿出力区分 (actual) enum
BB 手当月額の決定区分コード enum(Z3)
BC 支給の始期 date
BD 備考 string
BE 所属コード string
BF 認定年月日 date
BG (各庁の長)官職コード string

8. Known Issues / Technical Debt

# Severity Description Status
1 High M2.cls: cacheVal declared inside If block but used in Select Case outside it Fixed
2 High C1.cls: kukanCol, kukanCode, kukanLetter undeclared in Validate Fixed
3 Medium CJK comments in Common_Shape.bas and C1.cls Fixed
4 Medium Hardcoded path D:\Project\upds7\vba\ in Import_modules.bas Fixed
5 Medium sheetConfDict("Z4") hardcoded key Fixed
6 Medium sheetName:="M1" hardcoded in Common_Shape Fixed
7 Medium M1.cls: "M2" hardcoded sheet reference Fixed
8 Medium On Error Resume Next in 3 cache lookup functions (Common_Global_Cache.bas) Fixed
9 Low T2.cls: CJK in comment 区分 Fixed
10 Medium O1/O2/O3 Validate stubs are empty Not fixed