2016-05-12 7 views
0

Я пытаюсь скопировать из разных листов, чтобы заполнить сводный лист на основе данных. Тем не менее, я получаю ту туманную ошибку «Ошибка приложения или объекта», и я не знаю, в чем проблема. Код ниже:Excel VBA- Не удается скопировать с одного листа на другой

Sub jtest() 
'For j = 3 To Rows.Count (will loop later once I make sure one iteration works) 
    j = 3 




Atext = Cells(j, "A").Text 


    Worksheets(Atext).Range("U6").Copy Destination:=Worksheets("Summary 2").Range(j, "C") 
    Worksheets(Atext).Range("X6").Copy Destination:=Worksheets("Summary 2").Range(j, "D") 
    Worksheets(Atext).Range("Z6").Copy Destination:=Worksheets("Summary 2").Range(j, "F") 
    Worksheets(Atext).Range("V7").Copy Destination:=Worksheets("Summary 2").Range(j, "G") 

' Next j 






End Sub 
+2

Вы видите, как вы квалифицировали «диапазон» с листом «Рабочие листы (Atext) .Range'? Сделайте то же самое с 'cell'. – findwindow

ответ

3

Во-первых, я предлагаю добавить Option Explicit до самого верха, так что вы будете вынуждены объявлять переменные. Во-вторых, вы неправильно используете Range() при вставке. Измените это на Cells(), и вы хорошо пойдете!

Sub jtest() 
Dim j&, Atext$, lastRow& 

Application.ScreenUpdating = False 
Application.Calculation = xlCalculationManual 
lastRow = Worksheets("Sheet1").Cells(Sheet("Sheet1").Rows.Count,1).End(xlUp).Row ' CHANGE THAT WORKSHEET AS NECESSARY. I'm also assuming your Column A has the most data. 
For j = 3 To lastRow  

    Atext = Worksheets("Sheet1").Cells(j, "A").Text ' CHANGE THAT WORKSHEET AS NECESSARY 

    Worksheets("Summary 2").Cells(j, "C").Value = Worksheets(Atext).Range("U6").Value 
    Worksheets("Summary 2").Cells(j, "D").Value = Worksheets(Atext).Range("X6").Value 
    Worksheets("Summary 2").Cells(j, "F").Value = Worksheets(Atext).Range("Z6").Value 
    Worksheets("Summary 2").Cells(j, "G").Value = Worksheets(Atext).Range("V7").Value 

Next j 
Application.ScreenUpdating = True 
Application.Calculation = xlCalculationAutomatic 
End Sub 

Я отредактировал вашу идею tad. Вместо того, чтобы зацикливать более 200 000 раз (что произойдет, если вы используете Rows.Count), я создал переменную lastRow, если ваш столбец «Sheet1» имеет наибольшее количество данных (при необходимости отредактируйте). Я также просто установил значения диапазонов равными, которые пропускают с помощью буфера обмена и немного быстрее. Обратите внимание, что это только сохранит значения, если вам нужен формат, затем вернитесь к .Copy Destination:= ..., но измените Range(j, "C") на Cells(j, "C").

+1

Я знаю, что это не вопрос, но понимаете ли вы, что ОП итерирует более 1 миллиона раз. –

+0

@ScottCraner - Яков, я этого не делал. Я добавил второй код, который (я думаю) должен быть немного быстрее, нет? – BruceWayne

+1

Да, но я бы все равно нашел последнюю строку с данными в столбце A, просто чтобы сделать это намного быстрее. –

0

вместо того, чтобы ссылаться на ячейки таким образом, создавать объекты диапазона, которые ссылаются на ячейку. используя пример, приведенный выше ответ:

dim row as range, summaryRow as range, sh as worksheet 
set sh = activeworkbook.sheets("Summary 2") 
for each row in sh.usedrange.rows 'I prefer to use "usedrange" 

как вы Переберите строк или столбцов, однако вы собираетесь сделать это, установите строку, которую вы используете для диапазона строк, то же самое для итоговой строки, и затем скопируйте один в другой.

row.cells(column).copy summaryRow 
Смежные вопросы