Excelの表を「表組するコード」に変換するマクロ

はてなブログExcel で作成した表を載せたい、と思うことがある。例えば、このような表。
f:id:Infoment:20181011060944p:plain

今までは、良く判らないという理由で避けていたが、今日は表の作成に挑戦する。
f:id:Infoment:20181011062608p:plain

今日やりたいこと

Excel で作成した表を、はてなブログに載せたい。

必要なこと

  1. はてなブログに表を作成する方法調べ
  2. マクロでExcelの表をコードに変換

1.はてなブログに表を作成する方法調べ

調べてみると、「HTMLで表組コードを書く」という作業が必要らしい。このあたり全く経験がなく、先の表現が正しいかどうかも危うい。とにかく、書いてみるとこのようになる。

<table>
    <tr>
        <th>品名</th>
        <th>単価</th>
    </tr>
    <tr>
        <td>りんご</td>
        <td>100</td>
    </tr>
    <tr>
        <td>みかん</td>
        <td>200</td>
    </tr>
    <tr>
        <td>ばなな</td>
        <td>300</td>
    </tr>
</table>

結果は、以下の通り。

品名 単価
りんご 100
みかん 200
ばなな 300

なるほど、こうすれば書けることは分かった。一行ずつ手打ちした。果てしなく面倒くさい。

これでも書けるらしい。

|品名|単価|
|りんご|100|
|みかん|200|
|ばなな|300|

しかし、ヘッダー部分がデータ部分と同じ書式になってしまい、少し物足りない(書式を変える方法はあるようだ)。これも一行ずつ手打ちしたが、Excelで作成してこちらで入力して、二度手間感が否めない。

品名 単価
りんご 100
みかん 200
ばなな 300

そこで、Excel の表をHTMLコードに変換するマクロを作成してみた。

2.マクロでExcelの表をコードに変換

手順としては、以下の通り。

  1. コレクションを一つ準備する。
  2. 表を一行ずつHTMLコードに書き換えて、コレクションに追加。
  3. コレクションを配列に変換。
  4. 配列を改行で結合して、クリップボードに貼り付け。
  5. はてなブログの編集画面でCtrl +V
【標準モジュール】

表を選択して、以下を実行する。
※表の範囲を引数としている。

Sub NoteTable(myRng As Range)

    Dim col As Collection
    Set col = New Collection
        col.Add "<table>"
    
    Dim i As Long
    Dim r As Range
        For i = 1 To myRng.Rows.Count
            col.Add vbTab & "<tr>"
            For Each r In myRng.Rows(i).Cells
                Select Case i
                    Case 1
                        col.Add vbTab & vbTab & "<th>" & r & "</th>"
                    Case Else
                        col.Add vbTab & vbTab & "<td>" & r & "</td>"
                End Select
            Next
            col.Add vbTab & "</tr>"
        Next
        col.Add "</table>"
        
    Dim SQC As SequenceClass
    Set SQC = New SequenceClass
    Dim seq As Variant
        seq = SQC.ToArray(col)
        Debug.Print Join(seq, vbNewLine)

    Dim ClipBoad As DataObject
    Set ClipBoad = New DataObject
    
    ClipBoad.SetText Join(seq, vbNewLine)
    ClipBoad.PutInClipboard

End Sub
【クラスモジュール】(SeaquenceClass)

コントロールを配列に変換。以前にも掲載したが再掲する。

Public Function ToArray(col As Collection) As Variant

    Dim seq As Variant
    ReDim seq(col.Count - 1)
    Dim c As Variant
    Dim i As Long
        i = 0
        For Each c In col
            seq(i) = c
            i = i + 1
        Next
    
    ToArray = seq

End Function

結果

簡単に表を作成することが出来た。

品名 単価
りんご 100
みかん 200
ばなな 300

恐らく、もっといい方法もあるのだろう。色々なパターンでのテストも必要だ。
これから模索する。

参考まで。