Vba将Varianel日期默认为凌晨12:00,导致下标超出范围错误

时间:2016-03-17 15:18:12

标签: arrays vba loops

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的值(因为这需要每步重新调整)

1 个答案:

答案 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
相关问题