条件セルに当てはまったら戻り値セルに返すマクロを作ろう[Excel,VBA]

2019年7月9日

妹「お兄ちゃん、シートがたくさんあって、A5セルが100以上だったらB9の値を返したい、とかそういう時はどうすればいいの?」
兄「マクロを使うのが楽だと思うよ。A5セルを条件セル、100以上を閾値、B9セルを結果セルとするね。ロジックで言うと↓のようになるよ」

'第1引数:条件セル
'第2引数:しきい値
'第3引数:結果セル(シートで戻してほしい値)
Public Function Youwaka(szCondName As String, nSikii As Long, szReturnName As String)
    For i = 1 To Sheets.Count
        If Sheets(i).Range(szCondName) > nSikii Then
             Youwaka = Sheets(i).Range(szReturnName)
             Exit Function
        End If
    Next i
End Function

妹「なんだか難しそうだね」
兄「そんなに難しいソースコードは書いてないよ。CondNameのセルが閾値以上だったら結果セルを返してね、という定義をFunctionで定義してるんだよ」
妹「これってどうやって使うの?」
兄「Sheetのセルがあるだろ?あそこにYouwaka(“B5”, 2000, “A1”)とか入れればいいよ」
妹「三つも引数を入れるの面倒臭いよね……何入れたらいいか解らなくなりそう……」
兄「ならもう二つFunctionを足して解りやすい名前を付ければいいよ」

'C5が150以上だったらそのシートのA1を返す
Public Function Youwaka1()
    Youwaka1 = Youwaka("C5", 150, "A1")
End Function
'S4が30以上だったらそのシートのA5を返す
Public Function youwaka2()
    youwaka2 = Youwaka("S4", 30, "A5")
End Function

兄「こうすればYouwaka1() , Youwaka2()を呼び出せば処理できるよ」
妹「引数なくなると便利だね」
兄「マクロも差分が解りやすいから修正もしやすくなるんだよ」
妹「関数呼び出しが複雑な時とかってこういう呼び出すクラスを作ったりするよね」
兄「Wrapper class , いや、Wrapper Functionかな……」
妹「YO!YO!」
兄「Wrapperは包む。rapは喋る。それはrapだ。YO!YO!だけだと喋ってるってのも疑問だけどな」