Ошибка выполнения 6 при копировании диапазона в Excel
Я создаю макрос для объединения нескольких листов в один. Поскольку на каждом листе есть различное количество строк, я пытаюсь настроить его динамически, используя.end(xlDown). в настоящее время сабвуфер сталкивается с множеством ошибок: изначально они были объектными ошибками, и когда я их исправил, я получил ошибку времени переполнения стека 6. Изменение переменных с Integers на Long не устранило проблему, теперь я просто получаю "400"ошибка.
Вот код:
Sub Concatenate()
'Declare Variables
Dim Curwb As Workbook
'Set Variables
Set Curwb = ActiveWorkbook
'Concatenate Data
'Timestamps
Dim Stage1Count As Long
Dim Stage2Count As Long
Dim Stage3Count As Long
Dim Stage4Count As Long
Dim Stage5Count As Long
Dim TotalCount As Long
'Stage 1
Curwb.Sheets("Stage 1").Select
If Range("A3").End(xlDown).Address = Range("A3").Address Then
Range("A3").Copy Destination:=Curwb.Sheets _
("CombinedData").Range("A3")
Else
Range("A3", Range("A3").End(xlDown)).Select
Stage1Count = Selection.Cells.Count
Selection.Copy Destination:=Curwb.Sheets _
("Combined Data").Range("A3")
End If
'Stage 2
Curwb.Sheets("Stage 2").Select
If Range("A3").End(xlDown).Address = Range("A3").Address Then
Range("A3").Copy Destination:=Curwb.Sheets _
("Combined Data").Range("A3").Offset(Stage1Count, 0)
Else
Range("A3", Range("A3").End(xlDown)).Select
Stage2Count = Selection.Cells.Count
Selection.Copy Destination:=Curwb.Sheets _
("Combined Data").Range("A3").Offset(Stage1Count, 0)
End If
End Sub
Что не так с моим кодом?
1 ответ
Несколько вещей, чтобы помочь:
1) Избегайте использования .Select
, ActiveWorkbook
, ActiveSheet
и т.п.
2) Вместо использования .End(xlDown)
, если вы идете в последний ряд и используете .End(xlUp)
он получит ваш последний использованный ряд гораздо эффективнее.
3) Также проще работать с листами, которые были объявлены как переменные.
Я внес коррективы в ваш код, который немного укоротил его и должен позволить вам выполнить то, что вам нужно.
Sub Concatenate()
'Declare Variables
Dim Curwb As Workbook
'Set Variables
Set Curwb = Workbooks("NameOfWorkbook") 'Avoid ActiveWorkbook at all cost :)
Dim ws As Worksheet, wsCopyTo As Worksheet
Dim rng As Range
With Curwb
Set ws = .Sheets("Stage 1")
Set wsCopyTo = .Sheets("Combined Data")
With ws
Set rng = .Range(.Range("A3"), .Range("A" & .Rows.Count).End(xlUp))
rng.Copy wsCopyTo.Range("A" & wsCopyTo.Rows.Count).End(xlUp).Offset(1)
End With
Set ws = .Sheets("Stage 2")
With ws
Set rng = .Range(.Range("A3"), .Range("A" & .Rows.Count).End(xlUp))
rng.Copy wsCopyTo.Range("A" & wsCopyTo.Rows.Count).End(xlUp).Offset(1)
End With
End Sub