2012-03-08 151 views
3

我有一个应该将数据从一张表复制到另一张的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但自那时以来代码已经稍微改变了,这是一个不同的问题。

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

+1

你可能想在某个阶段重新考虑电子表格的整体设计 - 使用命名范围你这样做很容易出错,难以调试的方式(因为你已经注意到了!)。 Excel非常好,并且易于与表格数据一起使用 - 而不是有9个单独的范围,例如,您可以为一个块添加一个包含该剧集编号的附加列。这个简单的改变会显着提高可读性和代码。 – assylias 2012-03-08 11:09:00

+0

再次感谢您的反馈。该表实际上是由一个程序生成的,因此产生了一些混乱,但我明白了您的意思是抵消选择而不是使用范围。目前的方法非常接近,但如果我不能完全使用它,我将使用建议的方法。在这种情况下,我会通过msg问你是否可以接受它。再次感谢您的关注。非常感激。 – TornHair 2012-03-08 12:22:33

回答

5

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

我觉得你的范围内引用问题

下面的代码是你的代码

curr_ep的简化版本是命名范围第1集。它有一个范围的地址$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 

enter image description here

+1

如果您不知道如何逐行循环遍历代码,得到上面的黄色栏,你应该按照这里的建议分析宏(http://www.excel4business.com/videos/analyzing-macros-error-handling.php)。基本上,如果你在例如“Next n”则可以在代码退出r循环时评估各种变量/组件 – 2012-03-08 11:39:05

+0

感谢您的评论。我以这种方式遍历了代码,但不知道如何检查范围变量的地址,如上面的答案所示。我认为上面的答案已经破解了它:循环计数器在调试显示时正常工作,但是从错误的情节复制。感谢您的链接,我现在将查看。 – TornHair 2012-03-08 12:26:43

+0

非常感谢,我通过制作一个范围并在调试中看到它的地址来检查原始文件,并且偏移正是发生的情况。我认为你的例子中的行设置curr_test将从当前集的第n行(从...的第3行开始)中选择第1列至第11列。现在问题清楚了,我会寻找引入该偏移量的内容。非常感谢您为替代解决方案提供的帮助和@assylias。 – TornHair 2012-03-08 14:24:26