このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

6日でできるVisual Basic2022入門】⑤今日の運勢アプリ:コードの実装と実行

⑤今日の運勢アプリ:コードの実装と実行

 本章では、今日の運勢アプリをコードで完成させます。ButtonTell.Click を契機に、DatePick.Value.DayOfYear Mod 5 で結果キーを算出し、Select Case で画像、文面(配列を Random.Next で抽選)、色(TextResult.ForeColor)を切り替えます。PictureBoxResult に反映し、起動時の初期画像設定や乱数の使い回し、コントロール名不一致などの注意点、動作テストの観点も併せて確認します。

5.今日の運勢アプリ:コードの実装と実行(完成)

5.1. 完成コード(FormUranai.vb)

 前章までのコントロール名(DatePick, ButtonTell, PictureBoxResult, TextResult)と、リソース名(Title, Daikichi, Chukichi, Shokichi, Kichi, Kyo)を前提にしています。結果ごとにメッセージを複数用意し、色も切り替えます。

Option Strict On
Imports System.ComponentModel
Imports System.Drawing

Public Class FormUranai
    ' 乱数はクラス全体で使い回して同一秒の連続実行でも偏りを減らす
    Private Shared ReadOnly Rnd As New Random()

    ' 画像(リソース)の読み込み
    Dim rm As New ComponentResourceManager(GetType(FormUranai))
    Dim Title As Image = CType(rm.GetObject("Title"), Image)
    Dim Daikichi As Image = CType(rm.GetObject("Daikichi"), Image)
    Dim Chukichi As Image = CType(rm.GetObject("Chukichi"), Image)
    Dim Shokichi As Image = CType(rm.GetObject("Shokichi"), Image)
    Dim Kichi As Image = CType(rm.GetObject("Kichi"), Image)
    Dim Kyo As Image = CType(rm.GetObject("Kyo"), Image)

    ' 結果別メッセージ(バリエーション豊富に)
    Private ReadOnly MsgDaikichi As String() = {
        "直感が冴え渡る日。難所もスッと解けます。", "丁寧に書いたコードが華麗に動作!",
        "良いレビューが集まり自信に。", "学びがつながり、理解が一段深まる。"
    }
    Private ReadOnly MsgChukichi As String() = {
        "集中が続き作業がはかどります。", "昨日つまずいた箇所に突破口。",
        "質問力が上がり、解決が早まる。", "チームとの連携がスムーズ。"
    }
    Private ReadOnly MsgShokichi As String() = {
        "小さな改善が積み重なり効果に。", "メモが役立ち再発を防げる。",
        "テストが静かに品質を守る日。", "地道なリファクタが効いてくる。"
    }
    Private ReadOnly MsgKichi As String() = {
        "安定運。基本の徹底が最善。", "休息も力のうち、無理は禁物。",
        "着実に前進。丁寧さを大切に。", "レビューで気づきを得られる。"
    }
    Private ReadOnly MsgKyo As String() = {
        "設計の見直しが好転の鍵。", "焦らず再現手順を整えよう。",
        "小休止して頭を切り替えると◎。", "助けを求めると早く進む。"
    }

    ' 初期化(タイトル画像と案内文)
    Private Sub FormUranai_Load(sender As Object, e As EventArgs) _
        Handles MyBase.Load
        Me.AcceptButton = ButtonTell
        DatePick.Value = Date.Today
        ' タイトル画像(リソース)を表示
        PictureBoxResult.Image = Title
        TextResult.Text = "日付を選んで[占う]を押してください。"
        TextResult.ForeColor = SystemColors.ControlText
    End Sub

    ' [占う]クリック → 結果を判定して反映
    Private Sub ButtonTell_Click(sender As Object, e As EventArgs) _
        Handles ButtonTell.Click

        Dim key As Integer = GetFortuneKey(DatePick.Value) ' 0..4
        ApplyFortune(key)
    End Sub

    ' 判定キー:年内通算日(DayOfYear)の剰余で 0..4 にマップ
    Private Function GetFortuneKey(d As Date) As Integer
        Return d.DayOfYear Mod 5
    End Function

    ' 画像・色・メッセージをまとめて反映
    Private Sub ApplyFortune(key As Integer)
        Dim img As Image = Title
        Dim color As Color = SystemColors.ControlText
        Dim rank As String = "?"
        Dim text As String = "もう一度お試しください。"

        Select Case key
            Case 0
                img = Daikichi
                color = Color.Gold
                rank = "大吉"
                text = Pick(MsgDaikichi)
            Case 1
                img = Chukichi
                color = Color.LimeGreen
                rank = "中吉"
                text = Pick(MsgChukichi)
            Case 2
                img = Shokichi
                color = Color.RoyalBlue
                rank = "小吉"
                text = Pick(MsgShokichi)
            Case 3
                img = Kichi
                color = Color.SteelBlue
                rank = "吉"
                text = Pick(MsgKichi)
            Case 4
                img = Kyo
                color = Color.Crimson
                rank = "凶"
                text = Pick(MsgKyo)
        End Select

        PictureBoxResult.Image = img
        TextResult.ForeColor = color
        TextResult.Text =
            $"【{DatePick.Value:yyyy/MM/dd} の運勢:{rank}】{Environment.NewLine}{text}"
    End Sub

    ' 配列からランダムに1件取得
    Private Function Pick(arr As String()) As String
        Return arr(Rnd.Next(arr.Length))
    End Function
