VBでカレンダー作成

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ファイルを作ります。

excel画像

プログラムでは、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   
     


以下、購入して勉強した書籍を載せておきます。