Option Explicit
Sub CellToBacklogTable()
'------------------------------------------------------------------------------
' 選択した範囲を Backlog用Markdownのテーブル に変換して出力する
' [出力]
' 方法1. イミディエイトウィンドウに出力
' 方法2. Windows用のメモ帳への受け渡しは変数かつクリップボード経由
'(どちらもデータがあまりに多いのが推奨できない方式のため、1000 セル以上選択されていると中断)
'
'------------------------------------------------------------------------------
'出力先('1:イミディエイトウィンドウ、2:Windowsメモ帳)
Const lngOutputFlag = 1
'インデントいれたいときに設定(0はなし、1でスペース4つ、2でスペース8つ…。インデントが有効なのは箇条書きの次の段落)
Const lngIndentCount As Long = 0
'改行コード(Windows/vbCrLf or vbLf)
Const strTextLS = vbLf
Dim MsgRtn As String 'メッセージボックスの返り値
Dim wkRng As Range '選択範囲記憶
Dim strText As Variant '出力データ
Dim i As Long
Dim r As Long, c As Long
Dim rowSt As Long, rowEd As Long, colSt As Long, colEd As Long
Dim strIndent As String
Dim strTagLine As String
'Markdown文字列
Const strTagTrSt As String = "| "
Const strTagTrMd As String = " | "
Const strTagTrEd As String = " |"
Const strTagLineLeft As String = "----"
Const strTagLineCenter As String = ":----:"
Const strTagLineRight As String = "----:"
'開始メッセージ
MsgRtn = MsgBox("選択している範囲が出力されます。処理を開始しますか?" & vbCrLf & vbCrLf & _
"・見出し行は1行固定です。(出力されたコードを編集してね)" & vbCrLf & _
"・セル結合は無視されます。(出力されたコードを編集してね)" & vbCrLf & _
"・セル内改行は
タグに置換されます。", _
vbOKCancel + vbInformation, Title:="Backlog (Markdown記法) テーブル 出力")
If MsgRtn = vbCancel Then Exit Sub
'インデント幅計算
If lngIndentCount = 0 Then
strIndent = ""
Else
strIndent = String(lngIndentCount * 4, " ")
End If
'選択範囲に値があるか確認(値がなければ終了)
If WorksheetFunction.CountA(Selection) = 0 Then
Exit Sub
End If
'出力先チェック
If lngOutputFlag = 1 Or lngOutputFlag = 2 Then
Else
Exit Sub
End If
'選択範囲を記憶
Set wkRng = Selection
If Selection.Count > 200 Then
MsgRtn = MsgBox("セルが200個以上選択されていますが、実行しますか?" & vbCrLf & vbCrLf, _
vbOKCancel + vbInformation + vbDefaultButton2, Title:="確認")
If MsgRtn = vbCancel Then Exit Sub
ElseIf Selection.Count > 1000 Then
MsgRtn = MsgBox("セルが1000個以上選択されているので、中断します。" & vbCrLf & vbCrLf & _
vbExclamation + vbInformation, Title:="中断")
Exit Sub
End If
'列と行を取得
rowSt = Selection(1).Row
rowEd = Selection(Selection.Count).Row
colSt = Selection(1).Column
colEd = Selection(Selection.Count).Column
'セル内容を出力
For r = rowSt To rowEd
strText = strText & strIndent & strTagTrSt
For c = colSt To colEd
'右端ではない列
If c <> colEd Then
strText = strText & Replace(Cells(r, c).Text, vbLf, "
") & strTagTrMd
'右端の列
Else
strText = strText & Replace(Cells(r, c).Text, vbLf, "
") & strTagTrEd & strTextLS
End If
Next c
'1行目が出力された直後に見出し行とデータ行を分けるための線を出力
If r = rowSt And rowEd > rowSt Then
strText = strText & strIndent & strTagTrSt
For c = colSt To colEd
strTagLine = strTagLineLeft
If c <> colEd Then
strText = strText & strTagLine & strTagTrMd
Else
strText = strText & strTagLine & strTagTrEd & strTextLS
End If
Next c
End If
Next r
strText = strText & strTextLS
If lngOutputFlag = 1 Then
Debug.Print strText
ElseIf lngOutputFlag = 2 Then
'クリップボードに格納
With CreateObject("Forms.TextBox.1")
.MultiLine = True
.Text = strText
.SelStart = 0
.SelLength = .TextLength
.Copy
End With
'待ち(処理が追い付かない場合、調整)
Application.Wait Now() + TimeValue("00:00:03")
'メモ帳起動
Shell "notepad", 1
'待ち(処理が追い付かない場合、調整)
Application.Wait Now() + TimeValue("00:00:02")
'メモ帳に貼り付け
SendKeys "^V", True
End If
'元の選択範囲を選ぶ
wkRng.Select
End Sub