ぺんたんがゲーム開発やアプリ開発、最近の気になる話題、特にスマホやIT関連について語る場所

ぺんごや

Excel

Excelで作った表をWordPressに張り付けるVBAマクロ

投稿日:

WordPressで表…テーブルを作るのって面倒だったりしますよね。かといって余計なプラグインもあまり入れたくない…。

そこで、Excelで作った表をHTMLタグとして出力し、それをそのままWordPressに貼り付ければいい感じのテーブルが仕上がるVBAマクロを作りました。

Excelやスプレッドシートで作った表をそのままWordPressに貼り付ける問題点

Excelで作った表をセルごとコピーし、そのままWordPressのビジュアルエディターに貼り付ける方法。

一見、悪くないように見えますが、セルの色が反映されなかったり、セルの幅が自動的に指定されてしまい閲覧者の画面サイズによって表が画面からはみ出したりしてしまいます。

スポンサードサーチ

Excelで作った表をHTMLとして出力する

上記の問題を解決するため、Excelの表をHTMLとしてクリップボードに出力するVBAを作成。
VBAによって出力されたHTMLをWordPressのテキストエディターに貼り付けます。

HTMLを出力するVBA

以下がVBAとなります。
標準モジュールを追加し、全文を貼り付ければ使用できます。

ただその際、参照設定で「Microsoft Forms 2.0 Object Library」を有効にしておく必要があります。

もし有効にする方法が分からなかったり参照設定にない場合は、UserFormを追加してください。UserFormを追加すると自動で「Microsoft Forms 2.0 Object Library」の参照設定が追加されます。

'Microsoft Forms 2.0 Object Libraryの参照設定が必要
'→UserFormを追加すると自動的に参照設定される

Option Explicit

Public Sub Main()
    
    Dim sht As Worksheet
    Dim tableRange As Range
    
    Dim resHtml As String
    
    'テーブルの範囲を取得
    Set tableRange = ActiveCell.CurrentRegion
    
    'HTMLを作成
    resHtml = ToHTML(tableRange)
    Call SetClipBoard(resHtml)
    
    Call MsgBox("クリップボードに出力完了!", vbOKOnly Or vbInformation, "処理完了")
    
End Sub

'指定した範囲のHTMLを作成し返す
Private Function ToHTML(rng As Range) As String
    
    Dim c As Long, r As Long
    Dim cCnt As Long, rCnt As Long
    Dim res As String
    
    res = "<table style=""" & SetBorder(rng.Item(1, 1).Borders(xlEdgeTop)) & " border-collapse: collapse; table-layout: fixed; word-break: break-all; word-wrap: break-all; width: 100%;"">" & vbCrLf
    
    With rng
        cCnt = .Columns.Count
        rCnt = .Rows.Count
        
        For r = 1 To rCnt
        
            res = res & "<tr>" & vbCrLf
            
            For c = 1 To cCnt
                
                '罫線をチェックする際の罫線の場所
                Dim bdPos As Integer
                If c = 1 Then
                    bdPos = xlEdgeRight
                Else
                    bdPos = xlEdgeLeft
                End If
                
                'セルごとの色を設定、文字の色、文字の太さを設定、罫線を設定、その後値を入れる
                res = res & "<td style=""background-color: #" & HexEX(.Item(r, c).Interior.Color) & ";" _
                        & SetFntColor(.Item(r, c)) _
                        & SetBold(.Item(r, c)) _
                        & SetBorder(.Item(r, c).Borders(bdPos)) _
                        & """>" _
                        & .Item(r, c).Value _
                        & "</td	>" & vbCrLf
                
            Next
            
            res = res & "</tr>" & vbCrLf

        Next
        
    End With
    
    res = res & "</table>" & vbCrLf
    
    ToHTML = res
    
End Function

'指定した文字列をクリップボードに入れる
Private Sub SetClipBoard(str As String)

    Dim buf As String, buf2 As String, CB As New DataObject
    buf = str
    With CB
        .SetText buf        ''変数のデータをDataObjectに格納する
        .PutInClipboard     ''DataObjectのデータをクリップボードに格納する
    End With
End Sub

'HEX関数をちゃんとやる
Private Function HexEX(colval As Double) As String
    
    Dim hextmp As String
    hextmp = Right("00000" & Hex(colval), 6)
    
    'HEXではRとBが逆になっているため入れ替える
    Dim resHex(2) As String
    resHex(0) = Right(hextmp, 2)
    resHex(1) = Mid(hextmp, 3, 2)
    resHex(2) = left(hextmp, 2)
    
    Dim i As Integer
    For i = 0 To 2
        If resHex(i) = "" Then resHex(i) = "00"
    Next
    
    HexEX = resHex(0) & resHex(1) & resHex(2)
    
End Function

'色が黒以外ならスタイルを入れる
Private Function SetFntColor(rng As Range) As String
    
    Dim res As String
    res = ""
    
    If Not rng.Font.Color = 0 Then
        res = "color: #" & HexEX(rng.Font.Color) & ";"
    End If
    
    SetFntColor = res
    
End Function
'ボールドならスタイルを入れる
Private Function SetBold(rng As Range) As String
    
    Dim res As String
    res = ""
    
    If rng.Font.Bold Then
        res = "font-weight: bold;"
    End If
    
    SetBold = res
    
End Function

'罫線からボーダースタイルを入れる
Private Function SetBorder(bd As Border) As String
    
    Dim res As String
    res = ""
    
    '罫線が何かしら引かれていたら処理する
    If Not bd.LineStyle = xlLineStyleNone Then
        
        '罫線が実線なら実線を、それ以外なら破線を入れる
        If bd.LineStyle = xlContinuous Then
            res = "border: solid "
        Else
            res = "border: dashed "
        End If
        
        '太さを設定する
        Dim bdWeight As String
        If bd.Weight = xlHairline Then
            bdWeight = 1
        ElseIf bd.Weight = xlThin Then
            bdWeight = 1
        ElseIf bd.Weight = xlMedium Then
            bdWeight = 2
        Else
            bdWeight = 4
        End If
        
        res = res & bdWeight & "px "
        
        '色を設定する
        If bd.Color = 0 Then
            res = res & "#000000;"
        Else
            res = res & "#" & HexEX(bd.Color) & ";"
        End If
        
    End If
    
    SetBorder = res
    
End Function

スポンサードサーチ

VBAの利用方法

こんな感じでマクロ実行用のボタンを配置をして利用するのが分かりやすくていいかと思います。
マクロを実行するときは、出力したい表のどこか1か所が選択された状態にしておく必要があります。

 

マクロを実行するとHTMLがクリップボードにコピーされるので、WordPressのテキストエディター側に貼り付ければOKです。

 

実際のブログ画面上で確認してみると、このようにエクセルからほぼそのまま持ってこれているのが確認できます。

VBAの仕様

このVBAで出力できるものは以下となります。

  • 太文字設定
  • 文字の色
  • セルの色
  • 罫線の色
  • 罫線の幅
  • 罫線の種類(ただし、実線か破線の2種のみ)

 

まとめ

WordPressのエディターでテーブルを編集するのはエディターのクセもあり、なかなか難しいです…。本当はWordPressのみで完結出来ればいいのですが、そうもいかないのが現状です。

なのでこのVBAもそうですが、外部ツールをうまく利用して少しでも効率よくいきたいですね。

-Excel

Copyright© ぺんごや , 2019 All Rights Reserved Powered by STINGER.