RGB値(0~255の整数値3つ)と、HTMLカラーコード(#FFFFFF形式の文字列)を、
相互に変換する方法を解説します。
RGB値からHTMLカラーコードを取得する
RGB値からHTMLカラーコードを取得するには、
10進数から16進数を取得するHex関数を使用します。
たとえばR200、G100、B50のHTMLカラーコードは、
以下のコードで計算することができます。
HTMLカラーコード =Right("0" & Hex(200), 2) _ & Right("0" & Hex(100), 2) _ & Right("0" & Hex(50), 2)
Hex関数を用いると、10 ⇒ Aのように10進数を16進数に変換してくれます。
あとはRGBそれぞれの値を16進数にして繋げるだけですが、
1桁になることがあるためRight関数を使って0埋めする必要がある点ご注意ください。
0を先頭につけて、右から2文字だけをとることで、
3桁になるのを防ぎつつ0埋めをすることが可能です。
以下のコードでは15以下の色があると正しく変換されません。
Hex(200) & Hex(15) & Hex(200) ' ↑正しくはC80FC8だがC8FC8になってしまう。
また、0埋めは通常Format(数値, "00")でやるのがストレートで分かりやすいですが、
16進数だとA⇒0AやF⇒0Fの変換がFormat関数ではできませんのでご注意ください。
RGB値を直接HTMカラーコードに変換する
RGB値を直接カラーコード変換する際もHex関数を使用します。
まず直接やってみると、
Hex(RGB(200, 100, 50)) ' 3264C8
となり、一見正しそうですが残念ながらうまくいきません。
正しくは「C86432」ですので、左右、つまりRとBが逆になってしまいます。
VBAのRGB値はHTMLカラーコードと逆順の計算をしているため、
直接変換を簡単に行うことはできません。
変換を行いたい場合は、左右を反転して結合してください。
Dim RGBHex値 As String RGBHex値 = Right("000000" & Hex(RGB(200, 100, 50)), 6) HTMLカラーコード = Right(RGBHex値, 2) _ & Mid(RGBHex値, 3, 2) _ & Left(RGBHex値, 2)
Hex(RGB値)はGやBが0だと桁落ちしてしまうため、
000000を左に結合し、右から6桁とることでHex値を6桁で0埋めします。
この処理を行う必要があるため、
200、100、50という数値を知っている場合はこの方法を用いる意味はありません。
しかし、RGB値をセルの背景色などから直接取得する場合は、
以下のようにこの方法を用いるメリットがあります。
Dim RGBHex値 As String RGBHex値 = Right("000000" & Hex(Range("A1").Interior.Color), 6) ' 背景色からRGB値を直接取得 HTMLカラーコード = Right(RGBHex値, 2) _ & Mid(RGBHex値, 3, 2) _ & Left(RGBHex値, 2)
この記述を行えばR,G,B各値を調べる必要がありませんので、
状況によってはこちらのコードを使用してください。
汎用関数にして使う場合はこちらのFunctionをご活用下さい。
Function ConvRGB値→HTMLカラーコード(RGB値 As Long) As String Dim RGBHex値 As String RGBHex値 = Right("000000" & Hex(RGB値), 6) ConvRGB値→HTMLカラーコード = Right(RGBHex値, 2) _ & Mid(RGBHex値, 3, 2) _ & Left(RGBHex値, 2) End Function
HTMLカラーコードからRGB値を取得する
HTMLカラーコードからRGB値を取得する場合は、
16進数を10進数に変換する接頭辞"&H"を使用します。
CLng(&HFF) ' ← 255
ただし先ほどと同様VBAのRGB値はRとBが逆になっているため、
以下のコードでは求めることができません。
RGB値 = CLng("&HC86432") ' ← RGB(50,100,200)になってしまう
よって各色を個別にRGB関数へ渡す必要があります。
HTMLカラーコード = "C86432" RGB値 = RGB("&H" & Left(HTMLカラーコード, 2) _ , "&H" & Mid(HTMLカラーコード, 3, 2) _ , "&H" & Right(HTMLカラーコード, 2))
この逆順処理が面倒ですが、簡単な解決策はないようですので、
Right/Mid/Leftを使って愚直に求めてください。
汎用関数にして使う場合はこちらのFunctionをどうぞ。
Function ConvHTMLカラーコード→RGB値(HTMLカラーコード As String) As Long ConvHTMLカラーコード→RGB値 = RGB("&H" & Left(HTMLカラーコード, 2) _ , "&H" & Mid(HTMLカラーコード, 3, 2) _ , "&H" & Right(HTMLカラーコード, 2)) End Function