「湯婆婆 Advent Calendar 2020」の 20 日目の記事です。
ざっと検索してみた感じ Excel Formula で(≠VBA)湯婆婆している人がいないようなので,簡単にですがやってみようと思います。
そういやぁ LAMBDA が入ったことで素直に(あー, つまり循環参照とかを見なかったことにして, ということ)「順次(関数の適応順による)」「分岐(IF系関数による)」「反復(再帰関数による)」ができるようになって Excel Formula もチューリング完全になったんですよねぇ。 これって実質宣言型プログラミングと言えるのではないでしょうか? Competitive Excel Formula が始まる日も近い(来ない)。
シートの作成
上の方で偉そうに VBA ちゃうでとか言っておいてなんなんですが, ブックをそのままアップロードするのもアレなんで, シートを作る部分だけ VBA で書きました(数式入れたり書式設定したりしてるだけです)。 一度実行するだけなんで xlsx 形式での保存で OK です。
Option Explicit
Public Sub MakeYubaba()
Cells.Delete
Range("C3").Formula = "= IF(ISBLANK(C12),""契約書だよ。C12に名前を書きな。"",""フン。""&C12&""というのかい。贅沢な名だねぇ。"")"
Range("C4").Formula = "= IF(ISBLANK(C12),"""",""今からお前の名前は""&C13&""だ。いいかい、""&C13&""だよ。"")"
Range("C5").Formula = "= IF(ISBLANK(C12),"""",""分かったら返事をするんだ、""&C13&""!!"")"
Range("C13").Formula = "= IF(ISBLANK(C12),"""",MID(C12,RANDBETWEEN(1,LEN(C12)),1))"
Dim fc As FormatCondition
Set fc = Range("C12").FormatConditions.Add(xlExpression, xlEqual, "= ISBLANK(C12)")
With fc
.Borders(xlEdgeLeft).Color = RGB(0, 0, 0)
.Borders(xlEdgeTop).Color = RGB(0, 0, 0)
.Borders(xlEdgeRight).Color = RGB(0, 0, 0)
.Borders(xlEdgeBottom).Color = RGB(0, 0, 0)
End With
Set fc = Range("C12").FormatConditions.Add(xlExpression, xlEqual, "= NOT(ISBLANK(C12))")
fc.Font.Color = RGB(255, 255, 255)
Set fc = Range("C13").FormatConditions.Add(xlExpression, xlEqual, "= NOT(ISBLANK(C12))")
With fc
.Borders(xlEdgeLeft).Color = RGB(0, 0, 0)
.Borders(xlEdgeTop).Color = RGB(0, 0, 0)
.Borders(xlEdgeRight).Color = RGB(0, 0, 0)
.Borders(xlEdgeBottom).Color = RGB(0, 0, 0)
End With
End Sub
これを白紙のシートをアクティブにして実行すれば OK です。
随分味気ないシートですね。 まあ適当に湯婆婆の画像でも貼ってお楽しみください。
処理
各数式を見ていただいて分かるとおり, C12セルに値が入っているかどうかで分岐しています。
C12に値が入っている場合, C12セル自体の枠が消滅し, また文字色も白になるため見えなくなります。
代わりに, C13はC12から乱数で一文字選び, それを表示します。 また, 枠を表示させます。 これによって「名前を奪う」を表現しています。
C3:C5のメッセージはやはりC12の値の有無によって表示を変えます。 もとの名前はC12から, 奪ったあとの名前はC13から取得しています。
クラッシュ
湯婆婆の仕様(?)として「空文字列を入れたらクラッシュ」があるはずですが, C12に入力されていなければ動かないならこれができないのでは? とお考えの方も多いかと思います。
大丈夫です。 ISBLANK(range)はrange = ""と違い, ほんとうの意味で「セルが値を持たない」かどうかを判定します。 つまり, C12に式= ""を与えればちゃんとクラッシュします(あるいはそれを値として貼り付けでもいけます)。
成し遂げたぜ。
裏面
裏 20 日目もございますのでよろしかったらどうぞ。


