2017-07-18 30 views
0

月曜日の日付を返すようにするには、次のコードを返信してください。 dateaddが土曜日と日曜日にヒットする場合。残念ながら、dateaddが土曜日または日曜日にはならないにもかかわらず、月曜日は常に返されます。次の日付に移動する土曜日と日曜日の場合にのみ月曜日に追加

は、必要なときに、それはとにかくのみ月曜日返すためにこのコードを改善するためですか?

Private Sub Worksheet_Change(ByVal target As Range) 


Dim d1 As Date, d2 As Date, d3 As Date 

    d1 = NextMonday(Date, 1) 
    d2 = NextMonday(Date, 7) 
    d3 = NextMonday(Date, 5) 

    If Not Intersect(target, Range("H3:H150")) Is Nothing Then 
     If target.Value = 7 Then 
     target.Offset(0, 1).Value = d2 
     ElseIf target.Value = 5 Then 
     target.Offset(0, 1).Value = d3 
     ElseIf target.Value = 1 Then 
     target.Offset(0, 1).Value = d1 
     Else 
     End If 
    End If 
    End Sub 

Function NextMonday(dtDate As Date, lngDaysToAdd As Long) 
    Dim intDaysOffset As Integer 
    NextMonday = DateAdd("d", lngDaysToAdd, dtDate) 
    intDaysOffset = (7 - Weekday(NextMonday, vbMonday)) + 1 
    NextMonday = DateAdd("d", intDaysOffset, NextMonday) 
End Function 

答えて

0

は、日付が週末の日でなければなりませんあなたは月曜日を返すために、この汎用関数を使用することができ、あなたの「着陸日付を」見つけた:

Public Function DateSkipWeekend(_ 
    ByVal datDate As Date, _ 
    Optional ByVal booReverse As Boolean) _ 
    As Date 

' Purpose: Calculate first working day equal to or following/preceding datDate. 
' Assumes: 5 or 6 working days per week. Weekend is (Saturday and) Sunday. 
' Limitation: Does not count for public holidays. 
' 
' May be freely used and distributed. 
' 1999-07-03, Gustav Brock, Cactus Data ApS, Copenhagen 

    Const cintWorkdaysOfWeek As Integer = 5 

    Dim bytSunday As Byte 
    Dim bytWeekday As Byte 

    bytSunday = Weekday(vbSunday, vbMonday) 
    bytWeekday = Weekday(datDate, vbMonday) 

    If bytWeekday > cintWorkdaysOfWeek Then 
    ' Weekend. 
    If booReverse = False Then 
     ' Get following workday. 
     datDate = DateAdd("d", 1 + bytSunday - bytWeekday, datDate) 
    Else 
     ' Get preceding workday. 
     datDate = DateAdd("d", cintWorkdaysOfWeek - bytWeekday, datDate) 
    End If 
    End If 

    DateSkipWeekend = datDate 

End Function 

そして、あなたの関数内:

Function NextMonday(dtDate As Date, lngDaysToAdd As Long) 
    NextMonday = DateSkipWeekend(DateAdd("d", lngDaysToAdd, dtDate)) 
End Function 
+0

サブコードでこの機能をどのように紹介しますか?多くのありがとう – Tom

+0

私は答えを編集しました。 Select Caseは必要ありません。 – Gustav

+0

ご協力いただきありがとうございます。本当に幸い – Tom

0

結果の日を確認し、それに応じて戻り値を設定します。しかし、もちろん、あなたの関数はに改名する必要があります、私はNextWorkdayをお勧めしますので、週末の日だけをスキップしたいです。

Function NextWorkday(dtDate As Date, lngDaysToAdd As Long) 
    NextWorkday = dtDate + lngDaysToAdd 
    Select Case Weekday(NextWorkday, vbMonday) 
     Case 6: NextWorkday = NextWorkday + 2 
     Case 7: NextWorkday = NextWorkday + 1 
    End Select 
End Function 

私はあなたには、いくつかの値に対してのみ更新されている理由はわからないんだけど、それでもこのチェックをしたい場合は、あなたのコードは、これに翻訳することができます。

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Column <> Columns("H").Column Then Exit Sub 
    Select Case Target.Value2 
    Case 1, 5, 7: Target.Offset(0, 1).value = NextWorkday(Date, Target.Value2) 
    End Select 
End Sub 
+0

サブコードでこの機能をどのように紹介しますか?多くのありがとう – Tom

+0

@Tomは、 'Target.Value'が' 1、5、または7'の場合にのみ更新する理由はありますか?それとも、同じ問題を解決しようとしていたのですか? –

+0

これらの値はフォローアップ日付に対応します。これらの価値は私が次のフォローアップ日を設定する上で重要です。したがって、target.value = 1は1日、5は5日、7日は7日間です。それらは同じ問題の一部です。 5日後の目標値が5であれば、次のフォローアップ日は、月曜日ではなく月曜日に戻っていきます。 – Tom

0

あなたが使用することができますExcelの組み込み機能Workday

Function NextMonday(dtDate As Date, lngDaysToAdd As Long) As Date 
    NextMonday = Application.WorkDay(dtDate + lngDaysToAdd - 1, 1) 
End Function 

将来の日付から1の減算が1つの勤務時間ができるようにすることです追加されました。

(そして、ASHが示唆しているように、その関数の名前を "next"を返さないように変更することをお勧めします(土曜日/日曜日の日付にゼロ平日を追加すると土曜日/日曜日が返されます)月曜日」。)私が正しくあなたのVBAコードを読んでいた場合


しかし、あなただけの、Excelのセルに例えばWORKDAYを使用することができるかもしれセル内I3使用

=WORKDAY(TODAY()+H3-1,1) 
関連する問題