作成動機
AIプロンプトを投げる時にExcelの表を付けたい時があります。
AIなので画像にして添付でもいいのですが、時々上手く読み取ってくれないのと、表が多いといちいち画像にするのが面倒なので、プロンプトで扱えるMarkdown形式に変換できないかと思い作成しました。
その際、セル結合されている表が多々あったため、これにも対応できるようにしました。
変換コード
Excel方眼紙に作成された表に対応できていなかったので、修正しました。(2026/4/21)
修正点:
- 最終列判定を列数から有効列数(見出しのデータ個数)に変更
- 空行判定を追加
'********************************************************************************
' Excel表をMarkdown形式に変換
' ●見出しには空欄がない前提
' ●結合セルに対応(先頭セル以降は空欄になる)
' 使用方法:
' 1.変換したい表を選択
' 2.本マクロを実行
'********************************************************************************
Sub ConvertExcel2Markdown()
Dim ash As Worksheet
Dim tarRng, ttlRng, rng As Range
Dim arrMd, arrTtl As Variant
Dim stRow, enRow, stCol, enCol As Long
Dim lpRow, lpCol, rowIdx, colIdx As Long
Dim rowStr, algnStr, mdStr As String
Dim sp As String
Dim cntCol, dtIdx As Long
Dim empRow As String
'-- 初期設定
Set ash = ActiveSheet '-- 対象シート
Set tarRng = Selection '-- 変換対象の表
Set ttlRng = tarRng.Resize(1, tarRng.Columns.Count) '-- 対象表の見出し行
ReDim arrTtl(1 To ttlRng.Columns.Count) '-- 見出し格納用配列
ReDim arrMd(1 To tarRng.Rows.Count + 1) '-- 変換結果格納配列(書式設定分を追加している)
sp = "|" '-- 区切り文字
stRow = tarRng.Item(1, 1).Row '-- 対象表の開始行
stCol = tarRng.Item(1, 1).Column '-- 対象表の開始列
enRow = tarRng.Item(tarRng.Count).Row '-- 対象表の最終行
enCol = tarRng.Item(tarRng.Count).Column '-- 対象表の最終列
rowIdx = 1 '-- 行番号指定用変数
algnStr = sp '-- セルの水平位置指定用変数(初期値:"|")
cntCol = 0 '-- 有効列データ数
'-- Markdown変換
For lpRow = stRow - 1 To enRow
rowStr = "" '-- 行データ格納用変数
dtIdx = 0 '-- 行データカウンタ
empRow = "" '-- 空行判定用変数
For lpCol = stCol To enCol
colIdx = lpCol - stCol + 1
If lpRow = stRow - 1 Then
'-- 表の書式設定取得
Set rng = ash.Cells(stRow, lpCol)
If rng.Value <> "" Then
Select Case rng.HorizontalAlignment
Case xlLeft, xlGeneral
'-- 左揃え、標準
algnStr = algnStr & " :-- " & sp
Case xlCenter
'-- 中央揃え
algnStr = algnStr & " :-: " & sp
Case xlRight
'-- 右揃え
algnStr = algnStr & " --: " & sp
End Select
arrTtl(colIdx) = rng.Value '-- 見出しデータ格納
cntCol = cntCol + 1 '-- 列データ数インクリメント
End If
Else
'-- 表のデータ取得
Set rng = ash.Cells(lpRow, lpCol)
If arrTtl(colIdx) <> "" Then
'-- 見出しデータがある列を対象
dtIdx = dtIdx + 1 '-- カウンタインクリメント
rowStr = rowStr & " " & rng.Value & " " & sp '-- 表データ取得
'' If lpCol = enCol Then '<-- 最終列判定を変更
If dtIdx = cntCol Then '<-- 最終有効列になったら実行
'-- 最終列に来た時の処理
'-- 空行判定
empRow = Replace(rowStr, sp, "") '-- 区切り文字を削除
empRow = Replace(empRow, " ", "") '-- *半角スペース2個を削除
'-- * 2個をまとめて削除することで、半角スペース1個のみの行は空行でないと判定できる。
If empRow <> "" Then
arrMd(rowIdx) = sp & rowStr '-- 行データを配列に格納
If lpRow = stRow Then
'-- 先頭行の時は書式設定行を一緒に追加
arrMd(rowIdx + 1) = arrMd(rowIdx + 1) & algnStr
rowIdx = rowIdx + 2 '-- 行を1つ飛ばしでインクリメント
Else
rowIdx = rowIdx + 1 '-- 行インクリメント
End If
End If
End If
End If
End If
Next lpCol
Next lpRow
'-- 結果出力
mdStr = Join(arrMd, vbLf) '-- 配列の要素を改行文字(vbLf)で結合
Debug.Print mdStr
End Sub
注)結果出力方式は本題と直接関係ないので、イミディエイトウィンドウへの出力でごまかしてしまいました。。。セルへ出力、テキストファイル出力など、ご使用の環境に応じて追加してご使用ください。
本コードの特徴
- 結合セルに対応
結合セルがあっても変換可能です。変換の際、先頭セル以外は空欄になります。 - 任意のブックの表を変換可能
変換したい表があるブックから選択できます。
使用方法
- Markdown形式に変換したい表(任意のブックでもOK)を選択する。
- 本マクロを実行する。
注)見出し行には空欄はない前提です。もし見出し行に空欄がある場合は、スペースなど適当な値を入力してご使用ください。
見出し行に結合セルがある場合、そのままだと先頭列以外はSkipされるので、セル結合を解除し、適当な値を入力してください。
→修正版で見出し行の結合セルに対応しました。
変換結果
上の表が、以下のように出力されました。dt11とdt31は結合セルに入力されたデータですが、結合セルにも対応できています。
結合セルは、先頭セル以外のセルは空欄となって出力されます。
| No | col1 | col2 | col3 |
| :-- | :-- | :-: | --: |
| 1 | dt11 | | dt13 |
| 2 | dt21 | dt22 | dt23 |
| 3 | dt31 | dt32 | dt33 |
| 4 | | dt42 | dt43 |
| 5 | dt51 | dt52 | dt53 |
なお、元データに|が含まれるとうまく変換できませんが、実用上|が入っているデータに遭遇したことはないので非対応としています。
rowStrかrng.ValueにReplaceを嚙ませれば対応可能と思います。もしそのようなケースに遭遇された場合はお試しください。
追記(2026/4/21)
下図のような、Excel方眼紙にセル結合で作成された表に対応できていなかったので修正しました。

結果は以下のようになりました。空行を詰めているので余計な改行が下に付いてきますが、有効な部分だけコピペすれば実用上の問題は少ないかと思います。
| No | 商品 | 価格 |
| :-: | :-: | :-: |
| 1 | りんご | 200 |
| 2 | バナナ | 300 |
| 3 | メロン | 600 |
| 4 | ゴーヤ | 250 |
| 5 | セロリ | 120 |
関連記事
きっと車輪の再発明かと思い、調べてみるとやはり同じことをお考えの方がいらっしゃいました。
こちらは結合セルには対応していなそうですが、GAS移植版も掲載されているので実用度は高そうです。
