土曜日, 9月 05, 2020

Visual Studio Basic_15 
カレンダー表示と閏年設定

カレンダー表示と閏年設定について簡単に整理してみました。

VS Basicを起動したら[新しいプロジェクトの作成]にて新規プログラム作成モードに入ります。最初にTextBox3つ、Button2つ、Label2つを配置します。

プロパティーにて文字やパーツのサイズを調整して上の様なレイアウトとしました。次にソースです。TextBox1、2の文字サイズは12ポイントとしています。

ところで、ソース中のcal(36)は何故36か?
1週間は7日。日曜日から始まると最後は土曜日。土曜日が1日の月の場合はCal(6)。そのまま31日まで進むとCal(36)というわけです。

「-----------------」は区切り線なので記述の必要はありません。
青字は自動入力部分で修正の必要はありません。
黒字が入力部分です。
赤字はコメント文なので記述の必要はありません。

-----------------
Public Class Form1
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        ' c_year, c_month, i, m, h, r, p は整数型変数
        Dim c_year, c_month, i, m, h, r, p As Integer
        ' Cal() は 36 までの整数型変数
        Dim cal(36) As Integer
        TextBox3はスタート時のデータは無し
        TextBox3.Text = ""
        Dim tuki() As Integer = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
        ' tuki() は整数型変数で 12 ヶ月分の日数を1月から、
        ' 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
        ' と入れる。最初の0は最初に入れるダミーデータとしての「0」。
        c_year = Val(TextBox1.Text)
        ' c_yearに入力した文字を数値に変換して入れる
        c_month = Val(TextBox2.Text)
        ' c_monthに入力した文字を数値に変換して入れる
        If c_year Mod 4 = 0 Then tuki(2) = 29
        If c_year Mod 100 = 0 Then tuki(2) = 28
        If c_year Mod 400 = 0 Then tuki(2) = 29
        ' 閏年のときは2月[tuki(2)]の最終日を29日に修正する
        ' 西暦を4で割って余りが出なければ閏年である。
        ' ただし、続けて100で割って余りが出なければ閏年ではない。
        ' 常に西暦を400で割って余りが出なければ閏年である。
        ' 1年365日で1日、閏年は曜日が2日ズレる
        ' 西暦0001年からの曜日のずれの日数を計算する
         m = c_year + (c_year - 1) \ 4 - (c_year - 1) \ 100 + (c_year - 1) \ 400
        ' 1月1日から前月までの延べ日数を計算する
        h = 0
        For i = 1 To c_month - 1
            h = h + tuki(i)
        Next
        r = (m + h) Mod 7
        ' その月の朔日(毎月の第一日の曜日を求める
        ' 日数の配列 cal に日付を入れる↓
        ' cal(i)  = cal(i) +1という感じ
        p = 1
        For i = r To r + tuki(c_month) - 1
            cal(i) = p
            p = p + 1
        Next
        ' カレンダーを表示する
        TextBox3.Text &= vbCr
        ' 改行する
        TextBox3.Text &= Space(1) & "日" & vbTab & "月" & vbTab & "火" & vbTab & "水" & vbTab & "木" & vbTab & "金" & vbTab & "土"
        ' 日月火水木金土をTabキーを鋏んで表示。
        TextBox3.Text &= vbCrLf
        ' 改行する
        For i = 0 To 36
            If i Mod 7 = 0 Then TextBox3.Text &= vbCrLf + vbCrLf
         日数の配列calが36まで7で割って余りが出なければ改行2回を繰り返す。
         vbCrLfは改行、 vbCrLf + vbCrLfで改行を2回
            If cal(i) = 0 Then
                TextBox3.Text &= vbTab
         ' calが0(1日以前)であればTextBox3にTabキーを入れる
         vbTabはTabキー
            Else
                TextBox3.Text &= Str(cal(i)) & vbTab
         ' TextBaoc3には日数の配列calとTabキーを入れて繰り返す。
            End If
        Next
    End Sub
-----------------
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ' プログラムを終了
        End
    End Sub
End Class
-----------------
ソース記述中にエラーがなければデバッグです。


西暦と月を入力

指定した月のカレンダーが表示。今回はソースが長いので1桁の日の桁が合っていないのはご愛敬。

Visual Studio Basic 2019