Увеличение даты в excel vba при переходе на новый месяц

 Private Sub newMonth(MonthValue As Date)
'month value is the value that is passed into it from the first data row of the old sheet

Dim isWeekend As Boolean

Dim i As Long

'is it a year shift? (december = 12, january = 1)
If Month(MonthValue) + 1 < Month(MonthValue) Then
    For i = 0 To 4
        'is the date at least 5 days in the week from sunday?

        If Weekday(Format(DateSerial(Year(MonthValue) + 1, Month(MonthValue) + 1, i + 1), "mm/dd/yyyy"), vbSunday) > 5 Then
            'put in the cells of the new sheet in the first column a date starting from the first day of the next month
            Cells(FIRST_DATA_ROW + (i * 2), 1) = Format(DateSerial(Year(MonthValue) + 1, Month(MonthValue) + 1, i + 1), "mm/dd/yyyy")
        Else
            'if its not, clear contents
            ActiveSheet.Range(Cells(FIRST_DATA_ROW + (i * 2), 1), Cells(FIRST_DATA_ROW + (i * 2), 32)).ClearContents

        End If



    Next i
'it is not a year shift, just an increment of a month
Else

   for i = 0 to 4
         If Weekday(Format(DateSerial(Year(MonthValue), Month(MonthValue) + 1, i + 1), "mm/dd/yyyy"), vbSunday) > 1 And _
            Weekday(Format(DateSerial(Year(MonthValue), Month(MonthValue) + 1, i + 1), "mm/dd/yyyy"), vbSunday) < 7 Then
            'put in the cells of the new sheet in the first column a date starting from the first day of the next month
            Cells(7 + (i * 2), 1) = Format(DateSerial(Year(MonthValue), Month(MonthValue) + 1, i + 1), "mm/dd/yyyy")
           i = i + 1
        Else
            'if its not, clear contents
            ActiveSheet.Range(Cells(FIRST_DATA_ROW + (i * 2), 1), Cells(FIRST_DATA_ROW + (i * 2), 32)).ClearContents
        End If
    Next i
End If


End Sub

Привет. В приведенном выше коде есть два актуальных рабочих листа, я назову их листом A и листом B. Он является частью общей системы отслеживания времени / посещаемости и создает новый лист для каждого периода. Так, например, лист A будет иметь даты 8/6 - 8/10, а лист B будет иметь даты 8 / 13-8 / 17. Выходные не покрываются простынями; только будни.

Следующая функция вызывается, когда это не только смена недель, но и смена месяцев. Так, например, если на листе A было 7 / 30-7 / 31 (понедельник и вторник прошлой недели), на листе B должно было быть 8 / 1-8 / 3 (со среды по пятницу на прошлой неделе).

Проблема в том, что в любом случае первая дата на листе B должна появиться в ячейках (FIRST_DATA_ROW, 1). Между прочим, FIRST_DATA_ROW = 7. Это вызывает проблему, если, например, лист A заканчивается во вторник, потому что код написано, первая дата появится в ячейках (11,1), потому что. Другими словами, мне нужно, чтобы ячейки (7, 1) были понедельником новой недели, ячейки (9, 1) были вторником новой недели и т. Д .; если предыдущая неделя не закончилась во вторник, и в этом случае мне нужно, чтобы ячейки (7,1) были средой новой недели, ячейки (9, 1) были четвергом новой недели, а ячейки (11,1 ), чтобы быть пятницей новой недели, и чтобы код завершился после этого, потому что следующее значение - выходные.

Month(MonthValue) вернет значение в диапазоне от 1 до 12. Month(MonthValue) + 1 будет значением в диапазоне от 2 до 13. шансов для Month(MonthValue) + 1 < Month(MonthValue) не так много.
Vincent G 10.08.2018 16:48

Вот почему внизу у меня есть инструкция ELSE. Приведенный выше оператор if предназначен для случая, когда месяц листа A - декабрь (12), а месяц листа B - январь (1).

bdpolinsky 10.08.2018 17:00

Ваше сравнение не ссылается ни на лист A, ни на B, у MonthValue нет причин для изменений, тест всегда будет ложным.

Vincent G 10.08.2018 17:04

Кстати, в вашем коде нет ссылок на лист A или лист B, код всегда будет применяться к текущему ActiveSheet.

Vincent G 10.08.2018 17:08

Ваш приведенный выше код завершен? Я вижу, что он работает только с одним листом, вставляя из Date в Date +4 days в указанном диапазоне. Если вы хотите использовать два листа, вам нужно создать if внутри вашего цикла, проверить, новый ли сейчас месяц, и сообщить Excel, где находится ваш диапазон на другом листе.

Daniel Souza 10.08.2018 17:40
0
5
635
0

Другие вопросы по теме