VBA嵌套循环提前退出

Tor*_*air 3 excel vba excel-vba nested-loops

我有一个vba脚本,它应该将数据从一个工作表复制到另一个工作表.它通过三个嵌套的for循环来实现.在调试这些代码时单步执行代码看起来效果很好,但是当运行vba脚本时,它们似乎太早停止了.否则vba脚本工作.

我一直盯着这几个小时,不能为我的生活看到什么会导致循环提前停止.我希望解决方案是我错过的简单方法,但我真的很失落,而不是我开始这么做以来的第一次.

表格的组织如下:

Sheet1,包含要复制的数据.

  • 每行包含一个单独的响应,其中测试数据中有55个
  • 该表包含九个数据块,名为Episode 1-9.每集都包含一个列,其中整数表示开始,结束和间隔时间.
  • 在测试数据中,除了开始/结束时间之外,每个剧集都是相同的.
  • EndTime的最大值为36
  • 测试数据仅在前四个Episode块中,因此Episode4包含每行的EndTime = 36

Sheet2,其中数据将去 - 第一列包含复制超过36行的每个RespondentID - 第二列包含数字1-36,因此表示该响应者的时间段-11列之后包含从sheet1复制的数据的区域响应者/时间被放置.这些36x11区域在测试数据中命名为"Response1-55"

vba脚本的逻辑如下:

计数器: - n个响应者数量的计数器 - r数集的计数器 - 我对复制到的响应中的行进行计数.

- >对于每个回复(从受访者的n = 1开始)
- >选择第一集(从r = 1到9开始)
--->对于每一集
--->阅读开始,结束和间隔时间
- - >从i =开始到i =从第r集的第n行开始复制相关单元格
--->将这些单元格复制到sheet2上当前响应的第i行
--- >当你到达当前剧集的结束时间时,转到下一个(下一个r)
- >如果刚刚完成的剧集有36个作为其结束时间,则转到下一个响应,或者继续直到你的剧集用完为止.
- >下一个响应

在调试中,代码看起来就是这样做的.

但是,当我在测试表上运行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
Run Code Online (Sandbox Code Playgroud)

要透露,我已经从这个站点获得了关于这个项目的帮助,VBA从两个范围的并集复制到另一个范围的行,但是从那时起代码已经稍微改变了,这是一个不同的问题.

再一次,非常感谢您提供的任何帮助.我一直盯着这几个小时,看不出错误在哪里.任何指导都非常感谢.

bre*_*tdj 5

如果可以,我会发布此评论,但这太长了.所以这里是一个查询/潜在的解决方案

我认为您的范围参考是问题所在

下面的代码是代码的简化版本

curr_epepisode1的命名范围.它的范围地址为$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我认为你可能有的意图,即你正在建造一个非预期的偏移量

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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述