このページで解説している内容は、以下の 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 Class5.2. 仕様マッピング(画像・色・メッセージ)
| キー | 結果 | 画像(My.Resources) | テキスト色(例) |
|---|---|---|---|
| 0 | 大吉 | Daikichi | Gold |
| 1 | 中吉 | Chukichi | LimeGreen |
| 2 | 小吉 | Shokichi | RoyalBlue |
| 3 | 吉 | Kichi | SteelBlue |
| 4 | 凶 | Kyo | Crimson |
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.DayOfYear | 1〜365/366 の整数 | 判定キーの基礎値 |
Mod 演算子 | 剰余(あまり)を求める | 0〜4 の分岐へ正規化 |
Select Case | 多岐分岐 | 結果の振り分け |
Random.Next(n) | 0〜n-1 の整数 | メッセージをランダムに選択 |
TextBox.ForeColor | 文字色 | 結果に応じた色変更 |
5.5. 実行手順と期待結果(例)
- 「▶Uranai」ボタン で起動(タイトル画像と案内文が表示)
- 日付を選び[占う](Enter でも可:
AcceptButton=ButtonTell) - PictureBox に結果画像、TextResult に「日付+結果名+メッセージ」を表示
- 同じ結果でもメッセージは毎回ランダムで変化、色も結果に応じて切り替わる。
実行イメージ

5.6. テスト観点とチェックリスト
| 観点 | 期待 | 確認 |
|---|---|---|
| 入力 | 日付変更で結果が変化 | 複数日付で試す |
| 表示 | 画像が引き伸ばされない | SizeMode=StretchImage を確認 |
| 色 | 結果に応じて ForeColor 切替 | 5パターンを一巡 |
| ランダム性 | 同じ結果でも文が変わる | 複数回クリック |
| レイアウト | フォーム拡大で追従 | 前章の Anchor 設定で確認 |
5.7. よくあるつまずきと対処
| 症状 | 原因 | 対処 |
|---|---|---|
| 画像が切替わらない | リソース名の綴り不一致 | Resources の実名を再確認しコード修正 |
| 文字色が変わらない | ForeColor 未設定 | TextResult.ForeColor = 色 を入れる |
| 同じ文しか出ない | 毎回 New Random() している | クラス共通の Rnd を使う |
| 実行時エラー | コントロール名の不一致 | デザイナ名とコード名を合わせる |
5.8. 追加課題(拡張のヒント)
- 名前入力と組み合わせて「日付+名前長」などでキー計算を微調整
- 結果を
Enum化し、設定(画像/色/文)を辞書で管理 - 結果の詳細リンクや今日のラッキーアイテム表示を追加
- 音やアニメーションを加えて演出強化
まとめ
Select Case と Mod で結果を判定し、画像・ForeColor の色・メッセージ配列のランダム選択を組み合わせて、「今日の運勢アプリ」が完成しました。ここからはメッセージや画像の追加、判定ロジックの工夫などで、自由に発展させてください。
