92本目 セルの色を16進表示で戻すユーザー定義関数を作成

VBA100本ノック

VBA100本ノック 92本目を動画で解説しています。Excelの神髄さんの模範解答はコチラ


問題

#VBA100本ノック 92本目
セルの色を16進(赤=”#FF0000″、青=”#0000FF”)で戻す
ユーザー定義関数を作成します。
=関数(セル範囲,対象)
対象: 1=塗りつぶし、2=フォント色
セル範囲の大きさにあわせて戻り値を配列で戻す。
つまり配列数式またはスピルに対応してください。
※”#RGB”です。順番に注意。

解答

Function 色を16進数に変換(色の値 As Long) As String
    Dim 色 As String
    色 = Right("000000" & Hex(色の値), 6)
    色 = "#" & Mid(色, 5, 2) & Mid(色, 3, 2) & Mid(色, 1, 2)
    色を16進数に変換 = 色
End Function

Function ノック92本目(セル範囲 As Range, 区分 As Long) As Variant
    Dim ary() As Variant '要素数が決まってない時
    Dim i, j
    ReDim ary(1 To セル範囲.Rows.Count, 1 To セル範囲.Columns.Count)
    For i = 1 To セル範囲.Rows.Count '行のループ
        For j = 1 To セル範囲.Columns.Count  '列のループ
            '色を入れる
            If 区分 = 1 Then
                ary(i, j) = 色を16進数に変換(セル範囲.Cells(i, j).Interior.Color)
            Else
                ary(i, j) = 色を16進数に変換(セル範囲.Cells(i, j).Font.Color)
            End If
        Next j
    Next i
    ノック92本目 = ary()
End Function

■考え方・流れ
0:00 冒頭・問題確認
2:06 スピルに対応したファンクションの作成①
4:20 スピルに対応したファンクションの作成➁
6:17 色の扱い方について復習
8:30 色の値を16進数に変換
11:13 色の値を渡して16進数の文字を返す

色ってホントに色々あるんすね…色だけに…

新人君
新人君

使い時に応じて
扱い方を変えるのが良さそうっすね!

ブチョ
ブチョ

色が色々…プクク!
おもしれーっ!

新人君
新人君

オヤジ世代には
こういうのがウケるんか…

スピルに対応したファンクションの作成①

ま~~ずはファンクションの作成から!
作りたい引数は、”セル範囲”と”区分”の二つ!

セル範囲はRangeでいいとして…
区分に関しては、1か2を入れたいので、Longにしてます。

続いては返り値!
かっこの外側のことだな!!

配列を返す時はとにも書くにもVariantを使ってくれ!!

ココからはファンクションの中身だ!
受け取った”セル範囲”と同じ大きさの2次元配列を作ればいいから…

ノック31本目の復習だ!!!
Redimステートメントさんを使えばOKだね!!

よし!ちょっとこの辺難しいからここで一旦休憩を2秒挟むぞ!
次の章へGO!

スピルに対応したファンクションの作成➁

よし!話はさっきの続きだ!
Redimさんにはつきもの、行の最大数と列の最大数を求めるため、
iとjを使ってごりっごりにループさせるぞ!

そして肝心のループの中身なんだけど…
ここは一旦、別に何かいれとこう!!

最後の仕上げで「色を16進数に変換」するファンクションを入れていくぞ!

最後、ノック92本目 = ary()をぶち込んだらファンクションの完成だ!

一旦返り値はiとjでテキトーに作ったから、セル上で使うとこんな感じだ!

色の扱い方について復習

色についてはこれまでに色んな問題でやってきたよな!
一旦復習だ!

ちなみに塗りつぶしの色はInterior.Color、
フォントの色はFont.Colorだぞーん!

一旦はこんな感じでいいかな!
塗りつぶしはインテリア~♪
インテリア用品とか皆さんこだわる派ですか?ワイは一ミリもこだわらないぞ!

結果はこんな感じ!上から、
赤(255)
青(16711680)
黄(65535)
緑(5287936)のようだ!
For Eachで回したときはこんな感じの処理順番になることが99.9%だ!

ほんでここからは、この色の値を「16進」に変換していくぞ!!
16進ってのは、↓この画面で見たことがあるかもしれないな!

Hexって言葉を知ってる人はもしかしたら知ってたかな?
俺は今初めて知ったぞ!!!

色の値をHexに変換するには…!
Hex関数を使えばいいんスわ!!!いやそのまんま過ぎるだろ!!!

よし、ここから先は次の章でやるぞ!!

色の値を16進数に変換

↑の章でも言った通り、Hex関数をぶち込んでみるぞ!
デバッグモードになってるがまだ実行はしてないので気にしないでくれ!

実行した結果はこっちだ!↓
FFとかFF0000とかがでてるよな!それだ!

ただこれで完成じゃなく、正確には#と6桁の数字で扱う必要があるところだけ注意だ!

ちなみに16進数の書き方については…ググってくれ!!!
簡単には解説いれてるぞ!!

FFとかを正確な16進数に変換するのも、お決まりの方法があるらしいからそれを使っていくぞ!!

ググればでてくるからいちいち覚える必要はねえぞ!!

ググった通りにやったら!綺麗な16進数に変換できたぞ!!
Googleってすごい!!

次の章で仕上げだ!!

色の値を渡して16進数の文字を返す

これで最後だ!!少し長いがこれまでのことを考えると簡単だから頑張ってくれ!

まずはさっきまでSubで扱ってたコードをFunctionに変換だ!
#○○○○○○的な戻り値が欲しいからな!

そしたら!作ったファンクションを、ループの中から呼び出すぞ!!
なんだけど…引数”区分”が1の時は塗りつぶしの色、2の時はフォントの色にしたいから、
この中で更に条件分岐する必要があるね!

ま、これは簡単だね!画像ちっちゃくて申し訳ない!

拡大。超簡単な条件分岐だ!
ちなみにこの書き方だと1以外は全部フォントカラーになるから、
2以外はエラーを返したいとか希望があったらこの辺をいじってくれ!

最後に、結果を見てみるよ~!

今日も頑張ったね!
お疲れんこん~~~!!

ブチョ
ブチョ

お疲れ様!
毎日寒くて
髭がちょちょぎれそうだよ!!

新人君
新人君

ちょちょぎれそう…?

あとがたり

おはこんばんちは。uぷ主です。
92本目!色をセルの色を16進表示で戻すユーザー定義関数を作成…!ムズそう!
というかむずかった!!
色って色々指定方法がありすぎんねん!

てかそもそも16進ってなんや!から始まった…ww

今日もHexやらなんやら難しいのが出てきたけど…
Googleさんがとにかく最強だね!!

あと、この段階でスピルが可能なファンクションを作る問題が出てくれるのは非常に嬉しい。
だいぶ頭から抜けてきてたから…
超絶ありがたい問題でした。
神髄さん、ありがとうございました。

あと8本!!!乗り越えるぞ!!(編集はほぼ終わってるけどww)

最後までご視聴いただいたみなさん!ありがとうございました!

コメント

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