Ошибка выполнения 1004 при выполнении второго макроса - PullRequest
0 голосов
/ 29 марта 2020

Он хорошо работал до защиты листа

Я искал похожую проблему здесь, в SO, но не решил мою проблему. Я не знаю, указано ли это c для моего кода.

У меня есть защищенный лист и все ячейки заблокированы, кроме одного диапазона, который я называю R. Я копирую содержимое из R в R2, но я необходимо снять защиту листа в первую очередь. Затем я копирую все из R в R2, затем блокирую и снова защищаю лист. Как я уже сказал во второй раз, когда я запускаю макрос, он выдает ошибку 1004 и не может понять, почему. Код работал хорошо, пока я не защищал лист все время. Вот код:

Выдает ошибку в строке, где написано

.PasteSpecial Paste:=xlPasteAll

Ошибка выполнения 1004 в методе PasteSpecial класса .Range

Sub CopyPapers(ByRef R As Range, R2 As Range)
    With R2
        R.Copy
        Hoja1.Unprotect
        .PasteSpecial Paste:=xlPasteAll
        .Locked = True
        Hoja1.Protect
    End With

    R.Cells(2, 1).Activate
    Application.CutCopyMode = False
End Sub

R и R2 - диапазоны ячеек. Всякий раз, когда я обновляю содержимое в R , это содержимое и форматы копируются в R2 . Для этого я использую событие Worksheet_Change () и проверяю, изменяется ли только диапазон ( R ) с использованием метода Intersect () .

Edit: я игнорирую почему, но кажется, что перемещение R.Copy инструкция под Hoja1.Unprotect , похоже, решает проблему. Если кто-нибудь может объяснить, почему это так, я буду признателен.

1 Ответ

1 голос
/ 29 марта 2020

вызов метода Unprotect отменяет ранее выданную команду Copy, поэтому последующие PasteSpecial завершаются неудачно

Кстати, правильная последовательность операторов должна быть в порядке

Sub CopyPapers(ByRef R As Range, R2 As Range)
    Hoja1.Unprotect
    R.Copy
    With R2
        .PasteSpecial Paste:=xlPasteAll
        Application.CutCopyMode = False
        .Locked = True
    End With
    Hoja1.Protect

    R.Cells(2, 1).Activate
End Sub

  • Unprotect первый

  • заполнить With .. End With блок только с операторами, которые ему принадлежат

  • запустить Application.CutCopyMode = False как можно скорее

И все же следует внести некоторые изменения, чтобы убедиться, что диапазоны R и R2 действительно принадлежат Hoja1 sheet

например, вы можете использовать R.Parent.Unprotect и R.Parent.Protect, чтобы убедиться, что вы действуете на листе, к которому принадлежит R. И все же предполагая, что R2 тоже принадлежит ему ...

Наконец, убедитесь, что ваш обработчик событий Worksheet_Change() не вызывает себя рекурсивно, отключив Application.EnableEvents перед вызовом CopyPapers() и включив его перед выходом

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