|
こんにちは
簡単な説明を入れときました。
Sub Test()
Dim Myda As Date, cur_date As Date, cur_eddate As Date, lp As Long
Dim Co As Long, Co1 As Long, DaSt(4) As String, DaSt1(4) As Date
Dim DaSu(4) As String, DaSu1(4) As Date, C As Range, Ma, Ma1
Myda = Date
cur_date = DateSerial(Year(Myda), Month(Myda), 1) '現在の月の初日
cur_eddate = DateSerial(Year(Myda), Month(Myda) + 1, 0) '現在の月の最後
Co = 1: Co1 = 1
''現在の月の初日から'現在の月の最後日までループさせる
For lp = 0 To DateDiff("d", cur_date, cur_eddate)
'Weekday関数にて曜日を区分(土曜、日曜のみ)
Select Case Weekday(Format(DateAdd("d", lp, cur_date), "yyyy/m/d"))
Case 7
'その日が土曜なら配列変数に第何土曜日かをセット(変数Coにて1,2,3,4,5を決める)
DaSt(Co) = "第" & Co & "土曜日"
'その日を配列変数にセット
DaSt1(Co) = Format(DateAdd("d", lp, cur_date), "yyyy/m/d")
Co = Co + 1
Case 1
'その日が日曜なら配列変数に第何日曜日かをセット(変数Co1にて1,2,3,4,5を決める)
DaSu(Co1) = "第" & Co1 & "日曜日"
'その日を配列変数にセット
DaSu1(Co1) = Format(DateAdd("d", lp, cur_date), "yyyy/m/d")
Co1 = Co1 + 1
End Select
Next
'ループにてデータ分回す
For Each C In Range("A1", Range("A65536").End(xlUp))
'Match関数にて配列変数の値と一致するのがあるかを確認(土曜日分)
Ma = Application.Match(C.Value, DaSt, 0)
'一致したかの有無をIF文で確認
If Not IsError(Ma) Then
'あった場合セルへ日付を転記(土曜日分)
C.Value = DaSt1(Ma - 1)
Else
'無かった場合、Match関数にて配列変数の値と一致するのがあるかを確認(日曜日分)
Ma1 = Application.Match(C.Value, DaSu, 0)
'一致したかの有無をIF文で確認
If Not IsError(Ma1) Then
'あった場合セルへ日付を転記(日曜日分)
C.Value = DaSu1(Ma1 - 1)
End If
End If
Next
End Sub
>C.Value = DaSu1(Ma1 - 1)
なぜ、(Ma1-1)になるかと言うと変数「DaSu1」は
DaSu1(0),DaSu1(1),DaSu1(2),DaSu1(3),DaSu1(4)となり
各変数に値がセットされいます。
Match関数で一致した場合、変数Ma1には「1〜5」の値が返ってきます。
と言う事は、実際の値を転記するには「1=DaSu1(0)」となるため
「-1」する必要があるのです。
|
|