VBA执行代码行然后抱怨该行超出范围

时间:2015-12-04 16:54:56

标签: excel vba excel-vba

当我尝试运行此代码时,我特意将下标超出范围错误:

Sub CopyData()
    'Setup
    Dim Filename, Pathname As String
    Dim source As Workbook
    Dim destination As Workbook
    Dim nextName As String

    Pathname = ActiveWorkbook.Path & "\Q1 grades fall  2015-2016-1"
    Filename = Dir(Pathname & "*.xls")

    Set source = Workbooks("<name of my file>")
    Set destination = Workbooks.Open(Pathname & Filename)
    'Done with Setup
    lastPlace = 2

    'Iterate through Source rows
    For sourceRow = 5 To 28
    With source.Worksheets("<name of my worksheet>")
        currName = Cells(sourceRow, 1)
        'Iterate through Source columns to collect info
        'Columns: ENG = 4; MAT = 7; SCI = 10; SOC = 13; WOR = 16
        ENG = Cells(sourceRow, 4).Value
        MAT = Cells(sourceRow, 7).Value
        SCI = Cells(sourceRow, 10).Value
        SOC = Cells(sourceRow, 13).Value
        WOR = Cells(sourceRow, 16).Value

        End With

        With destination.Worksheets("Sheet1")
        nextName = Split(Cells(lastPlace + 1, 1).Value, ",")(0)

        MsgBox nextName

        End With

        'If currName = destination's name at lastPlace + 1 Then
        'Iterate through Destination to match currName and fill info
        For destRow = 76 To 99
            destination.Worksheets("Sheet1").Activate

            lastPlace = destRow
        Next destRow
    Next sourceRow
End Sub

我的问题发生在这里:

nextName = Split(Cells(lastPlace + 1, 1).Value, ",")(0)

MsgBox nextName

或者至少,这是VBA SAYS发生的地方。

黄色光标指向第一行。但是这里有什么我不能得到的(除了我的阵列中的第一个元素可能超出范围的想法):我得到一个消息框,打印出该值应该是什么(学生&#39;的姓氏)。我改变它来看第二个元素,它再次打印出正确的值(同一个学生的名字)。它与我的excel的格式一致。

这就是我的主要问题:这个错误在哪里以及如何解决?

但是,自从我昨天下午开始学习VBA以来,我不会介意通过查看我的代码给你的任何其他提示。

提前谢谢!

编辑:

我应该提一下,我试着改用VBA.Split。没有骰子。

2 个答案:

答案 0 :(得分:4)

您使用的是With ... End With statement,但忽略了它作为父工作表参考的目的。句点(又名.句号)是将父引用传递给With ... End With中的成员。

With destination.Worksheets("Sheet1")
    nextName = Split(.Cells(lastPlace + 1, 1).Value, ",")(0)
    MsgBox nextName
End With

注意.Cells而非Cells

答案 1 :(得分:1)

好的,所以在制作示例文件时,我发现了这个问题。

当我测试我的代码时,我完全忘记了底部的不完整段(你需要向下滚动才能看到,lol)。该段恰好是一个递增索引的循环&#34; lastPlace&#34;并设置另一张活动(虽然第二部分不应该有所作为,我不会想到)。

这个循环也嵌套在原来的循环中,所以我无意中将索引跳到了99.

当然,这解释了a)为什么我看到一个正确的MsgBox然后在同一行上的错误(我觉得愚蠢的没有注意到循环会发生类似的事情发生)和b)为什么我得到超出范围的错误(下一行是空白的)。

如果有人想知道为什么我把它放在那里开始,它应该是在一个声明的一端。但我很傻,忘了它在那里,仍在影响我的代码。