2015-07-02 7 views
2

Так что я пытаюсь начать с даты в одной ячейке, а затем каждая строка под ней показывает дату, которая является месяцем позже. Поэтому в строке 3 столбца 1 у меня есть 1919 - Мар, поэтому я хочу, чтобы строка 4 столбца 1 была 1919 - апрель и так далее. Я написал код, чтобы сделать это:VBA: DateAdd и EoMonth перестают работать правильно в середине цикла

Worksheets("FormattedData").Cells(3, 1) = MinDate 
Worksheets("FormattedData").Cells(3, 1).NumberFormat = "yyyy - mmm" 
For i = 1 To TotalMonths 
    Worksheets("FormattedData").Cells(3 + i, 1) = DateAdd("m", 1, Worksheets("FormattedData").Cells(2 + i, 1)) 
    Worksheets("FormattedData").Cells(3 + i, 1).NumberFormat = "yyyy - mmm" 
Next i 

Где MinDate является предварительно определена датой и TotalMonths является ранее определенным числом. Когда я это делаю, он работает так, как я предполагаю, что он будет работать некоторое время, но на линии 835 он начинает испортиться. Это, как представляется: 1988 - май 1988 - Июнь 1900 - Jan 1900 - янв

И затем он продолжает повторять с января на некоторое время, то иногда он показывает 1900 - февраль или 1900 - март, но странно, самая последняя строка покажет 2015 - июль, что не имеет смысла, потому что ячейка предыдущей строки - 1900 - март. У меня такая же проблема, даже когда я пытаюсь использовать EoMonth.

В отдельном листе, я попытался следующий код и он работал отлично на протяжении всей своей полноте:

Dim z As Date 
z = "01/11/1905" 
Worksheets(4).Cells(1, 1) = z 
Worksheets(4).Cells(1, 2) = z 
Worksheets(4).Cells(1, 3) = z 
For i = 1 To 60000 
    Worksheets(4).Cells(1 + i, 1) = DateAdd("m", 1, Worksheets(4).Cells(i, 1)) 
    Worksheets(4).Cells(1 + i, 2) = WorksheetFunction.EoMonth(Worksheets(4).Cells(i, 2), 1) 
    Worksheets(4).Cells(1 + i, 3) = WorksheetFunction.EoMonth(Worksheets(4).Cells(1, 3), i) 
    Worksheets(4).Cells(1 + i, 1).NumberFormat = "yyyy - mmm" 
    Worksheets(4).Cells(1 + i, 2).NumberFormat = "yyyy - mmm" 
    Worksheets(4).Cells(1 + i, 3).NumberFormat = "yyyy - mmm" 
Next i 

Все три колонки имеют один и тот же вывод и его точно так, как я хочу, чтобы она появилась. Но если я попробую эти три общих метода в контексте моего предыдущего кода, я столкнулся с проблемой, что он не работает, когда он достигает 1988 - июнь. Кто-нибудь знает, что здесь происходит не так?

+0

У вас есть условное форматирование или события VBA, прикрепленные к проблемному листу? Можете ли вы загрузить образец, где мы могли бы воспроизвести проблему? – BrakNicku

+0

Я этого не сделал. Я действительно понял, что происходит не так; в моем коде был более поздний раздел, который влиял на столбец дат (и я этого не хотел, у меня была проблема с индексированием, которую я исправил). Спасибо, что нашли время, чтобы помочь. –

ответ

0

Я сам это понял; это была глупая ошибка с моей стороны. Более поздняя часть моего кода влияла на часть столбца дат, что, я думаю, приводило к тому, что даты были испорчены, поэтому я исправил индексирование кода, чтобы он повлиял на часть таблицы, на которую я на самом деле намеревался повлиять ,

0

Я попробовал ваш пример с 1000 месяцев, и она работала:
1988 - янв
1988 - фев
1988 - март
1988 - апрель
1988 - май
1988 - июнь
1988 - июль
1988 - август
1988 - сентябрь
1988 - октябрь
1988 - ноябрь
1988 - декабрь

Вы пытались использовать DateSerial?

Sub test() 

    Dim MinDate As Date 
    Dim TotalMonths As Long 
    Dim i As Long 

    MinDate = DateSerial(1919, 1, 1) 
    TotalMonths = 1000 

    Worksheets("FormattedData").Cells(3, 1) = MinDate 
    Worksheets("FormattedData").Cells(3, 1).NumberFormat = "yyyy - mmm" 
    For i = 1 To TotalMonths 
     With Worksheets("FormattedData") 
      .Cells(3 + i, 1) = DateSerial(Year(.Cells(3 + i - 1, 1)), Month(.Cells(3 + i - 1, 1)) + 1, 1) 
      .Cells(3 + i, 1).NumberFormat = "yyyy - mmm" 
     End With 
    Next i 

End Sub 

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

  • Нет связанных вопросов^_^