diff --git a/src/thisWorkbook/Tukin_C1.bas b/src/thisWorkbook/Tukin_C1.bas index 1386b90..77f44ea 100644 --- a/src/thisWorkbook/Tukin_C1.bas +++ b/src/thisWorkbook/Tukin_C1.bas @@ -35,243 +35,125 @@ Const Tukin_HEADER_ROW As Long = 6 ' AY-BA: 備考情報 (cols 51-53) ' BB-BC: 認定情報 (cols 54-56) -' ====== Event Handlers ====== +' ============================================================ +' Column arrays for 4 kukan sections +' ============================================================ +Private Function KUKAN_CODE_COLS() As Variant + KUKAN_CODE_COLS = Array(19, 26, 33, 40) ' S, Z, AG, AN +End Function + +Private Function KUKAN_TRANSPORT_COLS() As Variant + KUKAN_TRANSPORT_COLS = Array(20, 27, 34, 41) ' T, AA, AH, AO +End Function + +Private Function KUKAN_STATION_COLS() As Variant + KUKAN_STATION_COLS = Array(21, 28, 35, 42) ' U, AB, AI, AP +End Function + +Private Function KUKAN_ARRIVAL_COLS() As Variant + KUKAN_ARRIVAL_COLS = Array(22, 29, 36, 43) ' V, AC, AJ, AQ +End Function + +Private Function KUKAN_TICKET_COLS() As Variant + KUKAN_TICKET_COLS = Array(23, 30, 37, 44) ' W, AD, AK, AR +End Function + +Private Function KUKAN_CODE2_COLS() As Variant + KUKAN_CODE2_COLS = Array(24, 31, 38, 45) ' X, AE, AL, AS +End Function + +' ============================================================ +' Helper: Get index by value, return -1 if not found +' ============================================================ +Private Function GetIdx(val As Long, arr As Variant) As Long + Dim i As Long + For i = LBound(arr) To UBound(arr) + If arr(i) = val Then + GetIdx = i + Exit Function + End If + Next i + GetIdx = -1 +End Function + +' ============================================================ +' Event Handlers +' ============================================================ Private Sub Worksheet_Change(ByVal Target As Range) - ' === Column C changes: Fill address info from O1 and Z1 cache === - If Target.Column = 3 And Target.Row >= 7 Then + If Target.Row < 7 Then Exit Sub + + ' === Column C changes === + If Target.Column = 3 Then Dim cell As Range For Each cell In Target If Trim(cell.Value) = "" Then Call ClearRowData(Me, cell.Row) Else Call FillAddressFromO1(cell.Row) - ' Generate transport (T) dropdown for all 4 kukan sections - Call CreateZ1TransportDropdown(Me, cell.Row, 20) ' 区間1 - T column - Call CreateZ1TransportDropdown(Me, cell.Row, 30) ' 区間2 - AD column - Call CreateZ1TransportDropdown(Me, cell.Row, 37) ' 区間3 - AK column - Call CreateZ1TransportDropdown(Me, cell.Row, 44) ' 区間4 - AR column + Dim i As Long + For i = 0 To 3 + Call CreateZ1TransportDropdown(Me, cell.Row, KUKAN_TRANSPORT_COLS(i)) + Next i End If Next End If - ' === Column T (区間1 交通機関) changes: Generate U (利用区間発) dropdown from Z1 === - If Target.Column = 20 And Target.Row >= 7 Then + ' === Transport column changes (T, AA, AH, AO) === + Dim idx As Long + idx = GetIdx(Target.Column, KUKAN_TRANSPORT_COLS) + If idx >= 0 Then Dim cellT As Range For Each cellT In Target If Trim(cellT.Value) <> "" Then - Call CreateZ1StationDropdown(Me, cellT.Row, 20, 21, 1) + Call CreateZ1StationDropdown(Me, cellT.Row, KUKAN_TRANSPORT_COLS(idx), KUKAN_STATION_COLS(idx)) Else - Call ClearKukanValidation(Me, cellT.Row, 21) + Call ClearKukanValidation(Me, cellT.Row, KUKAN_STATION_COLS(idx)) End If Next End If - ' === Column U (区間1 利用区間発) changes: Generate V (利用区間着) dropdown from M1_KukanD === - If Target.Column = 21 And Target.Row >= 7 Then + ' === Station column changes (U, AB, AI, AP) === + idx = GetIdx(Target.Column, KUKAN_STATION_COLS) + If idx >= 0 Then Dim cellU As Range For Each cellU In Target If Trim(cellU.Value) <> "" Then - Call CreateM1KukanDDropdown(Me, cellU.Row, 20, 21, 22) - If Me.Cells(cellU.Row, 22).Validation.Formula1 = "" Then - ' No dropdown data, clear V column - Call ClearKukanValidation(Me, cellU.Row, 22) + Call CreateM1KukanDDropdown(Me, cellU.Row, KUKAN_TRANSPORT_COLS(idx), KUKAN_STATION_COLS(idx), KUKAN_ARRIVAL_COLS(idx)) + If Me.Cells(cellU.Row, KUKAN_ARRIVAL_COLS(idx)).Validation.Formula1 = "" Then + Call ClearKukanValidation(Me, cellU.Row, KUKAN_ARRIVAL_COLS(idx)) End If Else - Call ClearKukanValidation(Me, cellU.Row, 22) + Call ClearKukanValidation(Me, cellU.Row, KUKAN_ARRIVAL_COLS(idx)) End If Next End If - ' === Column AD (区間2 交通機関) changes === - If Target.Column = 30 And Target.Row >= 7 Then - Dim cellAD As Range - For Each cellAD In Target - If Trim(cellAD.Value) <> "" Then - Call CreateZ1StationDropdown(Me, cellAD.Row, 30, 31) - Else - Call ClearKukanValidation(Me, cellAD.Row, 31) - End If - Next - End If - - ' === Column AE (区間2 利用区間発) changes === - If Target.Column = 31 And Target.Row >= 7 Then - Dim cellAE As Range - For Each cellAE In Target - If Trim(cellAE.Value) <> "" Then - Call CreateM1KukanDDropdown(Me, cellAE.Row, 30, 31, 32) - If Me.Cells(cellAE.Row, 32).Validation.Formula1 = "" Then - Call ClearKukanValidation(Me, cellAE.Row, 32) + ' === Kukan code column changes (S, Z, AG, AN) === + idx = GetIdx(Target.Column, KUKAN_CODE_COLS) + If idx >= 0 Then + Dim cellK As Range + For Each cellK In Target + If Trim(cellK.Value) <> "" Then + Call CreateZ1TransportDropdown(Me, cellK.Row, KUKAN_TRANSPORT_COLS(idx)) + If Me.Cells(cellK.Row, KUKAN_TRANSPORT_COLS(idx)).Validation.Formula1 <> "" Then + Call FillKukanFromM1(Me, cellK.Row, KUKAN_CODE_COLS(idx), Array(KUKAN_TRANSPORT_COLS(idx), KUKAN_STATION_COLS(idx), KUKAN_ARRIVAL_COLS(idx))) + Call CreateM2Dropdown(Me, cellK.Row, KUKAN_CODE_COLS(idx), KUKAN_TICKET_COLS(idx)) End If Else - Call ClearKukanValidation(Me, cellAE.Row, 32) + Call ClearKukanValidation(Me, cellK.Row, KUKAN_TICKET_COLS(idx)) End If Next End If - ' === Column AK (区間3 交通機関) changes === - If Target.Column = 37 And Target.Row >= 7 Then - Dim cellAK As Range - For Each cellAK In Target - If Trim(cellAK.Value) <> "" Then - Call CreateZ1StationDropdown(Me, cellAK.Row, 37, 38) + ' === Ticket column changes (W, AD, AK, AR) === + idx = GetIdx(Target.Column, KUKAN_TICKET_COLS) + If idx >= 0 Then + Dim cellTi As Range + For Each cellTi In Target + If Trim(cellTi.Value) <> "" Then + Call CreateM2CodeDropdown(Me, cellTi.Row, KUKAN_CODE_COLS(idx), KUKAN_TICKET_COLS(idx), KUKAN_CODE2_COLS(idx)) Else - Call ClearKukanValidation(Me, cellAK.Row, 38) - End If - Next - End If - - ' === Column AL (区間3 利用区間発) changes === - If Target.Column = 38 And Target.Row >= 7 Then - Dim cellAL As Range - For Each cellAL In Target - If Trim(cellAL.Value) <> "" Then - Call CreateM1KukanDDropdown(Me, cellAL.Row, 37, 38, 39) - If Me.Cells(cellAL.Row, 39).Validation.Formula1 = "" Then - Call ClearKukanValidation(Me, cellAL.Row, 39) - End If - Else - Call ClearKukanValidation(Me, cellAL.Row, 39) - End If - Next - End If - - ' === Column AR (区間4 交通機関) changes === - If Target.Column = 44 And Target.Row >= 7 Then - Dim cellAR As Range - For Each cellAR In Target - If Trim(cellAR.Value) <> "" Then - Call CreateZ1StationDropdown(Me, cellAR.Row, 44, 45) - Else - Call ClearKukanValidation(Me, cellAR.Row, 45) - End If - Next - End If - - ' === Column AS (区間4 利用区間発) changes === - If Target.Column = 45 And Target.Row >= 7 Then - Dim cellAS As Range - For Each cellAS In Target - If Trim(cellAS.Value) <> "" Then - Call CreateM1KukanDDropdown(Me, cellAS.Row, 44, 45, 46) - If Me.Cells(cellAS.Row, 46).Validation.Formula1 = "" Then - Call ClearKukanValidation(Me, cellAS.Row, 46) - End If - Else - Call ClearKukanValidation(Me, cellAS.Row, 46) - End If - Next - End If - - ' === Column S changes: Fill 区間1 from M1/M2 cache === - If Target.Column = 19 And Target.Row >= 7 Then - Dim cellS As Range - For Each cellS In Target - If Trim(cellS.Value) <> "" Then - ' First check if T column has dropdown data - Call CreateZ1TransportDropdown(Me, cellS.Row, 20) - If Me.Cells(cellS.Row, 20).Validation.Formula1 <> "" Then - Call FillKukanFromM1(Me, cellS.Row, 19, Array(20, 21, 22)) ' S->T,U,V - Call CreateM2Dropdown(Me, cellS.Row, 19, 23) ' S->W dropdown (券種) - End If - Else - Call ClearKukanValidation(Me, cellS.Row, 23) - End If - Next - End If - - ' === Column W changes: Fill 券種 dropdown -> generate X dropdown === - If Target.Column = 23 And Target.Row >= 7 Then - Dim cellW As Range - For Each cellW In Target - If Trim(cellW.Value) <> "" Then - Call CreateM2CodeDropdown(Me, cellW.Row, 19, 23, 24) ' kukanCode, kanshu -> X dropdown - Else - Call ClearKukanValidation(Me, cellW.Row, 24) - End If - Next - End If - - ' === Column Z changes: Fill 区間2 from M1/M2 cache === - If Target.Column = 26 And Target.Row >= 7 Then - Dim cellZ As Range - For Each cellZ In Target - If Trim(cellZ.Value) <> "" Then - Call CreateZ1TransportDropdown(Me, cellZ.Row, 30) - If Me.Cells(cellZ.Row, 30).Validation.Formula1 <> "" Then - Call FillKukanFromM1(Me, cellZ.Row, 26, Array(27, 28, 29)) ' Z->AA,AB,AC - Call CreateM2Dropdown(Me, cellZ.Row, 26, 30) ' Z->AD dropdown - End If - Else - Call ClearKukanValidation(Me, cellZ.Row, 30) - End If - Next - End If - - ' === Column AD changes: Fill 券種 dropdown -> generate AH dropdown === - If Target.Column = 30 And Target.Row >= 7 Then - Dim cellAD As Range - For Each cellAD In Target - If Trim(cellAD.Value) <> "" Then - Call CreateM2CodeDropdown(Me, cellAD.Row, 26, 30, 31) ' kukanCode, kanshu -> AH dropdown - Else - Call ClearKukanValidation(Me, cellAD.Row, 31) - End If - Next - End If - - ' === Column AG changes: Fill 区間3 from M1/M2 cache === - If Target.Column = 33 And Target.Row >= 7 Then - Dim cellAG As Range - For Each cellAG In Target - If Trim(cellAG.Value) <> "" Then - Call CreateZ1TransportDropdown(Me, cellAG.Row, 37) - If Me.Cells(cellAG.Row, 37).Validation.Formula1 <> "" Then - Call FillKukanFromM1(Me, cellAG.Row, 33, Array(34, 35, 36)) ' AG->AH,AI,AJ - Call CreateM2Dropdown(Me, cellAG.Row, 33, 37) ' AG->AK dropdown - End If - Else - Call ClearKukanValidation(Me, cellAG.Row, 37) - End If - Next - End If - - ' === Column AK changes: Fill 券種 dropdown -> generate AL dropdown === - If Target.Column = 37 And Target.Row >= 7 Then - Dim cellAK As Range - For Each cellAK In Target - If Trim(cellAK.Value) <> "" Then - Call CreateM2CodeDropdown(Me, cellAK.Row, 33, 37, 38) ' kukanCode, kanshu -> AL dropdown - Else - Call ClearKukanValidation(Me, cellAK.Row, 38) - End If - Next - End If - - ' === Column AN changes: Fill 区間4 from M1/M2 cache === - If Target.Column = 40 And Target.Row >= 7 Then - Dim cellAN As Range - For Each cellAN In Target - If Trim(cellAN.Value) <> "" Then - Call CreateZ1TransportDropdown(Me, cellAN.Row, 44) - If Me.Cells(cellAN.Row, 44).Validation.Formula1 <> "" Then - Call FillKukanFromM1(Me, cellAN.Row, 40, Array(41, 42, 43)) ' AN->AO,AP,AQ - Call CreateM2Dropdown(Me, cellAN.Row, 40, 44) ' AN->AR dropdown - End If - Else - Call ClearKukanValidation(Me, cellAN.Row, 44) - End If - Next - End If - - ' === Column AR changes: Fill 券種 dropdown -> generate AS dropdown === - If Target.Column = 44 And Target.Row >= 7 Then - Dim cellAR As Range - For Each cellAR In Target - If Trim(cellAR.Value) <> "" Then - Call CreateM2CodeDropdown(Me, cellAR.Row, 40, 44, 45) ' kukanCode, kanshu -> AS dropdown - Else - Call ClearKukanValidation(Me, cellAR.Row, 45) + Call ClearKukanValidation(Me, cellTi.Row, KUKAN_CODE2_COLS(idx)) End If Next End If diff --git a/src/thisWorkbook/Tukin_C1_Action.md b/src/thisWorkbook/Tukin_C1_Action.md new file mode 100644 index 0000000..5f7f652 --- /dev/null +++ b/src/thisWorkbook/Tukin_C1_Action.md @@ -0,0 +1,81 @@ +# Tukin_C1 用户动作文档 + +## 列动作映射 + +### C列 (职员番号) +- **触发条件**: C列 >= 第7行,内容变化 +- **动作**: + - 内容清空 → `ClearRowData` 清除整行 + - 有内容 → `FillAddressFromO1` 填充地址下拉 + 生成4个区间的交通機関下拉 + +--- + +### 区間1 + +| 列 | 动作 | 触发条件 | 处理逻辑 | +|---|---|---|---| +| **T** (交通機関) | 交通手段下拉变化 | Column=20 | `CreateZ1StationDropdown` → 生成U列(発)下拉 | +| **U** (利用区間発) | 发站下拉变化 | Column=21 | `CreateM1KukanDDropdown` → 生成V列(着)下拉 | +| **S** (区間コード) | 区间代码输入 | Column=19 | 生成T列下拉 → T列有值时填充U,V + 生成W列(券種)下拉 | +| **W** (券種) | 券种下拉变化 | Column=23 | `CreateM2CodeDropdown` → 生成X列(コード)下拉 | + +--- + +### 区間2 + +| 列 | 动作 | 触发条件 | 处理逻辑 | +|---|---|---|---| +| **AA** (交通機関) | 交通手段下拉变化 | Column=27 | `CreateZ1StationDropdown` → 生成AB列(発)下拉 | +| **AB** (利用区間発) | 发站下拉变化 | Column=28 | `CreateM1KukanDDropdown` → 生成AC列(着)下拉 | +| **Z** (区間コード) | 区间代码输入 | Column=26 | 生成AA列下拉 → AA列有值时填充AB,AC + 生成AD列(券種)下拉 | +| **AD** (券種) | 券种下拉变化 | Column=30 | `CreateM2CodeDropdown` → 生成AE列(コード)下拉 | + +--- + +### 区間3 + +| 列 | 动作 | 触发条件 | 处理逻辑 | +|---|---|---|---| +| **AH** (交通機関) | 交通手段下拉变化 | Column=34 | `CreateZ1StationDropdown` → 生成AI列(発)下拉 | +| **AI** (利用区間発) | 发站下拉变化 | Column=35 | `CreateM1KukanDDropdown` → 生成AJ列(着)下拉 | +| **AG** (区間コード) | 区间代码输入 | Column=33 | 生成AH列下拉 → AH列有值时填充AI,AJ + 生成AK列(券種)下拉 | +| **AK** (券種) | 券种下拉变化 | Column=37 | `CreateM2CodeDropdown` → 生成AL列(コード)下拉 | + +--- + +### 区間4 + +| 列 | 动作 | 触发条件 | 处理逻辑 | +|---|---|---|---| +| **AO** (交通機関) | 交通手段下拉变化 | Column=41 | `CreateZ1StationDropdown` → 生成AP列(発)下拉 | +| **AP** (利用区間発) | 发站下拉变化 | Column=42 | `CreateM1KukanDDropdown` → 生成AQ列(着)下拉 | +| **AN** (区間コード) | 区间代码输入 | Column=40 | 生成AO列下拉 → AO列有值时填充AP,AQ + 生成AR列(券種)下拉 | +| **AR** (券種) | 券种下拉变化 | Column=44 | `CreateM2CodeDropdown` → 生成AS列(コード)下拉 | + +--- + +## 方法列表 + +| 方法名 | 功能 | +|---|---| +| `FillAddressFromO1` | 根据职员番号(C列)从O1缓存填充住所下拉(I列) | +| `CreateZ1TransportDropdown` | 生成交通機関下拉 | +| `CreateZ1StationDropdown` | 根据交通手段从Z1缓存生成发站下拉 | +| `CreateM1KukanDDropdown` | 根据交通手段+发站从M1KukanD缓存生成着站下拉 | +| `FillKukanFromM1` | 根据区间代码从M1缓存填充区间信息(T/U/V等) | +| `CreateM2Dropdown` | 根据区间代码生成券種下拉 | +| `CreateM2CodeDropdown` | 根据区间代码+券種生成コード下拉 | +| `ClearRowData` | 清除整行数据 | +| `ClearKukanValidation` | 清除指定列的验证下拉 | + +--- + +## 缓存依赖 + +| 缓存 | 用途 | +|---|---| +| `o1Cache` | 职员番号 → 住所 | +| `z1Cache` | 交通手段 → 站点 | +| `m1KukanDCache` | 交通手段+发站 → 着站 | +| `m1Cache` | 区间代码 → 区间信息 | +| `m2Cache` | 区间代码+券種 → コード | diff --git a/src/thisWorkbook/Tukin_C1_Mapping.md b/src/thisWorkbook/Tukin_C1_Mapping.md new file mode 100644 index 0000000..4d5f0e3 --- /dev/null +++ b/src/thisWorkbook/Tukin_C1_Mapping.md @@ -0,0 +1,29 @@ +### 届出情報 +|列|C列|D列|E列|F列|G列|H列| +|--------|--------|--------|--------|--------|--------|--------| +|ヘッダ|職員番号|事実発生年月日|提出年月日|受理年月日|届出の事由コード|届出の備考| +|データ型|8|日付|日付|日付|Enum|文字列| + +### 区間1情報 +|列|S列|T列|U列|V列|W列|X列|Y列| +|--------|--------|--------|--------|--------|--------|--------|--------| +|ヘッダ|区間1区間コード|区間1交通機関|区間1発|区間1着|区間1券種|区間1コード|区間1支給開始年月| +|データ型|5|3|文字列|文字列|Enum|3|日付| + +### 区間2情報 +|列|Z列|AA列|AB列|AC列|AD列|AE列|AF列| +|--------|--------|--------|--------|--------|--------|--------|--------| +|ヘッダ|区間2区間コード|区間2交通機関|区間2発|区間2着|区間2券種|区間2コード|区間2支給開始年月| +|データ型|5|3|文字列|文字列|Enum|3|日付| + +### 区間3情報 +|列|AG列|AH列|AI列|AJ列|AK列|AL列|AM列| +|--------|--------|--------|--------|--------|--------|--------|--------| +|ヘッダ|区間3区間コード|区間3交通機関|区間3発|区間3着|区間3券種|区間3コード|区間3支給開始年月| +|データ型|5|3|文字列|文字列|Enum|3|日付| + +### 区間4情報 +|列|AN列|AO列|AP列|AQ列|AR列|AS列|AT列| +|--------|--------|--------|--------|--------|--------|--------|--------| +|ヘッダ|区間4区間コード|区間4交通機関|区間4発|区間4着|区間4券種|区間4コード|区間4支給開始年月| +|データ型|5|3|文字列|文字列|Enum|3|日付| \ No newline at end of file diff --git a/通勤手当テンプレート_案.xlsm b/通勤手当テンプレート_案.xlsm index 8ef126d..f16a78c 100644 Binary files a/通勤手当テンプレート_案.xlsm and b/通勤手当テンプレート_案.xlsm differ