我有一个VBA脚本,它应该将数据从一个工作表复制到另一个工作表。它通过三个嵌套的for循环实现。在调试中逐步执行代码时,看起来这些循环完全正常,但当运行VBA脚本时,它们似乎过早地停止。否则,VBA脚本可以正常工作。
我已经盯着这个问题看了几个小时,但无论如何都没有发现导致循环提前停止的原因。我希望解决方案是我忽略的某个简单问题,但我真的不知道该怎么做,这并不是自从开始以来第一次遇到这种情况。
这个工作表的组织方式如下: Sheet1:包含要复制的数据。
- 每行包含一个单独的响应,在测试数据中有55个。 - 工作表包含九个数据块,分别命名为Episode 1-9。每个剧集都包含包括开始时间、结束时间和间隔时间的整数列。 - 在测试数据中,每个剧集都相同,除了开始/结束时间不同之外。 - EndTime 的最大值是36。 - 测试数据仅覆盖前四个 Episode 块,因此 Episode4 对于每一行都包含 EndTime=36。
Sheet2:数据要去的地方
- 第一列包含要复制的每个 RespondentID,复制到 36 行。 - 第二列包含数字1-36,因此表示该受访者的时间槽。 - 其后的 11 列包含从 Sheet1 复制到该受访者/时间的区域。这些36 x 11区域在测试数据中被命名为"Response1-55"。
该VBA脚本的逻辑如下:
计数器: - n 计数器表示受访者数量。 - r 计数器表示剧集的数量。 - i 计数器表示正在复制的响应行号。
对于每个响应(从n=1开始到Respondents): - 选择第一个剧集(从r=1开始到9)。 - 对于每个剧集: - 读取开始、结束和间隔时间。 - 从i = Start 到 i = End 复制第n行的第r个剧集相关单元格。 - 将这些单元格复制到Sheet2当前响应的第i行。 - 当达到当前剧集的 EndTime 时,转到下一个剧集(下一个r)。 - 如果您刚刚完成的剧集的EndTime是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 代码的相关部分在这里。
我已经盯着这个问题看了几个小时,但无论如何都没有发现导致循环提前停止的原因。我希望解决方案是我忽略的某个简单问题,但我真的不知道该怎么做,这并不是自从开始以来第一次遇到这种情况。
这个工作表的组织方式如下: Sheet1:包含要复制的数据。
- 每行包含一个单独的响应,在测试数据中有55个。 - 工作表包含九个数据块,分别命名为Episode 1-9。每个剧集都包含包括开始时间、结束时间和间隔时间的整数列。 - 在测试数据中,每个剧集都相同,除了开始/结束时间不同之外。 - EndTime 的最大值是36。 - 测试数据仅覆盖前四个 Episode 块,因此 Episode4 对于每一行都包含 EndTime=36。
Sheet2:数据要去的地方
- 第一列包含要复制的每个 RespondentID,复制到 36 行。 - 第二列包含数字1-36,因此表示该受访者的时间槽。 - 其后的 11 列包含从 Sheet1 复制到该受访者/时间的区域。这些36 x 11区域在测试数据中被命名为"Response1-55"。
该VBA脚本的逻辑如下:
计数器: - n 计数器表示受访者数量。 - r 计数器表示剧集的数量。 - i 计数器表示正在复制的响应行号。
对于每个响应(从n=1开始到Respondents): - 选择第一个剧集(从r=1开始到9)。 - 对于每个剧集: - 读取开始、结束和间隔时间。 - 从i = Start 到 i = End 复制第n行的第r个剧集相关单元格。 - 将这些单元格复制到Sheet2当前响应的第i行。 - 当达到当前剧集的 EndTime 时,转到下一个剧集(下一个r)。 - 如果您刚刚完成的剧集的EndTime是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
我需要说明的是,我已经从这个网站VBA copy from a union of two ranges to a row of another range得到了帮助,但是代码稍有改动,这是一个不同的问题。
再次感谢您的任何帮助。我已经盯着这个问题几个小时了,但是仍然看不出错误在哪里。非常感谢您的任何指导。