2016-12-06 171 views
1

當我想在打開的6個工作簿(在我的情況下,從「Sheet1」單元格(B9:E111)到「Sheet2」)將單元格的值從一個工作表複製到anoter時)我站在錯誤的面前:「運行時錯誤9:下標越界」 這是我寫的代碼:vba:運行時錯誤'9'

Sub sbCopyRangeToAnotherSheet() 

    For i = 1 To 6 

    Workbooks(i).Worksheets("Sheet2").Range("A1").Value = Workbooks(i).Worksheets("Sheet1").Range("B9:E111").Value 

    Next i 

End Sub 

可能有人能幫助我嗎? 謝謝

+3

您正試圖將多個單元格複製到一個單元格中。也許嘗試從兩端刪除.value?或者讓陳述的左半部分的範圍與右側的大小相同? – Rdster

+1

你有6個工作簿嗎?他們是否都有「Sheet2」和「Sheet1」?你也試圖把許多單元格的價值合而爲一。 –

+0

Rdster-我試圖把相同的範圍(A1:D103),但同樣的錯誤。 –

回答

2

如果你的所有工作簿都打開(下面的代碼可以只有1也行,2,或3打開),它將值從Range("B9:E111")"Sheet2"從複製並粘貼到「工作表Sheet1」單元格「A1」。

Sub sbCopyRangeToAnotherSheet() 

Dim i As Integer 
Dim wb() As Workbook 

' work with dynamic number of current open workbooks 
ReDim wb(1 To Application.Workbooks.count) 

For i = 1 To Application.Workbooks.count 
    Set wb(i) = Workbooks(i) 
    wb(i).Worksheets("Sheet1").Range("B9:E111").Copy 
    wb(i).Worksheets("Sheet2").Range("A1").PasteSpecial xlValues 
Next i 

End Sub 

EDIT1

Sub sbCopyRangeToAnotherSheet() 

Dim i As Integer 
Dim wb() As Workbook 

' work with dynamic number of current open workbooks 
ReDim wb(1 To Application.Workbooks.Count) 

For i = 1 To Application.Workbooks.Count 
    Set wb(i) = Workbooks(i) 
    wb(i).Worksheets(1).Range("B9:E111").Copy 
    wb(i).Worksheets(2).Range("A1").PasteSpecial xlValues 
Next i 

End Sub 
+0

不幸的是,所有建議的解決方案都失敗了,而在yelow中調試行的方式是:「wb(i).Worksheets(」Sheet1「)。Range 「B9:E111」)。複製「在所有解答中(範圍內的行(」B9:E111「) –

+0

@ Maya.R是否確定在所有工作簿中都有一張名爲」sheet1「的工作表?工作簿的名稱,而不是索引 –

+0

不,我更改了工作表的名稱,「sheet1」和「sheet2」是它們的索引。它工作時,我沒有使用for循環,並沒有索引我分別編寫每個工作簿的代碼,但我不得不使用範圍(「A11:D103」),而不是(「A1」)。我不知道它爲什麼不在循環中工作。 –

0

你試圖做這樣的事情:

Sub sbCopyRangeToAnotherSheet() 

    For i = 1 To 6 

    Workbooks(i).Worksheets("Sheet2").Range("A1").Value = worksheetfunction.sum(Workbooks(i).Worksheets("Sheet1").Range("B9:E111")) 

    Next i 

End Sub 
+0

謝謝,我試過這個,但同樣的錯誤發生了 –

1

試試這個,我認爲這是把整個的價值問題範圍到一個單元格。我第一次給它分配到一個數組,然後把從什麼是A1 +陣列的上邊界陣列...

Sub sbCopyRangeToAnotherSheet() 

Dim vArr() As Variant 

    For i = 1 To 6 

    vArr = Workbooks(i).Worksheets("Sheet1").Range("B9:E111").Value 
    With Workbooks(i).Worksheets("Sheet2") 
     .Range(.Cells(1, 1), .Cells(UBound(vArr, 1), UBound(vArr, 2))).Value = vArr 
    End With 
    Next i 

End Sub 
+0

謝謝,我試過這個,但同樣的錯誤發生了。 –

+0

這意味着您指的是某些未找到的內容,例如一個工作簿(我們正在遍歷6個工作簿並假設我們始終具有相同的數據設置,就像其他人發佈的那樣,有點冒險)。如果您打開另一個工作簿並使用其他設置,則會觸發錯誤。如果您沒有打開6個工作簿,則會觸發錯誤。 –

+0

如果您可以提供整個代碼,甚至可以使用工作簿(例如dropbox),我確信我們可以修復它。 –

5

「下標越界」意味着你訪問數組/集合超越其界限。

Workbooks(i).Worksheets("Sheet2").Range("A1").Value = Workbooks(i).Worksheets("Sheet1").Range("B9:E111").Value 

我在單指令中計算了幾個不同的地方,可能會引發這個錯誤。拆分它。

Dim book As Workbook 
' if it blows up here, check how many books you have open: 
Set book = Workbooks(i) 'consider looping from 1 To Workbooks.Count instead of 1 To 6 

Dim source As Worksheet 
' if it blows up here, check the filename of the book and whether it has a "Sheet1": 
Set source = book.Worksheets("Sheet1") 

Dim destination As Worksheet 
' if it blows up here, check the filename of the book and whether it has a "Sheet2": 
Set destination = book.Worksheets("Sheet2") 

' when it blows up here, consider exactly what you're trying to do: 
destination.Range("A1").Value = source.Range("B9:E111").Value 

最後一條指令對我來說看起來很可疑。如果您嘗試將Sheet1!B9:E111粘貼到Sheet2!A1中,請考慮使用Copy + PasteSpecial,如Shai Rado's answer中所示。

如果你的意思是遍歷所有打開的工作簿,考慮For Each循環,而不是:

Dim book As Workbook 
For Each book In Workbooks 
    '... 
Next 
+1

感謝您提供實際解釋並解決實際問題的完整答案。 –

+0

@ScottHoltzman謝謝!我試圖提供釣魚竿而不是魚=) –

1

我會警告說,使用工作簿的索引這樣是有風險的,但嘗試這個..

Sub sbCopyRangeToAnotherSheet() 

    For i = 1 To 6 
     Workbooks(i).Worksheets("Sheet1").Range("B9:E111").Copy Workbooks(i).Worksheets("Sheet2").Range("A1") 
    Next i 

End Sub 
+0

謝謝,我試過這個,但是出現同樣的錯誤 –

+0

是否有可能您打開另一個工作簿(就像宏中運行的那個工作簿)沒有Sheet1和Sheet2的? – tlemaster