Ошибка выполнения 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
Другие вопросы по тегам