【Excel/VBA のこと 12】
私は、Excel で仕事をすることが多いためか、
表(テーブル)を使ってまとめるのが好きです。
比較するものの数が少なくても、Excelで表にして、
メールに貼り付けて、報告します。
表を使った方が見やすいだろう と思うことがあるので、
過去の記事でも少しだけ、表を使っています。
このブログは、はてなブログですが、
Excel で作成した表をそのまま貼り付けることはできず、
HTMLでテーブルを作成する必要があるのでちょっと大変です。
Excel のように簡単にはできません。
そこで、Excel で表を作成して、HTMLの記述に変換するマクロを考えました。
Excel で表を作成したら、あとはブログのHTML編集にコピペするだけです。
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
HTMLのテーブルのタグ
HTMLで表を作成するためには、以下のように記述します。
<Table>・・・ここからテーブル(表)が始まります。
<Tr>・・・行の一列目がここから始まります。(Table Row の略かな?)
<Td>・・・実際のデータを入力します。(Table Data の略かな?)
</Td>・・・<Td> を閉めます。(一つの箱に入れるデータはここまで)
</Tr>・・・<Tr>を閉めます。(列はここまで)
</Table>・・・テーブルはここまでです。
青字の部分が HTML タグと呼ばれるもので、
テーブルを作成する最低限必要なものです。
上記の場合は、一行一列なので、一つの箱だけ作られます。
こんな感じ↓
データ |
Excelシートの準備
やりたいことは、表を Excel で作成して、
その表をHTMLの記述に変換して、ブログにコピーする です。
まずは、以下のように、Excel のシートを設定しました。
セルC2 以降にマクロで作成したHTMLの記述を記述する と決めました。
表は、列C 以外のどの場所に作成してもOK。
たぶん、なんとなく赤点線くらいの範囲です。
試しに、小学生の算数にでてきそうな表を作ってみました。
作成したら、その範囲を選択。
そしてマクロを実行します。
マクロ
標準モジュールに記述してくださいね。
どんな Excel ファイルでも実行できるようにしたい場合は、
個人用マクロブックの標準モジュールに記述してください。
***************************************************************************
Sub CreateTable()
Dim HLastR As Long 'HTML記述用に使用
Dim FirstCol As Long
Dim LastCol As Long
Dim TotalCells As Long
Dim i As Long
TotalCells = Selection.Count '選択された範囲の総セル数
FirstCol = Selection(1).Column '先頭列
LastCol = Selection(Selection.Count).Column '最終列
'セルが1つしか選択されていない場合はメッセージを表示して、終了
If TotalCells = 1 Then
MsgBox "表が選択されていません。終了します。"
End 'マクロを終了させます
End If
'列Cを空欄にする
Columns(3).ClearContents
Cells(2, 3) = "<table>" 'C2から書き始める
For i = 1 To TotalCells
'最終行を取得する。「Ctrl+↑キー」と同じ動き
HLastR = Cells(Rows.Count, 3).End(xlUp).Row + 1
'Selection(i)の列が、先頭列と同じ場合<tr>を記述する
If Selection(i).Column = FirstCol Then
Cells(HLastR, 3) = "<tr>"
End If
HLastR = Cells(Rows.Count, 3).End(xlUp).Row + 1 '最終行を取得する
Cells(HLastR, 3) = "<td>" & Selection(i) & "</td>" '実際のデータ
HLastR = Cells(Rows.Count, 3).End(xlUp).Row + 1 '最終行を取得する。
'Selection(i)の列が、最終列と同じ場合</tr>を記述する
If Selection(i).Column = LastCol Then
Cells(HLastR, 3) = "</tr>"
End If
Next i
HLastR = Cells(Rows.Count, 3).End(xlUp).Row + 1 '最終行を取得する
Cells(HLastR, 3) = "</table>" '最後にテーブルを閉める
Range(Cells(2, 3), Cells(HLastR, 3)).Copy 'HTMLの記述をコピーする
End Sub
***************************************************************************
ポイントは、以下で使用している、赤字のところ
TotalCells = Selection.Count '選択された範囲の総セル数
FirstCol = Selection(1).Column '先頭列
LastCol = Selection(Selection.Count).Column '最終列
Selection.Count で、選択している範囲のセルの数を数えます。
表の左上からスタートして、右に進み、最終列まで行ったら
2行目に移り、左から数えていきます。
Selection(1) は、下表の場合は 「果物名」
Selection(8) は、「130」(みかんの値段)を表します。
Selection(1).Column は、最初のセルの列を取得できます。
(「果物名」の列の 「E」、または、「5」)
つまり、表の先頭列を、取得できるのです。
Selection(Selection.Count).Column で、選択されているセルを数えて、
その範囲の列数を取得できます。
これで、どの列から初めて、何列分処理を繰り返す
というマクロが書けます。
注意が必要なところは、HTMLを記述するたびに、
最終行を再取得していかなければなりません。
一度だけしか、最終行を取得しないと、どんどん上書きされ、
最終的に </table> しか残りません。
このマクロを実行すると、こんな結果になります。
最後にHTMLを記述したセルをコピーするようにしたので、
Range(Cells(2, 3), Cells(HLastR, 3)).Copy
後は、はてなブログのHTML編集に張り付けるだけ。
貼り付けて・・・
「編集見たまま」に、移動してみると、こんな感じで表が作成できました。
ここまでできれば、色や、中央揃えなどはそんなに大変ではないので、
ネット検索で編集してください。
果物名 | 値段 | 個数 |
リンゴ | 100 | 1 |
みかん | 130 | 2 |
バナナ | 110 | 5 |
個人用マクロブックの標準モジュールに記述すれば、
リボンに登録して、いつでも使えます。
登録方法はこちらを参考にしてください。
こういう、マクロを作ると、すごく楽しいし、うれしいです。
きっと、この思想は別の作業の自動化に役に立つはず。
Excel から HTMLへ・・・これもハイブリッドといえるかなぁ・・・
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/