先週、とある102期の卒業生が遊びに来て「VBAで困っていることがある」と相談(?)されました。
話によると、入社学習用に宿題を出されたようで、その内容が「1年分のカレンダーを作るマクロを組まなければならない」というものでした。
「中々おもしろい宿題だな」と豪先生と自分とで意見が一致したので、現役生に向けて「課題が早く終わった人の挑戦問題」と設定したところ、数名がTeamsに投稿してくれました。スゴイ!!
また、その中の1人である小林さんは説明動画まで作ってくださいましたので、こちらで共有したいと思います。字幕もついていて分かりやすかったです。
「作成目的は僕の説明能力の向上なので『優しい』ご指導ご鞭撻をお待ちしております。泣いちゃうので」とのことです。
自分の学習成果を発信することで、ほかの方の学習サポートをするほか、いろいろな指摘も成長課題として受け取ろうとしている姿勢が市民開発者らしいですね!
学習成果の発信は、良いことばかりだと思います。豪先生のご指摘以外にも「色々な情報が集まってくるようになる」という点でも利があるからです。
例えば、アプリ作成において「今後こういう機能を追加したい」や「この部分で困っている」など、現時点で考えていることを他者と共有すると、考えの整理に繋がったり、それに関する情報が集まってきたりします。
もちろん、最終目的地である「完璧なアプリ」を見失ってはならないのですが、その一方で、最初から完璧を求めてしまうと、必ず息苦しくなってきます。
未完の状態でも発信することに意義がある…。筆者は、そう思います。
最後に、いろんな解答が集まったので紹介したいと思います。
黒歴史になると思いますが言い訳せずに貼ります!うるう年には対応してない、自力でやった結果DateSerial関数使わずに終わりました。
Sub カレンダー作成()
Dim 月 As Integer
Dim 年 As Integer
Dim 日 As Integer
年 = InputBox("作成するカレンダーの年を西暦4桁で入力してください。")
ActiveSheet.Name = 12 & "月"
For 日 = 1 To 31
Cells(日 + 1, 1).Value = 年 & "/" & 12 & "/" & 日
Columns(1).AutoFit
Next 日
For 月 = 11 To 1 Step -1
If 月 = 2 Then
Worksheets.Add.Name = 月 & "月"
For 日 = 1 To 28
Cells(日 + 1, 1).Value = 年 & "/" & 月 & "/" & 日
Cells(日 + 1, 1).NumberFormat = "yyyy年M月d日(aaa)"
Next 日
Columns(1).AutoFit
ElseIf 月 = 4 Or 月 = 6 Or 月 = 9 Or 月 = 11 Then
Worksheets.Add.Name = 月 & "月"
For 日 = 1 To 30
Cells(日 + 1, 1).Value = 年 & "/" & 月 & "/" & 日
Cells(日 + 1, 1).NumberFormat = "yyyy年M月d日(aaa)"
Next 日
Columns(1).AutoFit
Else
Worksheets.Add.Name = 月 & "月"
For 日 = 1 To 31
Cells(日 + 1, 1).Value = 年 & "/" & 月 & "/" & 日
Cells(日 + 1, 1).NumberFormat = "yyyy年M月d日(aaa)"
Next 日
Columns(1).AutoFit
End If
Next 月
End Sub
2022年の1年分だけですが出来ました
Sub カレンダー作成()
Dim Y As Long
Dim M As Long
Dim D As Long
Y = 2022
M = 1
D = 1
Do
ActiveCell.Value = DateSerial(Y, M, D)
D = D + 1
If Year(ActiveCell) = 2023 Then
Exit Do
End If
ActiveCell.Offset(1).Select
Loop
ActiveCell.ClearContents
End Sub
できたで…!
Sub fromYtodate()
Dim Y As Integer
Dim I As Integer
Application.ScreenUpdating = False
Y = InputBox(年)
Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Y & "年"
Do Until I = 2
Range("b1") = Format(DateSerial(Val(ActiveSheet.Name), 1, 1), "m月d日")
Range("b1").Select
Do Until ActiveCell.Value = DateSerial(Val(ActiveSheet.Name), 12, 31)
ActiveCell.Offset(1).Value = Format(ActiveCell.Value + 1, "m月d日")
If Day(ActiveCell.Value) = 1 Then
ActiveCell.Offset(, -1).Value = Month(ActiveCell.Value) & "月"
End If
If Weekday(ActiveCell.Value) = vbSaturday Or Weekday(ActiveCell.Value) = vbSunday Then
ActiveCell.Interior.Color = RGB(55, 92, 119)
End If
If Weekday(ActiveCell.Value) = vbSunday Then
ActiveCell.Interior.Color = RGB(239, 69, 74)
End If
ActiveCell.Offset(1).Select
If ActiveCell.Value = Date Then
Exit Sub
End If
Loop
Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Val(ActiveSheet.Name) + 1 & "年"
Loop
Application.ScreenUpdating = True
End Sub
それにしても103期、おもしろい人たちが集ったものです。私もダラダラしていてはいけませんね!