diff --git a/機能仕様書作成.xlsm b/機能仕様書作成.xlsm index c9ffb9c..aa953ff 100644 Binary files a/機能仕様書作成.xlsm and b/機能仕様書作成.xlsm differ diff --git a/機能仕様書作成/Module1.bas b/機能仕様書作成/Module1.bas new file mode 100644 index 0000000..a16397b --- /dev/null +++ b/機能仕様書作成/Module1.bas @@ -0,0 +1,193 @@ +Attribute VB_Name = "Module1" +Option Explicit + +Sub ExportCustomizeFunctionsToMarkdownFile() + + Dim ws As Worksheet + Set ws = Worksheets("カスタマイズ機能") + + Dim lastRow As Long + lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row + + Dim md As String + Dim funcCounter As Long + funcCounter = 1 + + ' 種別ごとの最後の挿入位置 + Dim categoryPos As Object + Set categoryPos = CreateObject("Scripting.Dictionary") + + ' 一覧表用(機能ID単位で集約) + ' value = 機能名 || 対応要件ID(
連結) + Dim summary As Object + Set summary = CreateObject("Scripting.Dictionary") + + Dim r As Long + + Dim headerCell As Range + Dim startRow As Long + + md = md & "# " & Trim(ws.Cells(2, "C").Value) & vbCrLf & vbCrLf + + Set headerCell = ws.Columns("D").Find( _ + What:="機能名", _ + LookAt:=xlWhole, _ + LookIn:=xlValues) + + If headerCell Is Nothing Then + MsgBox "「機能名」という見出しが見つかりません。", vbCritical + Exit Sub + End If + + startRow = headerCell.Row + 1 + + For r = startRow To lastRow + ' ここに既存の処理 + + + Dim category As String + Dim funcName As String + Dim funcID As String + Dim insertPos As Long + + category = Trim(ws.Cells(r, "C").Value) + funcName = Trim(ws.Cells(r, "D").Value) + funcID = "SRQ_FUN_" & Format(funcCounter, "000") + + '======================== + ' 種別見出し処理 + '======================== + If categoryPos.exists(category) Then + insertPos = categoryPos(category) + Else + md = md & "## " & category & vbCrLf & vbCrLf + insertPos = Len(md) + categoryPos.Add category, insertPos + End If + + '======================== + ' 機能ブロック生成 + '======================== + Dim block As String + block = "### " & funcName & " " & funcID & vbCrLf & vbCrLf + block = block & "#### 対応要件" & vbCrLf + + '======================== + ' B列:対応要件ID(vbLf確定) + '======================== + Dim reqText As String + reqText = ws.Cells(r, "B").Value + reqText = Replace(reqText, vbCrLf, vbLf) + reqText = Replace(reqText, Chr(13), vbLf) + + Dim reqArr As Variant + reqArr = Split(reqText, vbLf) + + Dim i As Long + Dim reqForTable As String + reqForTable = "" + + For i = LBound(reqArr) To UBound(reqArr) + If Trim(reqArr(i)) <> "" Then + block = block & "* " & Trim(reqArr(i)) & vbCrLf + If reqForTable <> "" Then reqForTable = reqForTable & "
" + reqForTable = reqForTable & Trim(reqArr(i)) + End If + Next i + + block = block & vbCrLf & "#### 機能概要" & vbCrLf + + '======================== + ' E列:機能概要 + '======================== + Dim descText As String + descText = ws.Cells(r, "E").Value + descText = Replace(descText, vbCrLf, vbLf) + descText = Replace(descText, Chr(13), vbLf) + + Dim descArr As Variant + descArr = Split(descText, vbLf) + + For i = LBound(descArr) To UBound(descArr) + + If Trim(descArr(i)) <> "" Then + + Dim indentLevel As Long + Dim lineText As String + Dim ch As String + Dim pos As Long + Dim indentPrefix As String + + indentLevel = 0 + lineText = descArr(i) + + ' 先頭のスペース/矢印をカウント + For pos = 1 To Len(lineText) + ch = Mid(lineText, pos, 1) + If ch = " " Or ch = " " Or ch = "→" Then + indentLevel = indentLevel + 1 + Else + Exit For + End If + Next pos + + ' 先頭記号を除去 + lineText = Mid(lineText, indentLevel + 1) + + ' Markdown 用インデント(1レベル = 半角2スペース) + indentPrefix = String(indentLevel * 2, " ") + + block = block & indentPrefix & "* " & Trim(lineText) & vbCrLf + End If + + Next i + + block = block & vbCrLf + + '======================== + ' Markdownへ挿入 + '======================== + md = Left(md, insertPos) & block & Mid(md, insertPos + 1) + categoryPos(category) = insertPos + Len(block) + + '======================== + ' 一覧表データ登録(1機能1行) + '======================== + summary.Add funcID, funcName & "||" & reqForTable + + funcCounter = funcCounter + 1 + + Next r + + '======================== + ' 一覧表出力 + '======================== + md = md & "---" & vbCrLf & vbCrLf + md = md & "## 機能ID・対応要件一覧" & vbCrLf & vbCrLf + md = md & "| 機能ID | 機能名 | 対応要件ID |" & vbCrLf + md = md & "|--------|--------|------------|" & vbCrLf + + Dim key As Variant, vals As Variant + For Each key In summary.Keys + vals = Split(summary(key), "||") + md = md & "| " & key & " | " & vals(0) & " | " & vals(1) & " |" & vbCrLf + Next key + + '======================== + ' Markdownファイル出力 + '======================== + Dim fso As Object, file As Object + Set fso = CreateObject("Scripting.FileSystemObject") + + Dim path As String + path = ThisWorkbook.path & "\CustomizeFunctions.md" + + Set file = fso.CreateTextFile(path, True, True) ' UTF-8 + file.Write md + file.Close + + MsgBox "Markdownファイルを出力しました:" & vbCrLf & path, vbInformation + +End Sub + +