【问题标题】:Vba defaulting Varianel date to 12:00am causing subscript out of range errorVba默认Varianel日期为上午12:00导致下标超出范围错误
【发布时间】:2016-03-17 15:18:11
【问题描述】:

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

【问题讨论】:

    标签: arrays vba loops


    【解决方案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) 时,没有 next 值,你已经到达了数组的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
    

    【讨论】:

    • 我通过单步调试发现的问题是 BlcokStart 的值 = 12:00am,这是真正的问题。我明白你在说什么,这是有道理的,但问题在于 vba 获取我的用户输入值,然后将其设置为 12:00am。
    • @DougCoats 您需要展示您是如何捕捉用户输入的,以及用户输入被错误地转换为凌晨 12:00 的示例。
    • 此外,虽然BlcokStart 的值可能不正确,但that 肯定not 导致赋值语句中的Subscript out of Range 错误你已经突出显示。该错误肯定是由于引用超出范围的索引。如果您可以显示更多代码,我也可以修复BlcokStart 变量错误。
    • 是的。请参阅修改后的答案。
    • 嘿,在上面的例子中,LastEndDateV 被定义为 Date。我也已经尝试过使用 DateAdd。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 2017-06-16
    • 2014-04-20
    • 1970-01-01
    相关资源
    最近更新 更多