2017-10-24 25 views
1

簡単な質問:私はいくつかの条件に基づいて日付のセル範囲を塗りつぶす小さなvbaスクリプトを持っています。私はこの範囲の日付を取って週末の秋を次の月曜日に置き換えたいと思っています。 Weekdayは日付ではなく、セル参照を受け入れるように設計されて、私の知る限りVBA土曜日と日曜日を次の月曜日に置き換える平日と勤務

i = 6 
For i = 6 to LastRow 
    If Weekday(Cells(i, "I"), vbMonday) > 5 Then 
     Cells(i, "I") = Application.WorksheetFunction.Workday(Cells(i, "I"), 1, 1) 
    End If 
Next i 

:私はこれを(すべての変数が適切に定義されていると仮定してください)やってWeekdayWorkdayを使用しようとしています。 forループで日付を渡す方法がわかりません。助言がありますか?

+2

入力データの例と期待される出力を追加してください –

+1

参照しているセルが日付を保持している場合は 'Weekday(Cells(i、" I ")。value、vbMonday)'を使用します。 'WorksheetFunction.Workday()'。また、Cells(i、 "I")= 'ではなく、' Cells(i、 "I")。value = ' - つまり明示的に結果をvalueに代入する方が良いです。 –

+0

あなたの欠点は、2つのオプションの引数があることです。 vbMondayの前に、を追加する必要があります。 – Luuklag

答えて

1

土曜日は+2、日曜日は+1で+1できます。土曜日= 6、日曜= 7あなたはWeekday機能にvbMonday引数を使用している場合は)、これは動作しますので:

7 - lngDayIndex + 1 

lngDayIndexWeekday関数の戻りが入ります。

コード例:

Sub ConvertToNextMonday() 

    Dim ws As Worksheet 
    Dim lngLastRow As Long, lngCounter As Long, lngDayIndex As Long 

    Set ws = ThisWorkbook.Worksheets("Sheet2") '<-- change to your sheet 
    lngLastRow = ws.Cells(ws.Rows.Count, "I").End(xlUp).Row '<-- change to your column 

    For lngCounter = 1 To lngLastRow 
     lngDayIndex = Application.WorksheetFunction.Weekday(ws.Cells(lngCounter, "I").Value, vbMonday) 
     If lngDayIndex = 6 Or lngDayIndex = 7 Then 
      ws.Cells(lngCounter, "I") = ws.Cells(lngCounter, "I") + (7 - lngDayIndex + 1) 
     End If 
    Next lngCounter 

End Sub 

Office support webpageによると、Weekday機能date引数が指定できます

...バリアント、数値表現、文字列式、またはこれらの任意の組み合わせ日付を表すことができます。 dateにNullが含まれる場合、Nullが返されます。

だからあなたが使用することができます。

WeekDay("2017-10-25", vbMonday) 
あなただけの任意のテキスト値が実際に適切に日付に変換することを確認する必要があり

は、あなたの地域の特定:例えば

Weekday(Now()) 

もが、設定。

関連する問題