Почему я получаю эту ошибку при копировании / вставке? - PullRequest
0 голосов
/ 23 февраля 2020

Я получаю сообщение об ошибке

Ошибка выполнения 1004: определено приложение или определенная объектом ошибка

в моем коде VBA. Не могли бы вы помочь мне исправить это?

Sub INPUT_DATA()
    ' INPUT_DATA Macro
    ' Application.ScreenUpdating = False
    Application.EnableEvents = False
    Sheets("Input").Select
    If Range("D55").Value = 0 Then
        Range("B2:AI52").Select
        Selection.Copy
        Sheets("Database").Select
        ActiveSheet.Range("A2").End(xlDown).Offset(1, 0).Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    End If
    Sheets("Input").Select
    MsgBox ("File has been updated. DO NOT PRESS UPDATE again, as it will enter the same data once again")
End Sub

1 Ответ

1 голос
/ 23 февраля 2020

Вы не сказали, какая строка вызывает ошибку, но похоже, что, скорее всего, эта строка ...

ActiveSheet.Range("A2").End(xlDown).Offset(1, 0).Select

Она начинается с А2, а затем идет вниз, пока не найдет последнюю используемый ряд. Однако, если нет никаких используемых строк ниже A2, он находит самую последнюю строку в столбце A. Затем он пытается сместиться на одну строку ниже, которая не существует, и, следовательно, ошибка. Вместо этого вы можете найти следующую доступную строку следующим образом ...

ActiveSheet.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Select 

Хотя нет необходимости делать весь этот выбор. Это очень неэффективно. Таким образом, ваш макрос может быть переписан следующим образом ...

Option Explicit

Sub INPUT_DATA()

' INPUT_DATA Macro

    With Application
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    Dim sourceWorksheet As Worksheet
    Set sourceWorksheet = Worksheets("Input")

    Dim destinationWorksheet As Worksheet
    Set destinationWorksheet = Worksheets("Database")

    With sourceWorksheet
        If .Range("D55").Value = 0 Then
            .Range("B2:AI52").Copy
            With destinationWorksheet
                .Cells(.Rows.Count, "A").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
            End With
        End If
    End With

    With Application
        .ScreenUpdating = True
        .EnableEvents = True
    End With

    MsgBox ("File has been updated. DO NOT PRESS UPDATE again, as it will enter the same data once again")

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...