将项添加到数组VBA excel

时间:2015-07-29 11:00:31

标签: arrays excel vba excel-vba date

我正在尝试将日期添加到数组中,但我无法执行此操作。每次我尝试这样做时,我都会得到一个超出范围的下标错误。我以前在其他语言中使用过数组,所以这应该可行,但事实并非如此,我似乎不明白为什么。下面我添加了当前无法正常工作的代码。我想要做的是在用户输入两个日期后,我的代码应该存储起始值,然后在该日期添加一个并将其添加到数组中,依此类推,直到我有一个从开始日期开始的所有日期的数组列表到结束日期。任何帮助都会非常感谢

Private Sub SearchButton4_Click()
    Dim wks As Excel.Worksheet, str1, str2, str3, str4 As Date, x As Integer
    Dim dateArray() As Date

    ReDim dateArray(1 To 1) As Date
    Set wks = Worksheets("Exceptions")
    str1 = Format(DateFromTextBox.Value, "dd-mm-yyyy")
    str3 = Format(DateToTextBox.Value, "dd-mm-yyyy")
    str2 = DateDiff("d", str1, str3)

    If str2 < 0 Then
        str2 = str2 * -1
    End If

    For x = 0 To str2
        If x = 0 Then
            dateArray(x) = str1
        Else
            str4 = DateAdd("d", 1, str1)
            dateArray(x) = str4
            str1 = str4
        End If
    Next

End Sub

4 个答案:

答案 0 :(得分:2)

您需要增加阵列的大小。这一行:

ReDim dateArray(1 To 1) As Date

只为您提供数组中的一个元素。你应该使用:

ReDim dateArray(0 To str2) As Date

在你计算出str2的值之后。

不过,您可以使用Abs功能为您提供正数:

str2 = Abs(DateDiff("d", str1, str3))

此外,当您在一行上声明多个变量时,必须包含每个变量的类型。在这一行:

Dim wks As Excel.Worksheet, str1, str2, str3, str4 As Date, x As Integer

变量str1, str2, str3全部声明为Variant而不是Date

答案 1 :(得分:2)

尝试下面,redim将调整数组的大小。 ubound()查找数组的顶端,因此ubound()+ 1将为数组添加一个额外的大小。 preserve关键字将保留当前在数组中的任何值

注意1:我如何声明你的变量str1 - 3未被声明为日期。 2:我如何初始化你的数组不需要做1对1就可以说我想要x量

希望有所帮助

Private Sub SearchButton4_Click()
    Dim wks As Excel.Worksheet, str1 As Date, str2 As Date, str3 As Date, str4 As Date, x As Integer
    Dim dateArray() As Date

    ReDim dateArray(1) As Date
    Set wks = Worksheets("Exceptions")
    str1 = Format(DateFromTextBox.Value, "dd-mm-yyyy")
    str3 = Format(DateToTextBox.Value, "dd-mm-yyyy")
    str2 = DateDiff("d", str1, str3)

    If str2 < 0 Then
        str2 = str2 * -1
    End If

    For x = 0 To str2
        If x = 0 Then
            dateArray(x) = str1
        Else
            str4 = DateAdd("d", 1, str1)
            dateArray(x) = str4
            str1 = str4
        End If
        ReDim Preserve dateArray(ubound(dateArray)+1) 
    Next

End Sub

答案 2 :(得分:1)

原因是您已将数组dateArray声明为只有一个元素,索引为1:

ReDim dateArray(1 To 1) As Date

稍后在您的代码中,您尝试为索引为0的此数组的元素赋值(但没有这样的元素,这就是显示此错误的原因):

For x = 0 To str2
    If x = 0 Then
        dateArray(x) = str1  '<---- in first iteration, when x = 0, you 
                             '      try to assign to element with 0 index.
    Else

(...)

答案 3 :(得分:0)

您已经计算了大小,因此您可以将其与Redim一起使用,而不是使用Preserve这是一项相对昂贵的操作,因为它会复制整个阵列。我还建议了一些更具描述性的变量名,你应该明确声明所有变量的类型:

Private Sub SearchButton4_Click()
    Dim wks                   As Excel.Worksheet
    Dim dtFrom                As Date
    Dim dtTo                  As Date
    Dim lNumberOfDays         As Long
    Dim x                     As Long
    Dim dateArray()           As Date

    Set wks = Worksheets("Exceptions")

    dtFrom = CDate(DateFromTextBox.Value)
    dtTo = CDate(DateToTextBox.Value)

    If dtTo < dtFrom Then
        dtTo = CDate(DateFromTextBox.Value)
        dtFrom = CDate(DateToTextBox.Value)
    End If

    lNumberOfDays = dtTo - dtFrom

    ReDim dateArray(1 To lNumberOfDays + 1, 1 To 1) As Date

    For x = 0 To lNumberOfDays
        dateArray(x + 1, 1) = dtFrom + x
    Next

    With wks.Range("A1").Resize(UBound(dateArray))
        .NumberFormat = "dd-mm-yyyy"
        .Value = dateArray
    End With
End Sub

我假设您将结果输出到工作表,因此我使用了2D数组。