Excel の表をhtml タグ化

Excelの表からhtmlタグ化したかったので作成しました。結果はメモ帳に出力されます。

  • メモ帳にクリップボード経由で渡していますが、処理が追い付かず空白のメモ帳が開いてしまう場合にはコードの最後にある待ち時間のところ、2カ所の秒数を調整してみてください。
  • 「blnWidthAutoCal 」の設定を変えるとwidthを指定するかなしにするか選べます。(指定ありの場合は、セル幅から%を計算します)

コード

ダウンロード(zip)

※ダウンロードはテキストですが、htmlタグが書いてあるため、zipにしています。

Option Explicit
Option Base 1

Sub CellToHTMLConvert()
    
    '------------------------------------------------------------------------------
    ' 選択した範囲を htmlタグ に変換してメモ帳へ出力する
    '  1) セルの装飾は一切出力しない
    '  2) width(%)はセル幅から自動計算(True:計算する、False:計算しない)
    '  3) heightは出力しない
    ' [補足]
    ' ・メモ帳への受け渡しは変数かつクリップボード経由
    '  (データがあまりに多いのは推奨できない方式のため、1000 セル以上選択されていると中断)
    '------------------------------------------------------------------------------
    
    'width をセル幅から自動計算するか (True:計算する、False:計算しない)
    Const blnWidthAutoCal As Boolean = True
    
    Dim MsgRtn As Long          'msgboxの戻り値
    Dim wkRng As Range          '選択範囲記憶
    
    Dim strText As Variant      'クリップボードに渡すデータ
    
    Dim SumColWidth As Single   '列幅
    Dim ColWidth                '列幅のパーセンテージ用配列
    Dim i As Long               'colWidthの添え字用変数
    
    Dim r As Long, c As Long
    Dim rowSt As Long, rowEd As Long, colSt As Long, colEd As Long
    
    'タグ文字列
    ' 固定分
    Const strTagTableTbodySt As String = &quot;<table style=&quot;&quot;border-collapse: collapse; width: 100%;&quot;&quot;>&quot; & vbCrLf & &quot;<tbody>&quot; & vbCrLf
    Const strTagTrSt As String = &quot;<tr>&quot; & vbCrLf
    Const strTagTdEd As String = &quot;</td>&quot; & vbCrLf
    Const strTagTrEd As String = &quot;</tr>&quot; & vbCrLf
    Const strTagTableTbodyEd As String = &quot;</tbody>&quot; & vbCrLf & &quot;</table>&quot; & vbCrLf
    ' 可変分
    Dim strTagTdSt1 As String
    Dim strTagTdSt2 As String
    'オプションによりtdタグ変更
    If blnWidthAutoCal = True Then
        strTagTdSt1 = &quot;<td style=&quot;&quot;width: &quot;
        strTagTdSt2 = &quot;%;&quot;&quot;>&quot;
    Else
        strTagTdSt1 = &quot;<td&quot;
        strTagTdSt2 = &quot;>&quot;
    End If
    
    '選択範囲に値があるか確認(値がなければ終了)
    If WorksheetFunction.CountA(Selection) = 0 Then
        Exit Sub
    End If
    
    '選択範囲を記憶
    Set wkRng = Selection
    
    If Selection.Count > 100 Then
        MsgRtn = MsgBox(&quot;セルが100個以上選択されていますが、実行しますか?&quot; & vbCrLf & vbCrLf, _
                    vbOKCancel + vbInformation + vbDefaultButton2, Title:=&quot;確認&quot;)
        If MsgRtn = vbCancel Then Exit Sub
    ElseIf Selection.Count > 1000 Then
        MsgRtn = MsgBox(&quot;セルが1000個以上選択されているので、中断します。&quot; & vbCrLf & vbCrLf & _
                    vbExclamation + vbInformation, Title:=&quot;中断&quot;)
        Exit Sub
    End If
    
    '列と行を取得
    rowSt = Selection(1).Row
    rowEd = Selection(Selection.Count).Row
    colSt = Selection(1).Column
    colEd = Selection(Selection.Count).Column
    
    'tdタグ用のWidthを格納する変数(オプションFalse時は空白)
    ReDim ColWidth(Columns.Count)
    'tdタグ用のWidthを計算
    If blnWidthAutoCal = True Then
        '列幅の総計を取得
        For c = colSt To colEd
            SumColWidth = SumColWidth + Columns(c).ColumnWidth
        Next c
        '列幅のパーセンテージを計算
        i = 0
        For c = colSt To colEd
            i = i + 1
            '小数点4桁まで (6桁までとってそれより下は切り捨て、パーセンテージ変換で100をかける)
            ColWidth(i) = WorksheetFunction.RoundDown(Columns(c).ColumnWidth / SumColWidth, 6) * 100
        Next c
    End If
    
    'tableタグ、tbodyタグ
    strText = strTagTableTbodySt
    'セル内容をtr/tdタグとともに出力
    For r = rowSt To rowEd
        'trタグ
        strText = strText & strTagTrSt
        i = 0
        For c = colSt To colEd
            i = i + 1
            'tdタグとともにセル内容を出力
            strText = strText & strTagTdSt1 & ColWidth(i) & strTagTdSt2 & Cells(r, c).Text & strTagTdEd
        Next c
        'trタグ(閉じ)
        strText = strText & strTagTrEd
    Next r
    'tableタグ、tbodyタグ(閉じ)
    strText = strText & strTagTableTbodyEd
    
    'クリップボードに格納
    With CreateObject(&quot;Forms.TextBox.1&quot;)
      .MultiLine = True
      .Text = strText
      .SelStart = 0
      .SelLength = .TextLength
      .Copy
    End With
  
    '待ち(処理が追い付かない場合、調整)
    Application.Wait Now() + TimeValue(&quot;00:00:02&quot;)
    'メモ帳起動
    Shell &quot;notepad&quot;, 1
    
    '待ち(処理が追い付かない場合、調整)
    Application.Wait Now() + TimeValue(&quot;00:00:01&quot;)
    'メモ帳に貼り付け
    SendKeys &quot;^V&quot;, True
    
    '元の選択範囲を選ぶ
    wkRng.Select

End Sub

 

タイトルとURLをコピーしました