Попытка избежать .Select или .Activate, но не с ошибкой 1004 - PullRequest
2 голосов
/ 05 июля 2019

Я пишу небольшой макрос с некоторыми циклами, прекрасно работает, но сейчас пытаюсь очистить и избегать использования .Select и .Activate, но при этом я запускаю в «Ошибка 1004»

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

Вот код:

Sub Sæt_ind_i_eksporten()

Dim dagensliste As Worksheet
Dim trailerliste As Worksheet
Dim trailernummer As String
Dim finalrow As Integer
Dim i As Integer
Dim t As Integer
Dim targetcount As Integer

Set trailerliste = ThisWorkbook.Sheets("Data ud (2)")
Set dagensliste = ThisWorkbook.ActiveSheet

Application.ScreenUpdating = False

targetcount = trailerliste.Cells(30, 1).End(xlDown).Row

finalrow = Cells(Rows.Count, 1).End(xlUp).Row

For t = 30 To targetcount
trailernummer = trailerliste.Cells(t, 3).Value

    For i = 4 To finalrow
        If Cells(i, 3) = trailernummer Then

            ' Here is where it fails - If I select the sheet manually, it moves on
            trailerliste.Range(Cells(t, 1), Cells(t, 13)).Copy

            ' And here it fails again (logic i know!) select manually again and it moves on.
            dagensliste.Range(Cells(i, 1), Cells(i, 13)).PasteSpecial xlPasteValues     
        End If
    Next i
Next t

Application.GoTo reportsheet.Range(A1)

MsgBox ("Søgning gennemført")

Application.ScreenUpdating = True

End Sub

Если я заменим trailerliste.Range(Cells(t, 1), Cells(t, 13)).Copy на trailerliste.select и Range(Cells(t, 1), Cells(t, 13)).Copy в отдельных строках, и то же самое для dagensliste.Select, тогда код прекрасно работает.

Я знаю, что это просто, но я попытался прочитать все, что смог найти на форуме, но безуспешно.

Надеюсь, мне можно помочь:)

С уважением

Ответы [ 2 ]

4 голосов
/ 05 июля 2019
Диапазон

(ячейки (x, y)) сложен, потому что вы должны указать рабочую таблицу, где находятся ячейки.

trailerliste.Range(Cells(t, 1), Cells(t, 13)).Copy

должно быть

trailerliste.Range(trailerliste.Cells(t, 1), trailerliste.Cells(t, 13)).Copy
3 голосов
/ 05 июля 2019

Эта строка:

trailerliste.Range(Cells(t, 1), Cells(t, 13)).Copy

эквивалентна:

trailerliste.Range(ActiveSheet.Cells(t, 1), ActiveSheet.Cells(t, 13)).Copy

Если trailerListe окажется активным рабочим листом, то это будет работать нормально.Если активен другой лист, это приведет к ошибке.

Неправильное использование Range(Cells, Cells) является одним из наиболее распространенных источников ошибок в Excel VBA.Требуется три разных ссылки на лист, и все три должны ссылаться на один и тот же лист.

Это будет работать:

trailerliste.Range(trailerliste.Cells(t, 1), trailerliste.Cells(t, 13)).Copy

, но обычно проще использовать С блок:

With trailerliste
    .Range(.Cells(t, 1), .Cells(t, 13)).Copy
End With

Любая ссылка, которая начинается с ., относится к объекту в блоке With - trailerliste в этом случае.

Аналог Range вызов dagensliste также должен быть заменен на With блок

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