"下标超出范围"引用另一个工作表时出错

时间:2017-10-26 01:38:49

标签: excel vba excel-vba error-handling

我无法超越"下标范围"由下面的代码引起的错误。它在我第一次设置找到的变量时抛出错误。 子数据用于工作簿中的每个工作表,从已知列中搜索员工并标识该行,然后使用该行对变量求和。然后它用该总数填充活动表格中的单元格。 " COL"在主要子目录中指定。

nDate = Range("B3")
Dim startDate As Date
startDate = Range("B2")
Dim emp As String
emp = Range("B8")
Dim rw As String
n = 0

Do While True
    Range("B99") = nDate
    stringDate = Range("B99").Text

    Set found = Worksheets(stringDate).Range("D38:D144").Find(emp, LookIn:=xlValues, _
                        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext)
            If found = emp Then
                rw = found.row
                n = Worksheets(stringDate).Range(col + rw)
                tot = tot + n
            End If

    If nDate = startDate Then
            Exit Do
        End If
    nDate = nDate - 1
Loop

Range(col + "3") = tot

我的代码中有类似的Subs编译得很好。唯一的区别是,在上面的子项中,我搜索了一个范围。 下面是另一个没有抛出错误的子。

n = 0
Dim startDate As Date
Dim endDate As Date
startDate = Range("B2")
nDate = Range("B3")

Do While True
    Range("B99") = nDate
    stringDate = Range("B99").Text
    n = Worksheets(stringDate).Range(col + rw)
    tot = tot + n
    If nDate = startDate Then
        Exit Do
    End If
    nDate = nDate - 1
Loop

Range(col + "3") = tot

我知道有关同一错误的类似问题,但没有涉及引用外部工作表。 有关如何调试的任何建议吗?

2 个答案:

答案 0 :(得分:0)

在子/函数的开头添加:

Dim targetWs As Excel.Worksheet

然后将循环更改为:

Do While True
    Range("B99") = nDate
    stringDate = Range("B99").Text

    Set targetWs = Nothing
    Set found = Nothing

    On Error Resume Next
    Set targetWs = Worksheets(stringDate)
    On Error GoTo 0

    If targetWs Is Nothing Then
        MsgBox "Worksheet not found: " & stringDate
    Else
        Set found = targetWs.Range("D38:D144").Find(emp, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext)
    End If

    If Not found Is Nothing Then
        If found = emp Then
            rw = found.row
            n = targetWs.Range(col + rw)
            tot = tot + n
        End If
    End If

    If nDate = startDate Then
        Exit Do
    End If
    nDate = nDate - 1
Loop

如果出现一个消息框,您将知道您已经点击了不属于Worksheets集合的工作表名称。

答案 1 :(得分:0)

感谢各位的帮助。我终于能够调试子了。 下面是正确运行的代码。 当变量stringDate被重新格式化为日期而不是字符串时,下标错误在while循环的第二次迭代中出现。我不确定为什么它发生在这个子目录中,而在其他人中却没有相同的逻辑。转换为字符串的要点是在该格式的日期标记的表格中移动(例如2016年10月25日)。 无论哪种方式,我通过手动格式化保存当前迭代日期的单元格来修复此问题。 我也改变了"发现"在.find被执行后被识别出来。

nDate = Range("B3")
Dim startDate As Date
startDate = Range("B2")
Dim emp As String
emp = Range("B8")
Dim rw As String
n = 0

Do While True
    Range("B99") = nDate
    Range("B99").NumberFormat = "[$-409]mmmm d, yyyy;@"
    stringDate = Range("B99").Text

    Set found = Worksheets(stringDate).Range("D12:D144").Find(emp, LookIn:=xlValues, _
                        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext)

        If Not found Is Nothing Then
            rw = found.Row
            n = Worksheets(stringDate).Range(col + rw)
            Else
                n = 0
        End If
            tot = tot + n

    If nDate = startDate Then
        Exit Do
    End If
    nDate = nDate - 1
Loop

Range(col + "3") = tot