当我尝试运行此代码时,我特意将下标超出范围错误:
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。没有骰子。
答案 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)为什么我得到超出范围的错误(下一行是空白的)。
如果有人想知道为什么我把它放在那里开始,它应该是在一个声明的一端。但我很傻,忘了它在那里,仍在影响我的代码。