セル内の文字色や太字をfont color=”#FF0000″のようにHTML化する

マクロ / VBA , , , ,

文字に色を付けていたり、太字にしたものを判別し、それをHTMLタグ化するVBAを作成しました。

例:赤字や緑字、太字の文章を
HTMLタグ化します

セル内に複数の文字色や太字部分が複数あっても問題なくHTML化します。

VBAコード

Dim Red As String
Dim Green As String
Dim Blue As String
Dim cRange As Range
Dim moji As String
Dim moji2 As String

Sub HTML_Change()
    For Each cRange In Selection
    moji = ""
    y = 1
        For i = 1 To Len(cRange)
            If cRange.Characters(Start:=i, Length:=1).Font.Color <> RGB(0, 0, 0) Then
                moji2 = BoldCHK(y, i - 1)
                moji = moji & moji2
                iLen = 1
                Do Until cRange.Characters(Start:=i, Length:=1).Font.Color <> cRange.Characters(Start:=i + iLen, Length:=1).Font.Color
                    iLen = iLen + 1
                Loop
                Call GetRGBValue(cRange.Characters(Start:=i, Length:=1).Font.Color, Red, Green, Blue)
                moji = moji & "<font color=""#" & Red & Green & Blue & """>"
                moji2 = BoldCHK(i, i + iLen - 1)
                moji = moji & moji2
                moji = moji & "</font>"
                i = i + iLen - 1
                y = i + 1
            End If
        Next
        If i <> y Then
            moji2 = BoldCHK(y, i - 1)
            moji = moji & moji2
        End If
    cRange.Value = moji
    Next cRange
End Sub

Function BoldCHK(st, en) As String
    BoldCHK = ""
    chky = st
    For chk = st To en
        If cRange.Characters(Start:=chk, Length:=1).Font.Bold = True Then
            BoldCHK = BoldCHK & cRange.Characters(Start:=chky, Length:=chk - chky).Text
            iLen = 1
            Do Until cRange.Characters(Start:=chk, Length:=1).Font.Bold <> cRange.Characters(Start:=chk + iLen, Length:=1).Font.Bold
                If st + iLen - 1 = en Then
                    Exit Do
                End If
                iLen = iLen + 1
            Loop
            BoldCHK = BoldCHK & "<B>" & cRange.Characters(Start:=chk, Length:=iLen).Text & "</B>"
            chk = chk + iLen - 1
            chky = chk + 1
        End If
    Next
    If chk <> chky Then
        BoldCHK = BoldCHK & cRange.Characters(Start:=chky, Length:=chk - chky).Text
        
    End If
End Function

Sub GetRGBValue(lColorValue, Red, Green, Blue)
    Red = Format(Hex(lColorValue Mod 256), "00")
    Green = Format(Hex(Int(lColorValue / 256) Mod 256), "00")
    Blue = Format(Hex(Int(lColorValue / 256 / 256)), "00")
End Sub

使い方

上記のコードを標準モジュールに貼り付けしてください。

HTML_Changeを走らせると、選択したセル(範囲OK)の文字色と太字をHTML化させます。

文字色はRGBで表現しますので何色でも問題ありません。黒(標準)の場合は特に何もしません。

コードの説明

  1. 一文字ずつ文字色をチェック
  2. 黒以外なら、その後何文字後まで同色か?
  3. その文字列を<font color=”#FF0000″>~~</font>で囲む
  4. 太字<B>も同様に一文字ずつチェック

流れはこんな感じです。

あと細かいコードの説明としては

Charactersプロパティ

cRange.Characters(Start:=i, Length:=1)

これがセル内の一文字ずつ見る方法ですね。
Charactersプロパティは、セルに入力された文字列の一部を参照することが出来ます。セルに入力された文字列の何文字目(Start)から何文字(Length)分の文字を表せますが、セル内に数値や数式が入っているとエラーを返します。空白はOK。

構文 Object.Characters(Start, Length)

設定項目内容
ObjectRangeオブジェクト
Start参照したい文字列の先頭位置を指定します。省略した場合は1
Length参照したい文字数を指定します。省略した場合はStart以降の全文字列

参照するだけでなく、指定した部分に別の文字を設定する事もできます。
あいうえお →(3文字目を”ん”にしたい) あいえお のように。

A1に「あいうえお」が入っていた場合。

Range("A1").Characters(3, 1).Text = "ん"

A1セルの3文字目から1文字だけを”ん”に変更します。

テキストだけでなく文字装飾も出来るのでこれを活用し、以下のようなコードにすれば文字の色を判別できます。

For i = 1 To Len(cRange)
    If cRange.Characters(Start:=i, Length:=1).Font.Color <> RGB(0, 0, 0) Then

 

Colorプロパティ

また、ややこしいのがColorプロパティです。

Colorプロパティはオブジェクトに応じて適用する色を設定します。色は、RGB関数によって作成された値です。

で、RGB関数とは

色のRGB値を表す長整数型 (Long) の値を返します。
構文
RGB(red, green, blue)
red:RGBのR(赤)の割合を0~255の整数で指定します
green:RGBのG(緑)
の割合を0~255の整数で指定します
blue:RGBのB(青)
の割合を0~255の整数で指定します

Excelヘルプ

R×256 + G×256 + B×256×256 という計算の結果の数値で表しています。
紫でしたら「112+48×256+160×256×256」で「10498160」 となります。

ですのでHTMLの文字色にする場合、16進数の”#FF0000″のように置き換える必要があります。そこで以下のコードとしています。

Sub GetRGBValue(lColorValue, Red, Green, Blue)
    Red = Format(Hex(lColorValue Mod 256), "00")
    Green = Format(Hex(Int(lColorValue / 256) Mod 256), "00")
    Blue = Format(Hex(Int(lColorValue / 256 / 256)), "00")
End Sub

Comment

  1. ふぅ より:

    初めまして。こちらを参考にさせていただき、希望のものが作れそうなのですが、文字色+太字ではなく、太字+斜体のような二重装飾は可能なのでしょうか?

    • isakat より:

      はい、可能です。
      BoldCHKを改変してもらって
      Font.BoldをFont.Italicにすれば太字じゃなく斜体となります。
      あとはHTMLのに変更するなど改変していけば使えると思います。

      • ふぅ より:

        返信ありがとうございます。表現が間違っておりました。
        文字色+斜体+取り消し線といった3重になる場合はどのように変更すれば可能でしょうか。それとも3重となると難しいのでしょうか。

        • isakat より:

          3重も可能ですがちょっとややこしい改変になりそうですね。
          BoldCHK内で最終的にBoldCHKに結果を返すところで、ItalicCHKなるプロシージャを作って、
          そこで斜体判定する、という感じですかね。
          ただ、
          あ い う え お
          とあって、

          あ い
          は色文字

            い う
          は太字

              う え
          は斜体、というようなそれぞれで色・太字・斜体が重なったり重ならなかったりを考えるとややこしそうです。

          • ふぅ より:

            返信ありがとうございます。
            タグが重なった場合がかなりややこしく対応できそうにないので、あきらめることにします。

  2. ぷぅ より:

    はじめまして。

    VBAを始めたばかりですこちらを参考にしているのですが、

    If chk chky Then
    BoldCHK = BoldCHK & cRange.Characters(Start:=chky, Length:=chk – chky).Text

    の部分でtextプロパティを取得できないとエラーが出る時があるのですが考えられる可能性などございますでしょうか?

    • isakat より:

      RangeオブジェクトでValue値が文字列以外(数値、日付等)の場合は、Textプロパティはエラーとなりますが、どうでしょうか?

isakat へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

  • ▼お小遣い稼ぎしませんか?▼ 日々の生活にhappyをプラスする|ハピタス

    クレジットカード・FX口座を作るだけで簡単に3万円GETです。一切支出はありません。

DATE 検索 SUM テンプレート ワイルドカード フロー図 VLOOKUP HLOOKUP コピペ 変換 ユーザー定義関数 SUMIFS 目標 作業効率UP グラフ 置換 NA() COLUMN 印刷 MATCH SUMIF COUNTIF バーコード 無料 図形 XLSTART INDEX 日付 条件付き書式 TODAY
  • 関西在住の30代サラリーマン。事務職で毎日Excelと戯れています。
    システム導入なんて資金が無い!Excelでなんとかやりたい零細中小の社長さん・事務員さんの力になればと思います。
    詳しいプロフィール


PAGE TOP ↑