VBA默认我的变量日期从用户输入到凌晨12:00,这导致下标超出范围错误。我已经正确地声明了所有变量,它以前工作但现在却没有。关于要检查什么的任何想法?我尝试使用DateAdd进行调整,并试图让vba将#添加到变量设置行的两端。奇怪的是,之前vba接受了日期的用户输入(LastEndDateV)并正确传递了它。循环中有什么不好的事吗?
我想值得一提的是,用户输入来自用户表单的文本框,但直到现在这还不是问题。
示例代码
Dim BlockEnd As Date: Dim BlcokStart As Date
Dim LastStartV As Date
Dim LastEndDateV As Date
Dim UACFArray(3, 1) As Date
LastEndDateV = LastEndDateV.Value
BlcokStart = LastEndDateV + 7
BlockEnd = LastEndDateV + BlockLength
TotalC = CSched
TotalW = WSched
CareerComb = CareerTypeCombo.Value
Debug.Print "Values"; BlcokStart, BlockEnd, TotalC, TotalW
UACFArray(0, 0) = #1/6/2015#: UACFArray(0, 1) = #2/3/2015#
UACFArray(1, 0) = #1/20/2015#: UACFArray(1, 1) = #2/17/2015#
UACFArray(2, 0) = #2/10/2015#: UACFArray(2, 1) = #3/10/2015#
UACFArray(3, 0) = #2/24/2015#: UACFArray(3, 1) = #3/24/2015#
For i = LBound(a) To UBound(a)
If CFChk = True Then
Select Case CareerComb
Case Is = "Test1", "Test2"
For l = LBound(UACFArray, 1) To UBound(UACFArray, 1)
If BlcokStart = UACFArray(l, 0) Then
For m = LBound(UACFArray, 2) To UBound(UACFArray, 2)
BlockEnd = UACFArray(l, m)
a(i) = BlcokStart & " & " & BlockEnd
TotalC = TotalC + 3
TotalW = TotalW + CWs
BlcokStart = UACFArray(l + 1, 0) ******subscript occurs here
Next m
以下是我最初测试它之前将其移到原始代码的主要部分:
Sub loopchecker()
Dim UACFArray(8, 1) As Date
Dim checkpoint As Date
Dim Block As String
checkpoint = #2/11/2015#
UACFArray(0, 0) = #1/6/2015#: UACFArray(0, 1) = #2/3/2015#
UACFArray(1, 0) = #1/20/2015#: UACFArray(1, 1) = #2/17/2015#
UACFArray(2, 0) = #2/10/2015#: UACFArray(2, 1) = #3/10/2015#
UACFArray(3, 0) = #2/24/2015#: UACFArray(3, 1) = #3/24/2015#
UACFArray(4, 0) = #3/17/2015#: UACFArray(4, 1) = #4/14/2015#
UACFArray(5, 0) = #3/31/2015#: UACFArray(5, 1) = #4/28/2015#
UACFArray(6, 0) = #4/21/2015#: UACFArray(6, 1) = #5/19/2015#
UACFArray(7, 0) = #5/5/2015#: UACFArray(7, 1) = #6/2/2015#
UACFArray(8, 0) = #5/26/2015#: UACFArray(8, 1) = #6/23/2015#
For x = LBound(UACFArray, 1) To UBound(UACFArray, 1)
If checkpoint = UACFArray(x, 0) Then
Block = UACFArray(x, 0)
For y = LBound(UACFArray, 2) To UBound(UACFArray, 2)
Block = UACFArray(x, 0) & " " & "-" & " " & UACFArray(x, y)
Next y
ElseIf checkpoint <> UACFArray(x, 0) Then
For y = LBound(UACFArray, 2) To UBound(UACFArray, 2)
If checkpoint > UACFArray(x, 0) And checkpoint < UACFArray(x, y) Then
Block = UACFArray(x + 1, 0)
Block = Block & " " & "-" & " " & UACFArray(x + 1, y)
End If
Next y
End If
Next x
Debug.Print "Block = "; Block
End Sub
使用此版本一切正常但是我没有尝试重置blockstart的值(因为这需要每步重新调整)
答案 0 :(得分:1)
你像这样循环数组:
For l = LBound(UACFArray, 1) To UBound(UACFArray, 1)
这意味着在该循环期间,l
始终是数组的有效索引。
问题在于这一行:
BlcokStart = UACFArray(l + 1, 0)
l+1
会引发错误,因为l+1
将超出l = UBound(UACFArray, 1)
的范围。
您似乎正在尝试将BlcokStart
作为数组中的 next 值,但是当l = Ubound(UACFArray, 1)
时,没有下一个值,您已到达数组的 end 。
有几种方法可以解决这个问题,但正确的解决方案取决于您到达数组末尾时应该的结果值。
最简单的说,你可以这样做:
For l = LBound(UACFArray, 1) To (UBound(UACFArray, 1) - 1)
但如果你仍然需要处理For m...
循环,这将无效。在这种情况下,您可能只需要一个Exit
语句,例如:
For l = LBound(UACFArray, 1) To UBound(UACFArray, 1)
If BlcokStart = UACFArray(l, 0) Then
For m = LBound(UACFArray, 2) To UBound(UACFArray, 2)
BlockEnd = UACFArray(l, m)
a(i) = BlcokStart & " & " & BlockEnd
TotalC = TotalC + 3
TotalW = TotalW + CWs
If l = UBound(UACFArray,1) Then Exit For '### Exit early, since the next line will be out of bounds error
BlcokStart = UACFArray(l + 1, 0)
Next m
如果,您仍然需要将BlcokStart
重置为其他值,然后使用If/Else
:
If l = UBound(UACFArray,1) Then
BlcokStart = # Some Date Value #
Exit For '### Exit early
Else
BlcokStart = UACFArray(l + 1, 0)
End If