もりさんのプログラミング手帳

教えることは、二度学ぶこと

スポンサーリンク

【ノンプロ研_お題】VBAで星座判定関数を書いてみた

2018年6月~ノンプロ研のSlackで「今週のお題」チャンネルがスタートしました。

1つのお題に対して、各自の得意言語(VBA、GAS、Python)で解答を投稿してみんなでガヤガヤしています。

同じ言語の解答はもちろん、他言語の解答をみてヒントをもらったり、とても勉強になっています!


f:id:excel-accounting:20180729142408j:plain:w450

今週のお題

「日付を渡すと星座を返す関数」です。


今回のポイントは、

受け取った日付をどのように判定して星座を返すか?

です。

「日付と星座」を何らかの形式でマスタ化して、受け取った日付を照合して星座を返します。

ここで、辞書機能(Dictionary)を使用してみたいと思います!


「いつも隣にITのお仕事」の最近の連載記事で読んでいた「Dictionaryオブジェクト」がずっと気になってたんです。

【エクセルVBA】リスト処理に便利!Dictionaryオブジェクト


うわ~!なんかすごい便利そう!!

f:id:excel-accounting:20180426143057p:plain:w150

でも使いどころがわからない…

って感じでくすぶっていたんですね。


今回はこの「Dictionary」を使用して書いてみますよ!

VBAで書くと

参照設定「Microsoft Scripting Runtime」を使用しています。

Sub main()

    Debug.Print 星座判定(DateSerial(2018, 6, 12))

End Sub
Function 星座判定(ByVal checkdate As Date) As String

    Dim mmdd As Long
    mmdd = Format(checkdate, "mmdd")
    
    Dim seizaDic As New Dictionary '辞書作成
    seizaDic.Add 119, "やぎ座"
    seizaDic.Add 218, "みずがめ座"
    seizaDic.Add 320, "うお座"
    seizaDic.Add 419, "おひつじ座"
    seizaDic.Add 520, "おうし座"
    seizaDic.Add 621, "ふたご座"
    seizaDic.Add 722, "かに座"
    seizaDic.Add 822, "しし座"
    seizaDic.Add 922, "おとめ座"
    seizaDic.Add 1023, "てんびん座"
    seizaDic.Add 1122, "さそり座"
    seizaDic.Add 1221, "いて座"
    seizaDic.Add 1231, "やぎ座"
    
    Dim i As Long
    For i = 0 To seizaDic.Count - 1
        If mmdd <= seizaDic.Keys(i) Then
            星座判定 = seizaDic.Items(i)
            Exit Function
        End If
    Next i

End Function

出力結果

6/12の場合 → ふたご座

辞書機能(Dictionary)の解説

【構成】(VBAの場合)
f:id:excel-accounting:20180612215504p:plain

※やぎ座は12月~1月にまたがるため分割している

4桁の日付形式mmddを「昇順に並べた辞書のキー」で順番に検索し、mmddがキーの値を超えた場合、そのItem(value)が答えの星座となります。





「わかる」と「使える」には大きな差がありますね。

連載記事を読んでいてわかった気になっていても、いざ使ってみると上手くいかないところもあり…

勉強した機能はどんどん実践で使っていきましょう!

スポンサーリンク