VB(Visual Basic)でカレンダーを作ってみた。

VisualBasicでカレンダーを作ってみました。
パソコンを起動して、すぐにカレンダーが開けるといいなあ、と思って作ってみました。
最初は、単なるカレンダーだけでしたが、使っているうちに、休日を赤く表示したい。
その次は、休日をクリックしたら、休日名が表示されるといい、などプロクラムは進化・複雑化していきました。
初心者用の本を購入して読んだり、WEBで情報を得たりして作っていきました。
最初にフォームを作ります。

フォームを図のように設定します。
気をつけなければいけないところは、Labelの設定です。Label1~Label42までは大きさを揃えて、規則正しく設定していきます。
ComboBoxには、年号(2023,2024,2025)や月(1,2,3,4,5,6,7,8,9,10,11,12)を入力します。
Label43からは、曜日の設定です。
これで、フォームは出来上がり!
Excelで次のようなCSVファイルを作ります。

プログラムでは、2年間分のデータを読み込めるようにしています。
それ以上のデータを入れるとエラーになります。
このデータは内閣府のホームページでも公開されているので、CSVファイルをダウンロードして、2年間分だけを取り出してください。
内閣府のホームページ
加工したファイルを、Cドライブに¥syukujituというフォルダを作って、Date2.csvとして保存します。
CSVファイルからデータを取り込む参考プログラム~1/4
CSVファイルからデータを取り込む参考プログラムはwebで公開されていました。
意外に、すぐできました。
ここからは、プログラムを4つの画面に分けて載せていきます。
コピーしてエディターでつなぎ合わせると1つのプログラムになります。
Call Hyouji()というのは、繰り返し使うプログラムをプロシージャにしました。
Public Class Form1
Dim myyear, mymonth As Integer
Dim youbi, matujitu As Integer
Dim mydate As DateTime
Dim mdate As DateTime
Dim bangou, bangou2 As Integer
Dim clickdate As Date
'休日設定をする
Dim kyujitu(80) As String
Private Sub Form1_Load(sender As Object, e As EventArgs) _
Handles MyBase.Load
'C:\syukujitu\Date.csv ファイルから祝日データを読み込む
Using MyReader As New Microsoft.VisualBasic.
FileIO.TextFieldParser("C:\syukujitu\Date2.csv")
MyReader.TextFieldType = FileIO.FieldType.Delimited
MyReader.SetDelimiters(",")
Dim currentRow As String()
While Not MyReader.EndOfData
Try
currentRow = MyReader.ReadFields()
Dim currentField As String
For Each currentField In currentRow
bangou += 1
kyujitu(bangou) = currentField
Next
' MsgBox("")
Catch ex As Microsoft.VisualBasic.
FileIO.MalformedLineException
MsgBox("Line " & ex.Message &
"is not valid and will be skipped.")
End Try
End While
'MsgBox("?")
End Using
'起動したときにその月のカレンダーを表示
ComboBox1.Text = Year(DateTime.Now)
ComboBox2.Text = Month(DateTime.Now)
myyear = Integer.Parse(ComboBox1.Text)
mymonth = Integer.Parse(ComboBox2.Text)
Call Hyouji() 'プロシージャ Hyouji() を呼び出す
End Sub
Labelをクリックするとyomikomi(1~42)を呼び出すプログラムです。~2/4
次のプログラムは全部同じコマンドの繰り返しです。
ここでも、Call文を使っています。
何も考えずにコピぺしてください。
Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click
Call yomikomi(1)
End Sub
Private Sub Label2_Click(sender As Object, e As EventArgs) Handles Label2.Click
Call yomikomi(2)
End Sub
Private Sub Label3_Click(sender As Object, e As EventArgs) Handles Label3.Click
Call yomikomi(3)
End Sub
Private Sub Label4_Click(sender As Object, e As EventArgs) Handles Label4.Click
Call yomikomi(4)
End Sub
Private Sub Label5_Click(sender As Object, e As EventArgs) Handles Label5.Click
Call yomikomi(5)
End Sub
Private Sub Label6_Click(sender As Object, e As EventArgs) Handles Label6.Click
Call yomikomi(6)
End Sub
Private Sub Label7_Click(sender As Object, e As EventArgs) Handles Label7.Click
Call yomikomi(7)
End Sub
Private Sub Label8_Click(sender As Object, e As EventArgs) Handles Label8.Click
Call yomikomi(8)
End Sub
Private Sub Label9_Click(sender As Object, e As EventArgs) Handles Label9.Click
Call yomikomi(9)
End Sub
Private Sub Label10_Click(sender As Object, e As EventArgs) Handles Label10.Click
Call yomikomi(10)
End Sub
Private Sub Label11_Click(sender As Object, e As EventArgs) Handles Label11.Click
Call yomikomi(11)
End Sub
Private Sub Label12_Click(sender As Object, e As EventArgs) Handles Label12.Click
Call yomikomi(12)
End Sub
Private Sub Label13_Click(sender As Object, e As EventArgs) Handles Label13.Click
Call yomikomi(13)
End Sub
Private Sub Label14_Click(sender As Object, e As EventArgs) Handles Label14.Click
Call yomikomi(14)
End Sub
Private Sub Label15_Click(sender As Object, e As EventArgs) Handles Label15.Click
Call yomikomi(15)
End Sub
Private Sub Label16_Click(sender As Object, e As EventArgs) Handles Label16.Click
Call yomikomi(16)
End Sub
Private Sub Label17_Click(sender As Object, e As EventArgs) Handles Label17.Click
Call yomikomi(17)
End Sub
Private Sub Label18_Click(sender As Object, e As EventArgs) Handles Label18.Click
Call yomikomi(18)
End Sub
Private Sub Label19_Click(sender As Object, e As EventArgs) Handles Label19.Click
Call yomikomi(19)
End Sub
Private Sub Label20_Click(sender As Object, e As EventArgs) Handles Label20.Click
Call yomikomi(20)
End Sub
Private Sub Label21_Click(sender As Object, e As EventArgs) Handles Label21.Click
Call yomikomi(21)
End Sub
Private Sub Label22_Click(sender As Object, e As EventArgs) Handles Label22.Click
Call yomikomi(22)
End Sub
Private Sub Label23_Click(sender As Object, e As EventArgs) Handles Label23.Click
Call yomikomi(23)
End Sub
Private Sub Label24_Click(sender As Object, e As EventArgs) Handles Label24.Click
Call yomikomi(24)
End Sub
Private Sub Label25_Click(sender As Object, e As EventArgs) Handles Label25.Click
Call yomikomi(25)
End Sub
Private Sub Label26_Click_1(sender As Object, e As EventArgs) Handles Label26.Click
Call yomikomi(26)
End Sub
Private Sub Label27_Click(sender As Object, e As EventArgs) Handles Label27.Click
Call yomikomi(27)
End Sub
Private Sub Label28_Click(sender As Object, e As EventArgs) Handles Label28.Click
Call yomikomi(28)
End Sub
Private Sub Label29_Click(sender As Object, e As EventArgs) Handles Label29.Click
Call yomikomi(29)
End Sub
Private Sub Label30_Click(sender As Object, e As EventArgs) Handles Label30.Click
Call yomikomi(30)
End Sub
Private Sub Label31_Click(sender As Object, e As EventArgs) Handles Label31.Click
Call yomikomi(31)
End Sub
Private Sub Label32_Click(sender As Object, e As EventArgs) Handles Label32.Click
Call yomikomi(32)
End Sub
Private Sub Label33_Click(sender As Object, e As EventArgs) Handles Label33.Click
Call yomikomi(33)
End Sub
Private Sub Label34_Click(sender As Object, e As EventArgs) Handles Label34.Click
Call yomikomi(34)
End Sub
Private Sub Label35_Click(sender As Object, e As EventArgs) Handles Label35.Click
Call yomikomi(35)
End Sub
Private Sub Label36_Click(sender As Object, e As EventArgs) Handles Label36.Click
Call yomikomi(36)
End Sub
Private Sub Label37_Click(sender As Object, e As EventArgs) Handles Label37.Click
Call yomikomi(37)
End Sub
Private Sub Label38_Click(sender As Object, e As EventArgs) Handles Label38.Click
Call yomikomi(38)
End Sub
Private Sub Label39_Click(sender As Object, e As EventArgs) Handles Label39.Click
Call yomikomi(39)
End Sub
Private Sub Label40_Click(sender As Object, e As EventArgs) Handles Label40.Click
Call yomikomi(40)
End Sub
Private Sub Label41_Click(sender As Object, e As EventArgs) Handles Label41.Click
Call yomikomi(41)
End Sub
Private Sub Label42_Click(sender As Object, e As EventArgs) Handles Label42.Click
Call yomikomi(42)
End Sub
プログラム~3/4
Buttonを押すとカレンダーを一回全てクリアし、ComboBoxからデータを取得してカレンダーを表示します。
Private Sub Button1_Click(sender As Object, e As EventArgs) _
Handles Button1.Click
'カレンダーを一回クリアする
For i As Integer = 1 To 37
Me.Controls("Label" & i).Text = ""
Me.Controls("Label" & i).BackColor = Me.BackColor
Me.Controls("Label" & i).ForeColor = Color.Black
Next
'日曜日を赤に再設定する
For i2 As Integer = 1 To 37 Step 7
Me.Controls("Label" & i2).ForeColor = Color.Red
Next
'土曜を青に再設定する
For i3 As Integer = 7 To 37 Step 7
Me.Controls("Label" & i3).ForeColor = Color.Blue
Next
'コンボボックスから、年と月を取得する
myyear = Integer.Parse(ComboBox1.Text)
mymonth = Integer.Parse(ComboBox2.Text)
Call Hyouji() 'プロシージャ Hyouji() を呼び出す
End Sub
最後のプログラムです。~4/4
Hyoujiとyomikomi、2つのプロシージャです。
Hyoujiは、Labelに日にちを入れたり、休日を赤く表示したり、今日の日を黄色に表示するプログラムです。
yomikomiは、Label1~42がクリックされると呼び出され、休日を表示します。
配列の読み取りから、CSVファイルから読み取る配列の順番では、Excelの表A列のデータは奇数。B列のデータは偶数なので
For bangou2 = 1 To bangou Step 2
If clickdate = kyujitu(bangou2) Then '休日の設定
MsgBox(kyujitu(bangou2 + 1)) '休日の次の配列を読み込む
End If
Next
となります。
Public Sub Hyouji()
'12月になったら月の調整をする
If mymonth = 12 Then
mydate = New Date(myyear + 1, 1, 1)
Else
mydate = New Date(myyear, mymonth + 1, 1)
End If
'曜日を数値で取得して開始番号とする(1を引く)
youbi = Weekday(New Date(myyear, mymonth, 1)) - 1
'末日の表示
matujitu = Integer.Parse(DateAdd("d", -1, mydate).ToString("dd"))
For i As Integer = 1 To matujitu
'ラベルに日にちを入れる
Me.Controls("Label" & i + youbi).Text = i.ToString
'西暦を含めた日にちを取得
mdate = (myyear & "/" & mymonth & "/" & i)
'今日の日と同じ日だったら背景を黄色にする
If mdate = DateTime.Now.ToShortDateString() Then
Me.Controls("Label" & i + youbi).BackColor = Color.Yellow
End If
' kyujituと同じ日にちをの文字表示を赤に設定する
For bangou2 = 1 To bangou Step 2
'MsgBox(bangou2)
If mdate = kyujitu(bangou2) Then '休日の設定
Me.Controls("Label" & i + youbi).ForeColor =
Color.FromArgb(255, 1, 1) '赤
End If
Next
Next
End Sub
Public Sub yomikomi(ByVal ti As Integer)
If Me.Controls("Label" & ti).Text <> "" Then
clickdate = myyear & "/" & mymonth & "/" & Me.Controls("Label" & ti).Text
For bangou2 = 1 To bangou Step 2
If clickdate = kyujitu(bangou2) Then '休日の設定
MsgBox(kyujitu(bangou2 + 1)) '休日の次の配列を読み込む
End If
Next
Else
End If
End Sub
End Class
以下、購入して勉強した書籍を載せておきます。
- できる Excel VBA プログラミング入門(impress)
ISBN978-4-295-00475-2 - Excel VBA逆引き辞典パーフェクト(翔泳社)
ISBN978-4-7981-4658-4 - できる ホームページHTML&CSS入門(impress)
ISBN978-4-295-00074-7 - ゼロからわかる Visual Basic 超入門(技術評論社)
ISBN978-4-7741-9117-1