2017-01-03 589 views
3

這是一個簡單的宏代碼,用於複製範圍A2,直到從一個工作簿中刪除最後一行並將其粘貼到另一個工作簿中。我是一個新手,並搜索了很多頁面,但未能幫助自己。該代碼粘貼如下─Excel宏運行時錯誤'9':下標超出範圍(在For循環內複製)

`

Sub TC_Creation_Sample() 
Dim aPath As String, aFile As String, bFile As String 
Dim FinalRow As Integer, x As Integer 

With Application 
    .ScreenUpdating = False 
    .DisplayAlerts = False 
End With 

aPath = "C:\temp\" 
aFile = aPath & "Config" 
bFile = aPath & "TC_Template" 
Workbooks.Open (aFile) 
Sheets("Config").Activate 
'FinalRow = Cells(Rows.Count, "A").End(xlUp).Row 
FinalRow = Worksheets("Config").Range("A2").End(xlDown) 

For x = 2 To FinalRow 
      Worksheets("Config").Range("A" & x).Select 
      Selection.Copy 
      Workbooks.Open (bFile) 
      Worksheets("TestCases").Range("A" & x).Select 
      ActiveSheet.Paste 
Next x  
End Sub 

`

Result-調試後,它的發現該代碼是成功複製粘貼A2值。但是,它引發運行時錯誤9:下標超出範圍。當工作表(「配置」)。範圍(「A」& x).Select第二次在Next x後運行時發生錯誤。我不確定是什麼導致了這個錯誤。好心提醒。

+0

它看起來像你正在執行多次任務,應該只執行一次......就像打開工作簿。並且 - 嘗試全範圍並粘貼它,而不是一個接一個的循環。 – CallumDA

+0

** For循環**的實現是因爲需要查看數據在垂直列中逐個粘貼一個記錄單元。 – Anshu

回答

1

這樣更好嗎?我將workbooks分配到workbook variables並取出selectcopy方法。我還添加了.Row,因爲其他人也建議

Sub TC_Creation_Sample() 
    Dim aPath As String, aFile As String, bFile As String 
    Dim FinalRow As Long, x As Long 
    Dim wbA As Workbook, wbB As Workbook 

    With Application 
     .ScreenUpdating = False 
     .DisplayAlerts = False 
    End With 

    aPath = "C:\temp\" 
    aFile = aPath & "Config" 
    bFile = aPath & "TC_Template" 

    Set wbA = Workbook.Open(aFile) 
    Set wbB = Workbooks.Open(bFile) 

    FinalRow = wbA.Worksheets("Config").Range("A2").End(xlDown).Row 
    'FinalRow = wbA.Worksheets("Config").Cells(Rows.Count, "A").End(xlUp).Row 

    For x = 2 To FinalRow 
     wbB.Worksheets("TestCases").Range("A" & x).Value = wbA.Worksheets("Config").Range("A" & x) 
    Next x 
End Sub 
+0

@ CallumDA-感謝您提出的建議,該建議不僅解決了問題,而且易於理解!另外,FinalRow和x被更改爲Long。 – Anshu

+0

樂意提供幫助,如果這解決了您的問題,請單擊此答案左側的刻度線以接受答案 – CallumDA

1

您尚未將行號分配給FinalRow變量。試試:

FinalRow = Worksheets("Config").Range("A2").End(xlDown).Row 
+0

嘗試添加.Row,但在for循環的第二次運行中在同一位置遇到相同的錯誤 – Anshu

1

有幾點要提。

首先 - 一個Excel工作簿可以包含數百萬行的 - 但你的代碼被僅限於32,768行,因爲你既定義FinalRowX爲整數。如果您打開的工作簿中有超過32,000行,請改用長整型(Dim X as Long,FinalRow as Long)。

現在到錯誤的原因。當您通過For-Next循環第二次運行代碼時,系統會掛起,因爲就其而言,活動工作簿是bFile,並且由於Config選項卡在bFile上不存在(它位於aFile上),它崩潰與您得到的無用的錯誤消息(因爲它找不到正確的選項卡,因爲它看在錯誤的地方)。

順便說一句,您的代碼將嘗試打開(bFile)每次For..Next循環觸發。你需要每次打開文件嗎?當然,這僅僅是將一張紙上的細節複製到另一張紙上的情況?

你也應該有一些錯誤處理。如果一個文件不包含配置選項卡,或者bFile不包含TestCases選項卡,代碼將會崩潰。我強烈建議你處理一些錯誤處理來處理這些實例。

+0

@ AdzzzUK-感謝您指出代碼中的錯誤。 – Anshu

相關問題