2016-12-06 4 views
1

Когда я хочу скопировать значения ячеек с одного листа на анотер в 6 книгах, которые открываются (в моем случае из ячеек «Sheet1» (B9: E111) на «Sheet2») Я стою перед ошибкой: «ошибка времени выполнения 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

Вы пытаетесь скопировать несколько ячеек в один. Может быть, попробуйте удалить значение с обоих концов? Или сделать диапазон в левой половине утверждения того же размера, что и право? – Rdster

+1

У вас открыто 6 книг? У всех у них есть «Лист2» ​​и «Лист1»? Также вы пытаетесь поместить значение многих ячеек в одно. –

+0

Rdster- Я попытался установить тот же диапазон (A1: D103), но такую ​​же ошибку. –

ответ

2

Если все ваши рабочие книги открыты (ниже код может также работать, если только 1, 2 или 3 открыты), он будет копировать значения из Range("B9:E111") в "Sheet2" и вставить их в «Лист1» из Ячейка «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 »). Диапазон («B9: E111»). Скопируйте «во всех сольтунах (линия с диапазоном (« B9: E111 ») –

+0

@ Maya.R вы уверены, что у вас есть лист с именем« sheet1 »во всех ваших книгах? имя рабочей книги, а не индекс –

+0

Нет, я изменил имена листов, «sheet1» и «sheet2» - их индексы.Он работал, когда я не использовал цикл for и написал код для каждой книги отдельно без индекса i, но мне пришлось использовать диапазон («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