昨日の続きです。
エクセルマクロ無料動画講座申し込みページのメンテナンスの必用で作った、RGB(57, 156, 4) みたいな情報を基にして#399C04;みたいな文字列を作るマクロ。
昨日公開したものを書き直してみました。こんな感じかな↓。
Public Sub RGB_WEB2() Range("E1").Value = "#" & hx(Range("A1").Value) & hx(Range("A2").Value) & hx(Range("A3").Value) & ";" End Sub Private Function hx(num As Integer) As String Dim i(1) As Integer i(0) = num \ 16 i(1) = num Mod 16 Dim c As Long Dim s As String For c = LBound(i) To UBound(i) If i(c) < 10 Then s = s & CStr(i(c)) Else s = s & Chr(Asc("A") + i(c) - 10) End If Next hx = s End Function
「2つの文字を作ってくっつける作業を3回やって、その結果をすべてくっつける」ということで。
「2つの文字を作ってくっつける作業」で作る文字は似ているので、Functionプロシージャの中でまとめた。
ということで、短くなったし抽象度も増したけど。
だらだら書いたほうが早いですからね。こんなオーバーチューニングなことに執心してはいかんと思います。
これはよく神経質そうな受講生に言うことでもあるんですが、「誰がどう見ても最高のマクロ」を書こうなんて思わないほうがよいです。
そんなもの存在しませんから。
どうして「誰がどう見ても最高のマクロ」なんて存在しないかといえば、それは、TPO次第で「何が最高か」の解は変わるからです。
たとえば、マクロの実行時間が早いのか、読みやすいのか、作り始めてから完成するまでの時間が短いのか、あとでメンテナンスしやすいのか、..と挙げただけでも、この4つを同時に満たすことは不可能だと分かります。
だから、余計なことは考えないで、とにかくガシガシ書くこと。
このマクロだって、そういう意味ではまだツッコミどころ満載です。
例えば、Functionプロシージャの中でFor Next構文を使っているが、2回しかループしないから、展開してベタに書いたほうが早いのかもしれない。
あと、VBAにもともと10進数を16進数に直す関数があるんじゃないか、とか。
でも、別にそんなの知らないでも書けばいいんだし、調べている間にこのくらいすぐ書けちゃうくらいのスキルがあれば、そんな関数あってもなくても困らなくなるでしょ。
これもいつも言っていることですが、エクセルマクロをさらさら書けるようになりたい人は、「知識」はそこそこでよいですので、「頭の使い方」とか「体の使い方」のほうを意識して強化してください。
このマクロは、エクセルマクロ無料動画講座申し込みページの申込ボタンの色指定文字列を作るときに使いました。