VBA:DateAdd和EoMonth在循环中间停止正常工作

时间:2015-07-02 13:30:22

标签: excel vba excel-vba dateadd

所以我要做的是从一个单元格中的日期开始,然后在它下面的每一行显示一个月后的日期。因此,在第1列的第3行中,我有1919年 - 3月,所以我希望第1列的第4行是1919年 - 4月,依此类推。我写了一个代码来做到这一点:

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年 - 5月 1988年6月 1900年 - 1月 1900年 - 1月

然后它一直在重复1月份,然后有时它显示1900年 - 2月或1900年 - 3月,但奇怪的是,最后一行将显示2015年 - 7月,这没有意义,因为上一行的单元格是1900年 - 3月。即使我尝试使用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 - Jun时,我会遇到它无法正常工作的问题。有谁知道这里出了什么问题?

2 个答案:

答案 0 :(得分:0)

我自己弄清楚了;这对我来说是一个愚蠢的错误。我的代码中的后一部分影响了部分日期列,我猜这导致日期搞砸了,所以我修复了代码的索引,因此它影响了我实际上打算影响的电子表格部分

答案 1 :(得分:0)

我已经尝试了1000个月的例子并且它起作用了:
1988年 - 1月 1988年 - 2月 1988年 - 3月 1988年 - 4月 1988年 - 5月 1988年 - 6月 1988年 - 7月 1988年 - 8月 1988年 - 9月 1988年 - 10月 1988年 - 11月 1988年 - 12月

您是否尝试过使用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