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