我有一個應該將數據從一張表複製到另一張的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但自那時以來代碼已經稍微改變了,這是一個不同的問題。
再一次,非常感謝您爲此提供的任何幫助。我一直盯着這幾個小時,並沒有看到錯誤在哪裏。任何指導都非常感謝。
你可能想在某個階段重新考慮電子表格的整體設計 - 使用命名範圍你這樣做很容易出錯,難以調試的方式(因爲你已經注意到了!)。 Excel非常好,並且易於與表格數據一起使用 - 而不是有9個單獨的範圍,例如,您可以爲一個塊添加一個包含該劇集編號的附加列。這個簡單的改變會顯着提高可讀性和代碼。 – assylias 2012-03-08 11:09:00
再次感謝您的反饋。該表實際上是由一個程序生成的,因此產生了一些混亂,但我明白了您的意思是抵消選擇而不是使用範圍。目前的方法非常接近,但如果我不能完全使用它,我將使用建議的方法。在這種情況下,我會通過msg問你是否可以接受它。再次感謝您的關注。非常感激。 – TornHair 2012-03-08 12:22:33