End Class

5.2. 仕様マッピング(画像・色・メッセージ)

キー結果画像(My.Resources)テキスト色(例)
0大吉DaikichiGold
1中吉ChukichiLimeGreen
2小吉ShokichiRoyalBlue
3KichiSteelBlue
4KyoCrimson

5.3. 処理フロー

[占う クリック]
   ├─ key ← (DatePick.Value.DayOfYear Mod 5)
   ├─ Select Case key
   │     0..4 → 画像/色/文を決定(ランダムPick)
   └─ PictureBox.Image と TextResult に反映

5.4. VB 2022 の命令・イベント解説(本章で使用)

要素概要本章での使いどころ
Handles ButtonTell.Clickイベントとメソッドの結び付けクリック時の処理入口
DateTime.DayOfYear1〜365/366 の整数判定キーの基礎値
Mod 演算子剰余(あまり)を求める0〜4 の分岐へ正規化
Select Case多岐分岐結果の振り分け
Random.Next(n)0〜n-1 の整数メッセージをランダムに選択
TextBox.ForeColor文字色結果に応じた色変更

5.5. 実行手順と期待結果(例)

  1. Uranai」ボタン で起動(タイトル画像と案内文が表示)
  2. 日付を選び[占う](Enter でも可:AcceptButton=ButtonTell
  3. PictureBox に結果画像、TextResult に「日付+結果名+メッセージ」を表示
  4. 同じ結果でもメッセージは毎回ランダムで変化、色も結果に応じて切り替わる。

実行イメージ

5.6. テスト観点とチェックリスト

観点期待確認
入力日付変更で結果が変化複数日付で試す
表示画像が引き伸ばされないSizeMode=StretchImage を確認
結果に応じて ForeColor 切替5パターンを一巡
ランダム性同じ結果でも文が変わる複数回クリック
レイアウトフォーム拡大で追従前章の Anchor 設定で確認

5.7. よくあるつまずきと対処

症状原因対処
画像が切替わらないリソース名の綴り不一致Resources の実名を再確認しコード修正
文字色が変わらないForeColor 未設定TextResult.ForeColor = 色 を入れる
同じ文しか出ない毎回 New Random() しているクラス共通の Rnd を使う
実行時エラーコントロール名の不一致デザイナ名とコード名を合わせる

5.8. 追加課題(拡張のヒント)

  • 名前入力と組み合わせて「日付+名前長」などでキー計算を微調整
  • 結果を Enum 化し、設定(画像/色/文)を辞書で管理
  • 結果の詳細リンクや今日のラッキーアイテム表示を追加
  • 音やアニメーションを加えて演出強化

まとめ

 Select CaseMod で結果を判定し、画像・ForeColor の色・メッセージ配列のランダム選択を組み合わせて、「今日の運勢アプリ」が完成しました。ここからはメッセージや画像の追加、判定ロジックの工夫などで、自由に発展させてください。