ブログを書いていて表形式でデータを表示したいとき、Tableタグを使って表を作る。ただ、Tableタグで表を手書きで作るのは面倒。あらかじめExcelで作っておいた表をそのままTableタグできると楽だ。
ということでExcel VBAを使ってTableタグをクリップボードにコピーするマクロを作ってみた。
Sub ExcelToHtmlTable()
' Microsoft Forms 2.0 Object Libraryを使用
' VBAのエディタで「ツール」→「参照設定...」で [参照] ボタンをクリックし、「FM20.DLL」ファイルを選択する。
Dim selectRowIndex, selectColumnIndex, selectColumnStart, selectColumnEnd, startRow As Integer
Dim resultHtml As String
startRow = Selection(1).Row
selectColumnStart = Selection(1).Column
selectColumnEnd = Selection(Selection.Count).Column
resultHtml = "<table>" + vbCrLf
For selectRowIndex = Selection(1).Row To Selection(Selection.Count).Row
If selectRowIndex = startRow Then
resultHtml = resultHtml + vbTab + "<thead>" + vbCrLf
Else
resultHtml = resultHtml + vbTab + "<tbody>" + vbCrLf
End If
resultHtml = resultHtml + vbTab + vbTab + "<tr>" + vbCrLf
For selectColumnIndex = selectColumnStart To selectColumnEnd
If selectRowIndex = startRow Then
resultHtml = resultHtml + vbTab + vbTab + vbTab + "<th>" + Cells(selectRowIndex, selectColumnIndex).Text + "</th>" + vbCrLf
Else
resultHtml = resultHtml + vbTab + vbTab + vbTab + "<td>" + Cells(selectRowIndex, selectColumnIndex).Text + "</td>" + vbCrLf
End If
Next selectColumnIndex
resultHtml = resultHtml + vbTab + vbTab + "</tr>" + vbCrLf
If selectRowIndex = startRow Then
resultHtml = resultHtml + vbTab + "</thead>" + vbCrLf
End If
Next selectRowIndex
resultHtml = resultHtml + vbTab + "</tbody>" + vbCrLf + "</table>"
With New MSForms.DataObject
.SetText resultHtml
.PutInClipboard
End With
MsgBox "クリップボードにコピーしました。", vbOKOnly + vbInformation, "テーブルデータ"
End Sub
このブックを保存する場合、ファイルの種類を「Excel マクロ有効ブック(*.xlsm)」にする必要がある。
また、コメントでも書いているがMicrosoft Forms 2.0 Object Libraryを利用するため、参照設定でFM20.DLLを選択しておく必要がある。これがないとクリップボードへの操作が行えないのだ。
クリップボードへの操作が不要であるなら「With New MSForms.DataObject」あたりを改造することで好きなようにできる。テキストファイルに落とすもよし、別シートに張り付けるもよし。
macOSの場合はいいツールがあるのでこれを使うといい。
AppleScriptで動作するExcelの表をHTMLのTableに変換するツールだ。