このコードでは基準となるセル位置をSet myPs・・・ といった具合に設定して処理を行っています。
コード内ではmyPsに注意してみていただくと処理方法が理解しやすいと考えます。
ループを抜ける条件など、コードを修正しました(2013年6月21日)
月の表示を変更しました。(2017年5月12日)
Sub calendar_make2()
'カレンダー作成
'
Dim sh1 As Worksheet
Dim i As Integer, j As Integer
Dim myDay As Date
Dim myPs As Range
Dim Holiday As Range
Dim iCol As Variant, fCol As Variant
Dim myFlg As Boolean
Dim sYear As Integer, eYear As Integer
Dim sMonth As Integer, eMonth As Integer
Dim sDay As Integer, eDay As Integer
Dim gyokan As Long, mycnt As Long
Set sh1 = Worksheets("カレンダー") 'カレンダーを作成するシートを sh1 としています
Set Holiday = Worksheets("祝日").Range("A1:A84") '祝日が入力されている範囲の値を配列に読み込んでいます
Application.ScreenUpdating = False '画面の自動更新を停止します
gyokan = 4 ’行間隔を 4 としています
With sh1
'値、セルの塗りつぶしの色 フォントの色をクリアします
With .Range("D4:AI100") 'とりあえず100行目までを設定範囲として考えています。
.ClearContents
.Interior.ColorIndex = xlNone
.Font.ColorIndex = 0
End With
'設定年月日
sYear = Year(.Range("E2").Value) '開始年月日の年
sMonth = Month(.Range("E2").Value) '開始年月日の月
sDay = Day(.Range("E2").Value) '開始年月日の日
eYear = Year(.Range("E3").Value) '終了年月日の年
eMonth = Month(.Range("E3").Value) '終了年月日の月
eDay = Day(.Range("E3").Value) '終了年月日の日
For i = 1 To 12 ’月単位でループ
For j = 1 To 32 '日単位でループ
’入力する日付
myDay = DateSerial(sYear, sMonth - 1 + i, sDay - 1 + j) '開始年月日に i 月と j 日を1づつ加算する
'ループを抜ける条件
If Day(myDay) = sDay Then
myCnt = myCnt + 1
If myCnt = 2 Then
myCnt = 0
Exit For
End If
End If
'終了日になったら終了する
If myDay > DateSerial(eYear, eMonth, eDay) Then
Application.ScreenUpdating = True
End
End If
'月、日にちをセルに入力する
.Cells(2 + gyokan * i, 4).Value = Month(.Cells(2 + gyokan * i,
5).Value) & "月" '月を入力
.Cells(2 + gyokan * i + 1, 4).Value = "曜日" '文字"曜日"を入力
'入力するセルを指定 Cell(2+4*1,4+1)=Cell(6,5) つまり E6セルを開始セルとしています
' これに i と j を加えて入力セル位置が指定されます
Set myPs = .Cells(2 + gyokan * i, 4 + j)
myPs.Value = myDay
myPs.NumberFormatLocal = "d" '表示形式を"d"に設定しています。
'曜日を入力
myPs.Offset(1, 0).Value = Format(myDay, "aaa")
'土日check
myFlg = False
Select Case myPs.Offset(1, 0).Value
Case "土"
iCol = 34 ’塗りつぶしの色番号
fCol = 5 'フォントの色番号
myFlg = True
Case "日"
iCol = 36
fCol = 3
myFlg = True
End Select
'祝日check
If WorksheetFunction.CountIf(Holiday, myPs.Value) = 1 Then
iCol = 40
fCol = 3
myFlg = True
End If
'着色 土日祝日の時(myFlg = True)に実行
If myFlg = True Then
.Range(myPs, myPs.Offset(1, 0)).Interior.ColorIndex = iCol
.Range(myPs, myPs.Offset(1, 0)).Font.ColorIndex = fCol
End If
Next j
Next i
End With
Application.ScreenUpdating = True
End Sub