2012-03-08 149 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