From c39b8da85e3fa5925d2490604600b875125020d3 Mon Sep 17 00:00:00 2001 From: updsv7 Date: Thu, 16 Apr 2026 14:22:11 +0900 Subject: [PATCH] m2 update --- src/data/区間詳細.csv | 20 + src/module/Module_Common.bas | 23 +- src/module/Read_Common.bas | 10 +- src/thisWorkbook/Master_M1_Kukan.bas | 64 ++- src/thisWorkbook/Master_M2_Kukan_detail.bas | 455 ++++++++------------ 通勤手当テンプレート_案.xlsm | Bin 493855 -> 476509 bytes 6 files changed, 255 insertions(+), 317 deletions(-) create mode 100644 src/data/区間詳細.csv diff --git a/src/data/区間詳細.csv b/src/data/区間詳細.csv new file mode 100644 index 0000000..1bbb2a5 --- /dev/null +++ b/src/data/区間詳細.csv @@ -0,0 +1,20 @@ +pԃR[h,,R[h,,1ӌ^/̔z,z/P(z)/pz,x/P()/ʗ,ʗ/Q(z),Q(),[(z),ʗ +00001,1,003,Uӌ,7920,47520,6,,,, +00001,2,001,eXg,15000,0,0,0,0,0, +00001,3,001,vyChJ[h,20000,20000,,,,, +00002,1,003,Uӌ,1451.833,8711,6,,,, +00002,2,001,eXg,15000,0,0,0,0,0, +00002,3,002,0002eXg,45000,60000,,,,, +00003,2,002,eXg2,500,500,10,500,10,0, +00004,3,003,0004eXg,5000,5000,,,,, +00005,1,003,Uӌ,4753.333,28520,6,,,, +00006,1,001,Pӌ,7920,7920,1,,,, +00006,1,003,Uӌ,7920,47520,6,,,, +00021,1,001,Pӌ,6260,6260,1,,,, +00038,1,001,Pӌ,6260,6260,1,,,, +00056,1,003,Uӌ,10030,10030,1,,,, +00067,1,003,Uӌ,4486.666,26920,6,,,, +00068,1,003,Uӌ,52800,316800,6,,,, +00069,1,006,Uӌ,7181.666,43090,6,,,, +00070,1,003,Uӌ,6426.666,38560,6,,,, +00071,1,003,Uӌ,6879,6879,1,,,, \ No newline at end of file diff --git a/src/module/Module_Common.bas b/src/module/Module_Common.bas index 5f07a36..68d3ba1 100644 --- a/src/module/Module_Common.bas +++ b/src/module/Module_Common.bas @@ -2,6 +2,25 @@ ' Common Functions ' ============================================================ +' Get CSV header from specified row and columns +Function GetCSVHeader(ByVal ws As Worksheet, ByVal colLetters As Variant, ByVal headerRow As Long) As Variant + Dim colCount As Long: colCount = UBound(colLetters) - LBound(colLetters) + 1 + Dim headerArr() As String + ReDim headerArr(1 To 1, 1 To colCount) + + Dim i As Long + Dim cellValue As String + For i = 0 To colCount - 1 + cellValue = Trim(ws.Cells(headerRow, Columns(colLetters(i)).Column).Value) + cellValue = Replace(cellValue, vbLf, "") + cellValue = Replace(cellValue, vbCr, "") + cellValue = Replace(cellValue, vbCrLf, "") + headerArr(1, i + 1) = cellValue + Next i + + GetCSVHeader = headerArr +End Function + Function CleanCSVField(ByVal inputStr As String) As String Dim s As String s = Trim(inputStr) @@ -145,7 +164,9 @@ Function ClearDataRows(ByVal ws As Worksheet, ByVal startCol As Long, ByVal endC Dim lastDataRow As Long: lastDataRow = GetLastDataRowInRange(ws, startCol, endCol, startRow) If lastDataRow >= startRow Then - ws.Range(ws.Cells(startRow, startCol), ws.Cells(lastDataRow, endCol)).ClearContents + Dim clearRange As Range: Set clearRange = ws.Range(ws.Cells(startRow, startCol), ws.Cells(lastDataRow, endCol)) + clearRange.ClearContents + clearRange.Interior.Color = vbWhite End If End Function diff --git a/src/module/Read_Common.bas b/src/module/Read_Common.bas index 986923f..1e66ff6 100644 --- a/src/module/Read_Common.bas +++ b/src/module/Read_Common.bas @@ -49,7 +49,7 @@ Function ReadCSVAs2DArrayStrict( _ .Close End With - ' === stardand === + ' === standardize === textContent = Replace(textContent, vbCrLf, vbLf) textContent = Replace(textContent, vbCr, vbLf) @@ -135,6 +135,10 @@ Private Function ParseCSVLines(ByVal csvText As String) As Collection currentField = currentField & c i = i + 1 Else + ' Clean field before adding + currentField = Trim(currentField) + currentField = Replace(currentField, vbCr, "") + currentField = Replace(currentField, vbLf, "") currentRow.Add currentField currentField = "" i = i + 1 @@ -167,6 +171,10 @@ Private Function ParseCSVLines(ByVal csvText As String) As Collection ' Handle last row without trailing newline If currentField <> "" Or currentRow.Count > 0 Then + ' Clean field before adding + currentField = Trim(currentField) + currentField = Replace(currentField, vbCr, "") + currentField = Replace(currentField, vbLf, "") currentRow.Add currentField Dim lastArr() As String If currentRow.Count > 0 Then diff --git a/src/thisWorkbook/Master_M1_Kukan.bas b/src/thisWorkbook/Master_M1_Kukan.bas index ef63b38..15f1e33 100644 --- a/src/thisWorkbook/Master_M1_Kukan.bas +++ b/src/thisWorkbook/Master_M1_Kukan.bas @@ -1,13 +1,16 @@ -' ====== (222) ======= - ' ====== Constants ====== -Const START_COL As Long = 3 ' C column -Const END_COL As Long = 14 ' N column -Const ERROR_COL As Long = 15 ' O column +Const START_COL As Long = 3 ' C column +Const END_COL As Long = 14 ' N column +Const ERROR_COL As Long = 15 ' O column +Const M1_HEADER_ROW As Long = 5 Private z1Cache As Object ' Z1 cache Private enumCache As Object ' Z1 cache +Function HEADERS() As Variant + HEADERS = Array("C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N") +End Function + ' ====== Function ====== Public Sub RefreshZ1Cache() On Error GoTo RefreshError @@ -67,23 +70,6 @@ Private Sub CreateEnumDropdown(ByVal rowNum As Long) End Sub -' Get CSV header from row 5 (columns C to N) -Function GetM1CSVHeader(ByVal ws As Worksheet) As Variant - Dim headerArr(1 To 1, 1 To 12) As String - Dim i As Long - Dim cellValue As String - - For i = 1 To 12 - cellValue = Trim(ws.Cells(5, i + 2).Value) ' i+2: 1→3(C), 12→14(N) - ' Remove line breaks - cellValue = Replace(cellValue, vbLf, "") - cellValue = Replace(cellValue, vbCr, "") - cellValue = Replace(cellValue, vbCrLf, "") - headerArr(1, i) = cellValue - Next i - - GetM1CSVHeader = headerArr -End Function Private Sub Worksheet_Change(ByVal Target As Range) ' === Column C changes: Create L column dropdown === @@ -121,11 +107,8 @@ Private Sub Worksheet_Change(ByVal Target As Range) End Sub Sub M1_Import() - Dim wsTarget As Worksheet: Set wsTarget = Me - ' === Step 1: Select CSV file === - Dim filePath As String - filePath = SelectCSVFile() + Dim filePath As String: filePath = SelectCSVFile() If filePath = "" Then Exit Sub ' === Step 2: Read CSV with Shift-JIS (using common function) === @@ -137,19 +120,22 @@ Sub M1_Import() MsgBox "No data in CSV.", vbExclamation Exit Sub End If + ' === Step 3:Clear all data rows before import === Application.EnableEvents = False + Dim wsTarget As Worksheet: Set wsTarget = Me Call ClearDataRows(wsTarget, START_COL, END_COL, 7) Application.EnableEvents = True - ' === Step 3: Write CSV data to worksheet (forward order) === - Dim i As Long + ' === Step 4: Write CSV data to worksheet === + Dim colLetters As Variant: colLetters = HEADERS() Dim writeRow As Long: writeRow = 7 + Dim i As Long For i = LBound(csvData, 1) To UBound(csvData, 1) ' CSV col 1-12 -> C-N column Dim j As Long - For j = 1 To 12 - wsTarget.Cells(writeRow, j + 2).Value = CleanCSVField(CStr(csvData(i, j))) + For j = 0 To 11 + wsTarget.Cells(writeRow, Columns(colLetters(j)).Column).Value = CleanCSVField(CStr(csvData(i, j + 1))) Next j writeRow = writeRow + 1 Next i @@ -268,10 +254,8 @@ Sub M1_Export() Exit Sub End If - Dim ws As Worksheet - Set ws = Me - ' === Step 1: Validate all rows before export === + Dim ws As Worksheet: Set ws = Me Dim r As Long, errorCount As Long For r = 7 To lastDataRow Call validate(r, lastDataRow) @@ -286,8 +270,7 @@ Sub M1_Export() End If ' === Step 2: Select save path === - Dim savePath As String - savePath = GetSaveCSVPath() + Dim savePath As String: savePath = GetSaveCSVPath() If savePath = "" Then Exit Sub ' === Step 3: Count data rows === @@ -295,22 +278,23 @@ Sub M1_Export() ' === Step 4: Build array with header and data === Dim headerArr As Variant - headerArr = GetM1CSVHeader(ws) + Dim colLetters As Variant: colLetters = HEADERS() + headerArr = GetCSVHeader(ws, colLetters, M1_HEADER_ROW) Dim outputArr As Variant ReDim outputArr(1 To rowCount + 1, 1 To 12) ' Row 1: header Dim colIdx As Long - For colIdx = 1 To 12 - outputArr(1, colIdx) = headerArr(1, colIdx) + For colIdx = 0 To 11 + outputArr(1, colIdx + 1) = headerArr(1, colIdx + 1) Next colIdx ' Rows 2+: data (C-N columns) Dim dataRow As Long: dataRow = 2 For r = 7 To lastDataRow - For colIdx = 1 To 12 - outputArr(dataRow, colIdx) = CleanCSVField(ws.Cells(r, colIdx + 2).Value) + For colIdx = 0 To 11 + outputArr(dataRow, colIdx + 1) = CleanCSVField(ws.Cells(r, Columns(colLetters(colIdx)).Column).Value) Next colIdx dataRow = dataRow + 1 Next r diff --git a/src/thisWorkbook/Master_M2_Kukan_detail.bas b/src/thisWorkbook/Master_M2_Kukan_detail.bas index ebf12b7..d499519 100644 --- a/src/thisWorkbook/Master_M2_Kukan_detail.bas +++ b/src/thisWorkbook/Master_M2_Kukan_detail.bas @@ -1,5 +1,30 @@ -' CSV Header Constants -Const CSV_HEADER As String = "利用区間コード,券種,コード,名称,1箇月運賃/販売額,定期額/券1(額)/利用額,定期支給期間/券1(枚)/特別料金,特別料金/券2(額),券2(枚),端数(額),特別料金" +' ====== Constants ====== +Const START_COL As Long = 3 ' C column +Const END_COL As Long = 18 ' R column +Const ERROR_COL As Long = 19 ' S column +Const M2_HEADER_ROW As Long = 6 + +Private m1Cache As Object ' M1 cache + +Function HEADERS() As Variant + HEADERS = Array("C", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R") +End Function + +' ====== Function ====== +Public Sub RefreshM1Cache() + On Error GoTo RefreshError + Set m1Cache = LoadLookup("M1", keyCol:=3, valueCols:=Array(4), 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 Private Sub Worksheet_Change(ByVal Target As Range) ' === Fill D, E when C column changes === @@ -9,13 +34,13 @@ Private Sub Worksheet_Change(ByVal Target As Range) If Trim(cell.Value) = "" Then Call ClearRowData(Me, cell.Row) Else - Call FillFromKukanMaster(Me, cell.Row) + Call FillFromM1(Me, cell.Row) End If Next End If End Sub -Sub FillFromKukanMaster(ByVal ws As Worksheet, ByVal rowNum As Long, Optional ByVal setG As Boolean = True) +Sub FillFromM1(ByVal ws As Worksheet, ByVal rowNum As Long, Optional ByVal setG As Boolean = True) Dim wsKukan As Worksheet Dim lastRow As Long Dim i As Long @@ -54,310 +79,190 @@ Sub ClearRowData(ByVal ws As Worksheet, ByVal rowNum As Long) ws.Cells(rowNum, 19).ClearContents ' Q column error info End Sub -Sub ImportMasterDetailData() - Dim filePath As String - Dim fileDialog As FileDialog - Dim wsTarget As Worksheet - Dim stream As Object - Dim textContent As String - Dim lines As Variant - Dim i As Long - Dim dataArray As Variant - Dim code As String - Dim lastRow As Long - Dim r As Long - ' Target this worksheet - Set wsTarget = Me - +Sub M2_Import() ' === Step 1: Select CSV file === - Set fileDialog = Application.FileDialog(msoFileDialogFilePicker) - With fileDialog - .Filters.Clear - .Filters.Add "CSV Files", "*.csv" - .AllowMultiSelect = False - If .Show <> -1 Then Exit Sub - filePath = .SelectedItems(1) - End With - - ' === Step 2: Read CSV with Shift-JIS === - Set stream = CreateObject("ADODB.Stream") - With stream - .Type = 2 - .Charset = "shift_jis" - .Open - .LoadFromFile filePath - textContent = .ReadText - .Close - End With - - lines = Split(textContent, vbLf) - - ' === Validate CSV header === - If UBound(lines) >= 0 And Trim(lines(0)) <> "" Then - Dim csvHeader As String - csvHeader = Trim(lines(0)) - ' Validate column count - Dim expectedCount As Long - expectedCount = UBound(Split(CSV_HEADER, ",")) + 1 - Dim headerFields As Variant - headerFields = Split(csvHeader, ",") - If UBound(headerFields) + 1 <> expectedCount Then - MsgBox "CSV column count mismatch. Expected: " & expectedCount & ", Got: " & UBound(headerFields) + 1, vbExclamation - Exit Sub - End If - End If - - ' === Clear all data rows before import === - lastRow = wsTarget.Cells(wsTarget.Rows.Count, "C").End(xlUp).Row - If lastRow >= 7 Then - wsTarget.Range("A7:P" & lastRow).ClearContents - End If - - If UBound(lines) < 1 Then + Dim filePath As String: filePath = SelectCSVFile() + If filePath = "" Then Exit Sub + + ' === Step 2: Read CSV with Shift-JIS (using common function) === + On Error GoTo ImportError + Dim csvData As Variant: csvData = ReadCSVAs2DArrayStrict(filePath, 11, "shift_jis", True) + On Error GoTo 0 + + If UBound(csvData, 1) < 1 Then MsgBox "No data in CSV.", vbExclamation Exit Sub End If - ' === Step 3: Collect CSV codes and data === - Dim csvData As Object - Set csvData = CreateObject("Scripting.Dictionary") - - For i = 1 To UBound(lines) - If Trim(lines(i)) = "" Then GoTo NextCsvLine - dataArray = Split(lines(i), ",") - If UBound(dataArray) >= 0 Then - code = CleanCSVField(CStr(dataArray(0))) - If code <> "" Then - ' Use unique key: code + "_" + row index to avoid duplicate key error - csvData.Add code & "_" & i, dataArray - End If - End If -NextCsvLine: - Next i - - If csvData.Count = 0 Then - MsgBox "No valid code found.", vbExclamation - Exit Sub - End If - - ' === Step 6: Write CSV data to next available row === - writeRow = 7 - - For i = 1 To UBound(lines) - If Trim(lines(i)) = "" Then GoTo NextLine - - dataArray = Split(lines(i), ",") - - ' CSV col 1 -> C column - code = CleanCSVField(CStr(dataArray(0))) - wsTarget.Cells(writeRow, 3).Value = code - - ' CSV col 2-11 -> G-P column - If UBound(dataArray) >= 1 Then wsTarget.Cells(writeRow, 9).Value = CleanCSVField(CStr(dataArray(1))) - If UBound(dataArray) >= 2 Then wsTarget.Cells(writeRow, 10).Value = CleanCSVField(CStr(dataArray(2))) - If UBound(dataArray) >= 3 Then wsTarget.Cells(writeRow, 11).Value = CleanCSVField(CStr(dataArray(3))) - If UBound(dataArray) >= 4 Then wsTarget.Cells(writeRow, 12).Value = CleanCSVField(CStr(dataArray(4))) - If UBound(dataArray) >= 5 Then wsTarget.Cells(writeRow, 13).Value = CleanCSVField(CStr(dataArray(5))) - If UBound(dataArray) >= 6 Then wsTarget.Cells(writeRow, 14).Value = CleanCSVField(CStr(dataArray(6))) - If UBound(dataArray) >= 7 Then wsTarget.Cells(writeRow, 15).Value = CleanCSVField(CStr(dataArray(7))) - If UBound(dataArray) >= 8 Then wsTarget.Cells(writeRow, 16).Value = CleanCSVField(CStr(dataArray(8))) - If UBound(dataArray) >= 9 Then wsTarget.Cells(writeRow, 17).Value = CleanCSVField(CStr(dataArray(9))) - If UBound(dataArray) >= 10 Then wsTarget.Cells(writeRow, 18).Value = CleanCSVField(CStr(dataArray(10))) - - ' Auto-fill D, E columns - Call FillFromKukanMaster(wsTarget, writeRow, False) - - ' G column has value → trigger F dropdown + ' === Step 3:Clear all data rows before import === + Application.EnableEvents = False + Dim wsTarget As Worksheet: Set wsTarget = Me + Call ClearDataRows(wsTarget, START_COL, ERROR_COL, 7) + Application.EnableEvents = True - + ' === Step 4: Write CSV data to worksheet === + Dim colLetters As Variant: colLetters = HEADERS() + Dim writeRow As Long: writeRow = 7 + Dim i As Long + For i = LBound(csvData, 1) To UBound(csvData, 1) + ' CSV col 1-11 -> C, I-R column + Dim j As Long + For j = 0 To 10 + wsTarget.Cells(writeRow, Columns(colLetters(j)).Column).Value = CleanCSVField(CStr(csvData(i, j + 1))) + Next j writeRow = writeRow + 1 -NextLine: Next i - + MsgBox writeRow - 7 & " rows imported.", vbInformation + Exit Sub + +ImportError: + MsgBox "CSV import failed: " & Err.Description, vbExclamation End Sub -Function CleanCSVField(ByVal field As Variant) As String - If IsEmpty(field) Or IsNull(field) Then - CleanCSVField = "" - Exit Function - End If - - Dim result As String - result = Trim(CStr(field)) - - If Len(result) >= 2 Then - If Left(result, 1) = """" And Right(result, 1) = """" Then - result = Mid(result, 2, Len(result) - 2) - result = Replace(result, """""", """") - End If - End If - CleanCSVField = result -End Function +Sub validate(ByVal rowNum As Long, ByVal lastDataRow As Long) + Set ws = Me -Sub validateDetailData(ByVal ws As Worksheet, ByVal rowNum As Long) - ' Check C column not empty - If Trim(ws.Cells(rowNum, 3).Value) = "" Then - ws.Cells(rowNum, 19).ClearContents - Exit Sub - End If - - ' Check G, H required and numeric (for composite key) - If Trim(ws.Cells(rowNum, 9).Value) = "" Or Not IsNumeric(ws.Cells(rowNum, 9).Value) Then - ws.Cells(rowNum, 19).Value = "G column (I) is required and must be numeric" - Exit Sub - End If - - If Trim(ws.Cells(rowNum, 10).Value) = "" Or Not IsNumeric(ws.Cells(rowNum, 10).Value) Then - ws.Cells(rowNum, 19).Value = "H column (J) is required and must be numeric" - Exit Sub - End If - - ' Check I (K column) required - If Trim(ws.Cells(rowNum, 11).Value) = "" Then - ws.Cells(rowNum, 19).Value = "I column (K) is required" - Exit Sub - End If - - ' Check J, K required and numeric - If Trim(ws.Cells(rowNum, 12).Value) = "" Or Not IsNumeric(ws.Cells(rowNum, 12).Value) Then - ws.Cells(rowNum, 19).Value = "J column (L) is required and must be numeric" - Exit Sub - End If - - If Trim(ws.Cells(rowNum, 13).Value) = "" Or Not IsNumeric(ws.Cells(rowNum, 13).Value) Then - ws.Cells(rowNum, 19).Value = "K column (M) is required and must be numeric" - Exit Sub - End If - - ' Check L-P optional but must be numeric if entered - Dim col As Long - Dim colName As String - Dim colLetter As String - colLetter = "NOPQR" - - For col = 14 To 18 - If Trim(ws.Cells(rowNum, col).Value) <> "" And Not IsNumeric(ws.Cells(rowNum, col).Value) Then - colName = Mid(colLetter, col - 13, 1) - ws.Cells(rowNum, 19).Value = colName & " column must be numeric" + Dim clearRange As Range + Set clearRange = ws.Range(ws.Cells(rowNum, START_COL), ws.Cells(rowNum, END_COL)) + clearRange.Interior.Color = vbWhite + + ' Check column required + Dim colLetter As Variant + For Each colLetter In Array("C", "I", "J", "K") + If Trim(ws.Range(colLetter & rowNum).Value) = "" Then + ws.Cells(rowNum, ERROR_COL).Value = colLetter & " column is required" + ws.Range(colLetter & rowNum).Interior.Color = RGB(255, 0, 0) + Exit Sub + End If + Next colLetter + + ' Check column numeric (only if has value) + Dim numericCols As Variant: numericCols = Array("L", "M", "N", "O", "P", "Q", "R") + Dim col As Variant + For Each col In numericCols + Dim val As String: val = Trim(ws.Range(col & rowNum).Value & "") + If val <> "" And Not IsNumeric(val) Then + ws.Cells(rowNum, ERROR_COL).Value = col & " column must be numeric" + ws.Range(col & rowNum).Interior.Color = RGB(255, 0, 0) Exit Sub End If Next col - - ' Check GH composite key duplicate - Dim g As String, h As String - Dim r As Long - Dim lastRow As Long - - g = Trim(ws.Cells(rowNum, 9).Value) - h = Trim(ws.Cells(rowNum, 10).Value) - - lastRow = ws.Cells(ws.Rows.Count, 3).End(xlUp).Row - - For r = 7 To lastRow - If r <> rowNum And Trim(ws.Cells(r, 3).Value) = Trim(ws.Cells(rowNum, 3).Value) Then - If Trim(ws.Cells(r, 9).Value) = g And Trim(ws.Cells(r, 10).Value) = h Then - ws.Cells(rowNum, 19).Value = "GH (I,J) combination already exists" - Exit Sub - End If - End If - Next r - - ' Validation passed - ws.Cells(rowNum, 19).ClearContents + + ' Check C column in the cache + If m1Cache Is Nothing Then Call RefreshM1Cache + Dim dValue As String: dValue = Trim(ws.Range("C" & rowNum).Value) + + If Not m1Cache.Exists(dValue) Then + ws.Cells(rowNum, ERROR_COL).Value = "C column does not exist in M1." + ws.Range("C" & rowNum).Interior.Color = RGB(255, 0, 0) + Exit Sub + End If + + ' Check I column in the kenshuKbn + Dim kenshuKbn As Variant: kenshuKbn = Array("1", "2", "3") + Dim iValue As String: iValue = Trim(ws.Range("I" & rowNum).Value) + If UBound(Filter(kenshuKbn, iValue)) = -1 Then + ws.Cells(rowNum, ERROR_COL).Value = "I column (kenshuKbn) must be 1, 2, or 3" + ws.Range("I" & rowNum).Interior.Color = RGB(255, 0, 0) + Exit Sub + End If + End Sub ' Button macro (Validate selected row) -Sub validateDetailDataButton() - Dim ws As Worksheet - Dim lastRow As Long - Dim r As Long - Dim errorCount As Long - - Set ws = ActiveSheet - lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row - - If lastRow < 7 Then +Sub M2_validateButton() + Dim lastDataRow As Long, r As Long, errorCount As Long + lastDataRow = GetLastDataRowInRange(Me, START_COL, END_COL) + + If lastDataRow < 7 Then MsgBox "No data found.", vbExclamation Exit Sub End If - - errorCount = 0 - For r = 7 To lastRow - Call validateDetailData(ws, r) - If Trim(ws.Cells(r, 17).Value) <> "" Then + + For r = 7 To lastDataRow + Validate r, lastDataRow + If Trim(Cells(r, ERROR_COL).Value) <> "" Then errorCount = errorCount + 1 End If Next r - - MsgBox "Validation complete. Errors: " & errorCount & ", ", vbInformation + + MsgBox "Validation complete. Errors: " & errorCount, vbInformation End Sub -Sub ExportMasterDetailData() - Dim ws As Worksheet - Set ws = ActiveSheet - - Dim lastDataRow As Long - lastDataRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row - +Sub M2_Export() + Dim lastDataRow As Long: lastDataRow = GetLastDataRowInRange(Me, START_COL, END_COL) If lastDataRow < 7 Then MsgBox "No data rows to output.", vbExclamation Exit Sub End If - - Dim savePath As String - savePath = Application.GetSaveAsFilename( _ - FileFilter:="CSV Files (*.csv), *.csv", _ - Title:="Save CSV") - - If savePath = "False" Then Exit Sub - If InStr(1, savePath, ".csv", vbTextCompare) = 0 Then - savePath = savePath & ".csv" - End If - - ' Build header from row 5 (columns C, G-P) - Dim csvContent As String - csvContent = Trim(ws.Cells(5, 3).Value) - Dim j As Long - For j = 7 To 16 - csvContent = csvContent & "," & Trim(ws.Cells(5, j).Value) - Next j - csvContent = csvContent & vbLf - - ' Row counter - Dim rowCount As Long - rowCount = 0 - - ' Data: C,G,H,I,J,K,L,M,N,O,P (skip D,E,F) - Dim r As Long + + ' === Step 1: Validate all rows before export === + Dim ws As Worksheet: Set ws = Me + Dim r As Long, errorCount As Long For r = 7 To lastDataRow - If Len(Trim(ws.Cells(r, 3).Value & "")) > 0 Then - rowCount = rowCount + 1 - ' CSV col1 -> C column - csvContent = csvContent & CleanCSVField(ws.Cells(r, 3).Value) - ' CSV col2-11 -> I-R column - For j = 9 To 18 - csvContent = csvContent & "," & CleanCSVField(ws.Cells(r, j).Value) - Next j - csvContent = csvContent & vbLf + Call validate(r, lastDataRow) + If Trim(ws.Cells(r, ERROR_COL).Value) <> "" Then + errorCount = errorCount + 1 End If Next r - - ' Trim trailing empty lines - Do While Right(csvContent, 1) = vbLf - csvContent = Left(csvContent, Len(csvContent) - 1) - Loop - - ' Write file - Dim stream As Object - Set stream = CreateObject("ADODB.Stream") - stream.Type = 2 - stream.Charset = "shift_jis" - stream.Open - stream.WriteText csvContent, 1 - stream.SaveToFile savePath, 2 - stream.Close - + + If errorCount > 0 Then + MsgBox "Validation failed. Found " & errorCount & " error(s). Please correct them before exporting.", vbCritical + Exit Sub + End If + + ' === Step 2: Select save path === + Dim savePath As String: savePath = GetSaveCSVPath() + If savePath = "" Then Exit Sub + + ' === Step 3: Count data rows === + Dim rowCount As Long: rowCount = lastDataRow - 6 + + ' === Step 4: Build array with header and data === + Dim headerArr As Variant + Dim colLetters As Variant: colLetters = HEADERS() + headerArr = GetCSVHeader(ws, colLetters, M2_HEADER_ROW) + + Dim outputArr As Variant + ReDim outputArr(1 To rowCount + 1, 1 To 11) + + ' Row 1: header + Dim colIdx As Long + For colIdx = 0 To 10 + outputArr(1, colIdx + 1) = headerArr(1, colIdx + 1) + Next colIdx + + ' Rows 2+: data (C, I-R columns) + Dim dataRow As Long: dataRow = 2 + For r = 7 To lastDataRow + For colIdx = 0 To 10 + outputArr(dataRow, colIdx + 1) = CleanCSVField(ws.Cells(r, Columns(colLetters(colIdx)).Column).Value) + Next colIdx + dataRow = dataRow + 1 + Next r + + On Error GoTo ExportError + Call WriteCSVFromArray(savePath, outputArr, "shift_jis", False) + On Error GoTo 0 + MsgBox "CSV export completed. Total data rows: " & rowCount, vbInformation + Exit Sub + +ExportError: + MsgBox "CSV export failed: " & Err.Description, vbExclamation + +End Sub + +Sub M2_SortDataRowsByC() + Call SortDataRows(3) +End Sub + +Sub M2_ToggleAutoFilter() + Call ToggleAutoFilter(START_COL, END_COL) +End Sub + +Sub M2_AutoFitColumnWidth() + Call AutoFitColumnWidth(START_COL, END_COL) End Sub \ No newline at end of file diff --git a/通勤手当テンプレート_案.xlsm b/通勤手当テンプレート_案.xlsm index 49bbad1797d4d9580e2d1868ec841d4ccf077ca1..08ad2225b3a8abf95eaec249d8763eb32bf937a5 100644 GIT binary patch delta 258864 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