2013-08-28 2 views
0

Я видел, как цикл в течение недель года, w1301, w1302, w1303, я могу получить номер недели, если я прокручу + число в неделю, но я верю есть способ напрямую подключиться еженедельно с vba, я надеюсь, по крайней мере.Как пройти через недели в диапазоне дат с помощью vba

DateSerial(Year(Now), Month(Now), Day(Now)) To DateSerial(2013, 3, 1) 

    StartDate = #1/1/2013# 
    EndDate = #12/31/2013# 

    For DateLooper = StartDate To EndDate 

Я получил функцию на номер недели от даты

 Public Function IsoWeekNumber(d1 As Date) As Integer 
    Attributed to Daniel Maher 
    Dim d2 As Long 
    d2 = DateSerial(Year(d1 - WeekDay(d1 - 1) + 4), 1, 3) 
    IsoWeekNumber = Int((d1 - d2 + WeekDay(d2) + 5)/7) 
    End Function 
+3

В чем вопрос? –

+0

Это цикл за несколько дней, есть ли опрятный способ цикла в течение недель, вместо того, чтобы делать это с +7 по дням и getWeek? apparaently vba может зацикливаться на день, может быть, он тоже может зацикливаться на неделе – trackmeifUcan

+0

Я не уверен, что вы имеете в виду, зациклив на недели. Вы можете использовать цикл от 1 до 52 ('для i = 1 до 52: сделать что-то: следующее i'). Вы можете прокручивать дату, представляющую первый (или определенный) день каждой недели. Вы можете найти первый день первой недели, а затем перебрать через 7 дней каждый раз, например: 'Для startOfWeek = DateSerial (2013, 1, 1) To DateSerial (2013, 1, 1) + 52 * 7 Шаг 7 'и т. д. Тип данных не представляет недели. Поэтому либо вам нужно определить его как число (например, номер недели), либо как тип даты, представляющий данный день недели. –

ответ

1

Вы можете просто использовать DateAdd function

For i = 1 To 52 
    Debug.Print DateAdd("ww", i, Now()) 
Next i 
+0

Я делаю это так, но это только увеличивается для первой итерации. Для недели = # 1/1/2013 # К # 8/28/2013 # x = DateAdd ("dd", 7, CStr (weekd)) Далее weekd – trackmeifUcan

+0

Просто выделив, что есть функции, встроенные в vba, которые будут делать то, что вы хотите. :-) Хотя не уверен, почему вы увидите только первое увеличение. –

0

День имеет целочисленное значение 1, так что вы могли бы итерацию в неделю следующим образом:

startDate = #1/1/2013# 
endDate = #12/31/2013# 

For d = startDate To endDate Step 7 
    'do stuff 
Next 

Номер недели можно определить с помощью функции DatePart, например .:

WScript.Echo DatePart("ww", Now) 

Это будет работать в обоих и .

+0

Я был довольно устал вчера вечером, и мой мозг не работал, этим утром я решил это, как ответ, отправляю сейчас, спасибо! btw будет шаг 7 принимать во внимание 30,31 дней месяцев и т. д.? и делает ли я это? – trackmeifUcan

+0

@ user2708115 Когда вы в последний раз встречались неделю, у которой не было ровно 7 дней? –

0

Я пробовал это решение и, похоже, работает, я не уверен на 100% того, как он обрабатывает 28,30,31 дней разных месяцев, но я доверяю vba. я знаю, что допустил ошибку, вероятно :))

currentDate = "2013-01-02" ' coz i wanted to start on a wednesday 
    for week = 1 to 52 
    debug.print currentDate 
    currentDate = DateAdd("ww",1,currentDate) 
    next week 
+0

Я думаю, что дата хранится как серийный номер, где каждый день является целым числом, добавление 7 или использование процедуры dateadd должно просто добавить 7 к этому номеру. Процедура, которая форматирует это число в форме, которую мы бы узнали, будет иметь дело с количеством дней в каждом месяце. –

+0

, так что в моем случае я не имею ничего подобного, просто использую currentDate, как бороться с днями в каждом месяце? – trackmeifUcan

+0

Я думаю, что дата, которую вы видите, это просто номер даты, отформатированный особым образом. Если вы используете 'ldate = clng (currentDate)' 'ldate = ldate + 7' ' currentdate = ldate', он будет делать то же самое (где ldate - длинная переменная) –

Смежные вопросы