VBA嵌套循环提前退出

我有一个VBA脚本,应该将数据从一个表复制到另一个。 它通过三个嵌套for循环。 在debugging这些代码的过程中,似乎完美地工作,但是当vba脚本运行时,它们似乎停止得太早。 否则,VBA脚本的作品。

我一直盯着这几个小时,不能在我的生活中看到什么会导致循环提前停止。 我希望解决scheme是我错过的一些简单的东西,但是我真的很失落,而不是自从我开始这个以来的第一次。

该表的组织如下:

Sheet1包含要复制的数据。

  • 每行包含一个单独的响应,其中有55个testing数据
  • 该表包含九个数据块,名为第1-9集。 每集包含一个整数表示开始,结束和间隔时间的列。
  • 在testing数据中,除了开始/结束时间外,每个情节是相同的。
  • EndTime的最大值是36
  • testing数据仅在前四个Episode模块上,所以Episode4包含每一行的EndTime = 36

Sheet2,其中数据要去 – 第一列包含每36个行复制的RespondentID – 第二个列包含数字1-36,因此代表该受访者的时间-11列之后的列包含从Sheet1复制的区域应答者/时间被放置。 testing数据中的这些36×11区域被命名为“Response1-55”

vba脚本的逻辑如下:

计数器: – n个受访者数量的计数器 – r计数器数量 – 我计数器中被复制到的响应行数。

– >对于每个响应(从n = 1到受访者开始)
– >select第一集(从r = 1到9开始)
—>为每集
—>读取开始,结束和间隔时间
—>从i =开始到i =从第r集的第n行复制相关的单元格
—>将这些单元格复制到sheet2上当前响应的第i行
—>当你达到当前情节的结束时间,转到下一个(下一个r)
– >如果你刚刚完成的情节有36作为EndTime然后去下一个回应,或继续,直到你用完情节。
– >下一个响应

在debugging代码似乎做到这一点。

但是,当我在testing表上运行vba脚本时,它仅适用于情节1和2.情节3和4中的数据不会被复制。 没有任何内容被复制,而且复制的数据在各方面都是正确的。 在任何时候都没有错误信息。

如果有人能够提出为什么会发生这种事情,我会给他们build一个真正的教堂。 答案也可以在这里添加: https : //stackoverflow.com/questions/119323/nested-for-loops-in-different-languages哪些还没有VBA部分。

链接到testing表是在这里: 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从两个范围的联合复制到另一个范围的一行,但是从那以后代码已经被稍微改变了,这是一个不同的问题。

再一次,非常感谢你的帮助。 我一直盯着这几个小时,并没有看到错误在哪里。 任何指导都非常感谢。

如果可以的话,我会张贴这个评论,但是这太长了。 所以这里就是一个查询/潜在的解决scheme

我认为你的范围参考是问题

下面的代码是你的代码的一个缩减版本

curr_epcurr_ep的命名范围。 它的地址范围是$Y$4:$AQ$58

当你循环a变体时,你正在用这个语法设置一个范围
a = curr_ep.Range(curr_ep.Cells(n - 3, 1), curr_ep.Cells(n - 3, 11))
相当于a = curr_ep.Range("Y2:AQ2")

这意味着你实际上正在看AW2:BG2不是Y2:AQ2这是我认为你可能已经打算,即你正在build立一个意想不到的偏移量

 Sub PopulateMedia() n = 1 r = 1 Dim curr_ep As Range Dim curr_test As Range Set curr_ep = Sheets(1).Range("episode" & r) Set curr_test = curr_ep.Range(curr_ep.Cells(n - 3, 1), curr_ep.Cells(n - 3, 11)) End Sub 

在这里输入图像说明