У меня есть скрипт vba, который должен копировать данные с одного листа на другой. Это делается с помощью трех вложенных циклов for. Пошаговое выполнение кода при отладке кажется, что они работают отлично, но когда запускается скрипт vba, они останавливаются слишком рано. В противном случае скрипт vba работает.
Я смотрел на это в течение нескольких часов и не могу понять, что может привести к преждевременной остановке циклов. Я надеюсь, что решение - это что-то простое, что я пропустил, но я в настоящей потере, не в первый раз с тех пор, как начал это.
Лист организован следующим образом:
Sheet1 содержит данные для копирования.
- Каждая строка содержит отдельный ответ, которых в тестовых данных 55.
- Лист содержит девять блоков данных, названных Episode 1-9. Каждый эпизод содержит столбец, в котором целое число представляет время начала, окончания и интервала.
- В тестовых данных каждый эпизод идентичен, за исключением времени начала/окончания.
- Максимальное значение EndTime – 36.
- Тестовые данные относятся только к первым четырем блокам Episode, поэтому Episode4 содержит EndTime=36 для каждой строки.
Лист 2, куда должны быть помещены данные. - Первый столбец содержит каждый RespondentID, скопированный в 36 строк. - Второй столбец содержит числа 1–36, таким образом, представляющие этот временной интервал для этого респондента. что Респондент/Время ставится. Эти области 36x11 названы «Response1-55» в тестовых данных.
Логика скрипта vba следующая:
Счетчики: - счетчик n для количества респондентов - счетчик r для количества эпизодов - счетчик i для строк в копируемых ответах.
->Для каждого ответа (начиная с n=1 до респондентов)
--> Выберите первый эпизод (начиная с r=1 до 9)
--->Для каждого эпизода
---> Прочитайте время начала, окончания и интервала
--->Начиная с i = Начало до i=Конец, скопируйте соответствующие ячейки из n-й строки r-го эпизода
--->Скопируйте эти ячейки к i-й строке текущего ответа на листе2
--->Когда вы достигнете EndTime текущего эпизода, перейдите к следующему (следующему r)
-->Если эпизод вы только что закончили имеет 36 в качестве конечного времени, затем переходите к следующему ответу или продолжайте, пока не закончатся эпизоды.
->Следующий ответ
При отладке код делает именно это.
Однако, когда я запускаю сценарий vba на тестовом листе, он работает только для эпизодов 1 и 2. Данные из эпизодов 3 и 4 не копируются. Ничто не копируется на свое место, а копируемые данные верны во всех отношениях. Сообщений об ошибках нет ни на одном этапе.
Если бы кто-нибудь мог предположить, почему это может происходить, я бы построил для них настоящую церковь. Ответ также можно добавить сюда: https://stackoverflow.com/questions/9594693/vba-copy-from-a-union-of-two-ranges-to-a-row-of-another-range В котором еще нет раздела для 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 копирует из объединения двух диапазонов в строку другого диапазона, но с тех пор код немного изменился, и это другая проблема.
Еще раз большое спасибо за любую помощь, которая может прийти из этого. Я смотрю на это часами и не вижу, где ошибка. Любое руководство вообще очень ценится.