繁体   English   中英

将项添加到数组VBA excel

[英]adding items to an array VBA excel

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

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

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

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

尝试下面,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

原因是您已将数组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

(...)

您已经计算了大小,因此可以将其与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数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM