我有一个应该将数据从一张表复制到另一张的vba脚本。它通过三个嵌套for循环来完成。在调试这些代码时,逐步调试这些代码似乎很好,但是当运行vba脚本时,它们似乎停止得太早。否则,vba脚本有效。早期退出的VBA嵌套循环
我一直盯着这个小时,不能为我的生活看到什么会导致循环提前停止。我希望解决方案是我错过的一些简单的东西,但是我真的很失落,而不是自从我开始这个以来的第一次。
的片材的组织如下:
Sheet 1中包含的数据被复制。
- 每一行包含一个单独的响应,其中有在测试数据
- 该表包含数据的九个块55,命名为集1-9。每集都包含一个整数表示开始,结束和间隔时间的列。
- 在测试数据中,除开始/结束时间外,每个情节都是相同的。
- 为结束时间的最大值是36
- 测试数据是在所述前四个集唯一块,所以Episode4包含每一行
Sheet 2中,其中数据是去 结束时间= 36 - 第一列包含复制36行以上的每个RespondentID - 第二列包含数字1-36,因此表示该应答者的该时间段 -11之后的列包含从sheet1复制该响应人/时间的数据的区域。这些36x11的区域被命名为“Response1-55”中的测试数据
的VBA脚本的逻辑如下:
计数器: - N的受访者的 数计数器 - R的柜台发作次数 - 我将计数器中正在复制的响应中的行计数。
- >对于每个响应(从n = 1至受访者)
- >选择第一集(其中r =开始1至9)
--->对于每一集
--- >读取开始,结束和间隔时间
--->从i =开始到i =从第n集的第n行复制相关单元格
--->将这些单元格复制到当前响应的第i行第2页
--->当您到达当前节目的结束时间,转到下一个(下一个r)
- >如果情节哟你刚刚完成了36个EndTime然后去下一个响应,或者继续下去,直到你用完了剧集。
- >下一个回应
在调试代码似乎是做到这一点。
但是,当我在测试表上运行vba脚本时,它仅适用于情节1和情节2。不会复制情节3和4中的数据。没有任何内容被复制,并且复制的数据在各方面都是正确的。任何时候都没有错误信息。
如果有人可以提出为什么会发生这种情况,我会为他们建造一座真正的教堂。答案也可以在这里添加:https://stackoverflow.com/questions/119323/nested-for-loops-in-different-languages其中还没有VBA部分。
到测试表的链接是在这里:http://dl.dropbox.com/u/41041934/MrExcelExample/TornHairExampleSheet.xlsm
代码的相关部分在这里
Sub PopulateMedia()
Application.ScreenUpdating = False
'Count the total number of response rows in original sheet
Dim Responses As Long, n As Integer, i As Integer, r As Integer
Responses = (Sheets("Sheet1").UsedRange.Rows.Count - 3) ' equals 55 in test sheet
'For each response...
For n = 1 To Responses
i = 1 'Reset i for new response
Dim curr_resp As Range
Set curr_resp = Sheets(2).Range("Response" & n) 'Define a range containing all response data
For r = 1 To 9 'For each episode...
Dim curr_ep As Range 'Define a range containing episode data for all responses
Set curr_ep = Sheets(1).Range("episode" & r)
Dim Stime As Integer, Etime As Integer, Itime As Integer 'Variables contain start, end and inter-episode times
Stime = curr_ep.Cells(n, 1)
Etime = curr_ep.Cells(n, 17)
Itime = curr_ep.Cells(n, 19)
For i = Stime To (Etime + Itime) 'for each time-slot...
If i <= Etime Then
Dim a As Variant
a = curr_ep.Range(curr_ep.Cells(n - 3, 1), curr_ep.Cells(n - 3, 11))
curr_resp.Rows(i) = a 'Copy data from above current episode to current response for slots between Stime and Etime
End If
Next i
If Etime = 36 Then Exit For
Next r
Next n
Application.ScreenUpdating = True
End Sub
透露,我已经对这个项目帮助本网站,VBA copy from a union of two ranges to a row of another range但自那时以来代码已经稍微改变了,这是一个不同的问题。
再一次,非常感谢您为此提供的任何帮助。我一直盯着这几个小时,并没有看到错误在哪里。任何指导都非常感谢。
你可能想在某个阶段重新考虑电子表格的整体设计 - 使用命名范围你这样做很容易出错,难以调试的方式(因为你已经注意到了!)。 Excel非常好,并且易于与表格数据一起使用 - 而不是有9个单独的范围,例如,您可以为一个块添加一个包含该剧集编号的附加列。这个简单的改变会显着提高可读性和代码。 – assylias 2012-03-08 11:09:00
再次感谢您的反馈。该表实际上是由一个程序生成的,因此产生了一些混乱,但我明白了您的意思是抵消选择而不是使用范围。目前的方法非常接近,但如果我不能完全使用它,我将使用建议的方法。在这种情况下,我会通过msg问你是否可以接受它。再次感谢您的关注。非常感激。 – TornHair 2012-03-08 12:22:33