セル内の文字色や太字をfont color=”#FF0000″のようにHTML化する
文字に色を付けていたり、太字にしたものを判別し、それをHTMLタグ化するVBAを作成しました。
セル内に複数の文字色や太字部分が複数あっても問題なく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で表現しますので何色でも問題ありません。黒(標準)の場合は特に何もしません。
コードの説明
- 一文字ずつ文字色をチェック
- 黒以外なら、その後何文字後まで同色か?
- その文字列を<font color=”#FF0000″>~~</font>で囲む
- 太字<B>も同様に一文字ずつチェック
流れはこんな感じです。
あと細かいコードの説明としては
Charactersプロパティ
cRange.Characters(Start:=i, Length:=1)
これがセル内の一文字ずつ見る方法ですね。
Charactersプロパティは、セルに入力された文字列の一部を参照することが出来ます。セルに入力された文字列の何文字目(Start)から何文字(Length)分の文字を表せますが、セル内に数値や数式が入っているとエラーを返します。空白はOK。
構文 Object.Characters(Start, Length)
設定項目 | 内容 |
---|---|
Object | Rangeオブジェクト |
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) の値を返します。
Excelヘルプ
構文
RGB(red, green, blue)
red:RGBのR(赤)の割合を0~255の整数で指定します
green:RGBのG(緑)
の割合を0~255の整数で指定します
blue:RGBのB(青)
の割合を0~255の整数で指定します
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
初めまして。こちらを参考にさせていただき、希望のものが作れそうなのですが、文字色+太字ではなく、太字+斜体のような二重装飾は可能なのでしょうか?
はい、可能です。
BoldCHKを改変してもらって
Font.BoldをFont.Italicにすれば太字じゃなく斜体となります。
あとはHTMLのをに変更するなど改変していけば使えると思います。
返信ありがとうございます。表現が間違っておりました。
文字色+斜体+取り消し線といった3重になる場合はどのように変更すれば可能でしょうか。それとも3重となると難しいのでしょうか。
3重も可能ですがちょっとややこしい改変になりそうですね。
BoldCHK内で最終的にBoldCHKに結果を返すところで、ItalicCHKなるプロシージャを作って、
そこで斜体判定する、という感じですかね。
ただ、
あ い う え お
とあって、
あ い
は色文字
い う
は太字
う え
は斜体、というようなそれぞれで色・太字・斜体が重なったり重ならなかったりを考えるとややこしそうです。
返信ありがとうございます。
タグが重なった場合がかなりややこしく対応できそうにないので、あきらめることにします。
はじめまして。
VBAを始めたばかりですこちらを参考にしているのですが、
If chk chky Then
BoldCHK = BoldCHK & cRange.Characters(Start:=chky, Length:=chk – chky).Text
の部分でtextプロパティを取得できないとエラーが出る時があるのですが考えられる可能性などございますでしょうか?
RangeオブジェクトでValue値が文字列以外(数値、日付等)の場合は、Textプロパティはエラーとなりますが、どうでしょうか?