Option Explicit
Dim c, saKi, saiGo, yoKo, Gyo As Long '変数をカテゴリー別にまとめた
Dim Hiduke, hiNiti As Date
Dim Sum, Ctrl, ws As Worksheet
Dim SumrA, CtrlA1, CtrlF2 As Range
Dim Syuku As Boolean
'これくらいのものであれば、シート作成とカレンダ―内の作業の
'プロシージャを分けなくてもそこまでややこしくないと考え、一緒にした。
Sub Carenda_soukatu()
Sheet_sakujo
Hiduke = #1/1/2021#
Set Sum = Worksheets("Summary")
Set Ctrl = Worksheets("Control")
Set CtrlA1 = Ctrl.Range("A1")
For c = 1 To 12
Sum.Copy after:=Sheets(Sheets.Count)
ActiveSheet.Name = c & "月"
Next
For c = 1 To 12
Worksheets(c & "月").Activate
saiGo = Sum.Range("A" & Sum.Rows.Count).End(xlUp).Row + 1
Carenda_main
Hiduke = DateAdd("m", 1, Hiduke)
Next
Ctrl.Activate
End Sub
Sub Carenda_main()
hiNiti = Hiduke
saKi = 0
With Range("A2")
Do While Month(hiNiti) = Month(Hiduke)
.Offset(saKi).Value = hiNiti
.Offset(saKi, 1).Value = WeekdayName(Weekday(hiNiti))
.Offset(saKi, 2).Value = #9:00:00 AM#
.Offset(saKi, 3).Value = #5:00:00 PM#
.Offset(saKi, 4).Formula = "=" & .Offset(saKi, 3).Address & "-" & .Offset(saKi, 2).Address
Set SumrA = Sum.Range("A" & saiGo)
For yoKo = 0 To 4
SumrA.Offset(saKi, yoKo).Formula = "=" & .Worksheet.Name & "!" & .Offset(saKi, yoKo).Address
Next
Syuku_hantei
Set CtrlF2 = Ctrl.Range("F2") '4回も出てきて煩わしいので1つの変数として置いた
If Syuku = True Then
With Range(.Offset(saKi), .Offset(saKi, 4))
.Interior.Color = CtrlF2.Interior.Color
.Font.Color = CtrlF2.Font.Color
End With
With Range(SumrA.Offset(saKi), SumrA.Offset(saKi, 4))
.Interior.Color = CtrlF2.Interior.Color
.Font.Color = CtrlF2.Font.Color
End With
Else
With Range(.Offset(saKi), .Offset(saKi, 4))
.Interior.Color = CtrlA1.Offset(Weekday(hiNiti)).Interior.Color
.Font.Color = CtrlA1.Offset(Weekday(hiNiti)).Font.Color
End With
With Range(SumrA.Offset(saKi), SumrA.Offset(saKi, 4))
.Interior.Color = CtrlA1.Offset(Weekday(hiNiti)).Interior.Color
.Font.Color = CtrlA1.Offset(Weekday(hiNiti)).Font.Color
End With
End If
hiNiti = DateAdd("d", 1, hiNiti)
saKi = saKi + 1
Loop
End With
End Sub
Sub Syuku_hantei()
Syuku = False
For Gyo = 2 To 18
'あくまで今年のカレンダーを作ったため↓。
If Month(hiNiti) = Month(Ctrl.Range("C" & Gyo).Value) And _
Day(hiNiti) = Day(Ctrl.Range("C" & Gyo).Value) Then
Syuku = True
Exit For
End If
Next
End Sub
Sub Sheet_sakujo()
Application.DisplayAlerts = False
For Each ws In Worksheets
If ws.Name <> "Control" And ws.Name <> "Summary" Then
ws.Delete
End If
Next
Application.DisplayAlerts = True
Sum_clear
End Sub
Sub Sum_clear()
Set Sum = Worksheets("Summary")
saiGo = Sum.Range("A" & Sum.Rows.Count).End(xlUp).Row
If saiGo > 1 Then
With Sum.Range("A2:E" & saiGo)
.ClearContents
.Interior.Color = xlNone
.Font.Color = vbBlack
End With
End If
End Sub
'この例では、変数を宣言する目的で使用された Dim ステートメントを示しています。 また、配列を宣言する目的で使用された Dim ステートメントも示しています。 配列の添字の既定の下限は0で、 Option Baseステートメントを使用してモジュールレベルで上書きすることができます。
'
' Multiple declarations on a single line. AnotherVar is of type Variant
' because its type is omitted.
Dim AnotherVar, Choice As Boolean, BirthDate As Date
'1 つの As 句で複数の変数を宣言する場合、その変数のグループの初期化子を指定することはできません。
'宣言する変数ごとに個別の As 句を使用して、異なる変数に異なるデータ型を指定できます。 各変数は、variablename 部分の後に最初に検出される As 句に指定されたデータ型を受け取ります。
Dim a, b, c As Single, x, y As Double, i As Integer
' a, b, and c are all Single; x and y are both Double
受講生さんの投稿
(投稿ID: 5010)
空でカレンダーマクロを1から作りましたので添削して頂けると嬉しいです。
コメント部分に自身なりの考えでアレンジした部分を示しています。
よろしくお願いします。(`・ω・´)
小川 慶一さんのコメント
(コメントID: 7156)
おはようございます。
拝見しました。
特に重要な指摘事項はないかと思います。
変数宣言では、各変数ごとに、型を示してください。
でないと、最後の1つ以外は型宣言なし(Variant型)とみなされてしまいます。
このくらいできるようになれば、発展編1技術は十分に習得できていることと思います。
らりおさんのコメント
(コメントID: 7160)
こんばんは。早速の添削ありがとうございました。
職場でこのような宣言の仕方をしているマクロを発見し、使ってみたのですが、最後のものしか型指定できていないことになるのですね。
使う前に自分でもよくよく吟味してみるべきでした。
ご指摘ありがとうございます。
> 受講生 さん:
>
> おはようございます。
>
> 拝見しました。
> 特に重要な指摘事項はないかと思います。
>
> 変数宣言では、各変数ごとに、型を示してください。
> でないと、最後の1つ以外は型宣言なし(Variant型)とみなされてしまいます。
>
>
>
> このくらいできるようになれば、発展編1技術は十分に習得できていることと思います。
>
小川 慶一さんのコメント
(コメントID: 7205)
追加でひとつお伝えしたいことを思い出してお返事しています。
> 職場でこのような宣言の仕方をしているマクロを発見し、使ってみたのですが、最後のものしか型指定できていないことになるのですね。
この間違いは、よく見かけますね。
VBはVBでも、VB.NETという別の言語だと、提案のような書き方で、すべてについて型を指定できます。
そのため、混同されている方が多いようです。
以下の両記事を参考にしてください。
どちらも、Microsoftが出している公式ドキュメントです。
前者はVBAの、後者は VB.NETの変数宣言についての記事です。それぞれで引用しているコードをドキュメント内で見つけて、読んでみてください。
良い勉強になるかと思います。
【VBA】
Docs > Office VBA > リファレンス > 言語リファレンス > リファレンス > ステートメント > Dim
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/dim-statement
【VB.NET】
Docs > .NET > Visual Basic ガイド > 言語リファレンス > Dim ステートメント (Visual Basic)
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/statements/dim-statement
複数の変数の宣言