Выбор и копирование VBA не работает после добавления заблокированных / разблокированных ячеек в Excel - PullRequest
0 голосов
/ 12 февраля 2020

Я создал лист Excel, который имеет командную кнопку (Active X Control). Кнопка выбирает и копирует ячейки e2: e16, e106: e117.

Я также добавил код для блокировки или разблокировки ячеек C112 и C116 в зависимости от ячейки C3. Если C3, если «1», ячейки остаются разблокированными, а если «2», ячейки блокируются.

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

Когда ActiveSheet.Protect закомментирован "", он копируется правильно, но лист не защищает себя после того, как я изменил C3 на "1" или "2".

Если «ActiveSheet.Protect» не закомментирован, блокировка / разблокировка работает, но он пытается выбрать и скопировать ячейку C3 и игнорирует диапазон, который он должен выбрать и скопировать.

Я бы хотел, чтобы оба работали вместе.

Code and Excel Sheets

Верхний левый 'ActiveSheet.Protect закомментирован.

Вверху справа после нажатия кнопки «Копировать описание» выбирается и копируется правильная область, но весь лист не защищен.

Внизу слева ActiveSheet.Protect не закомментирован.

Внизу справа после нажатия «Скопировать текст» он выделяет и копирует ячейку C3.

Выбор и копирование ячеек:

Private Sub copyButton_Click()

    'Check for blanks'
    If Range("c3").Value = "" Or _
        Range("c6").Value = "" Or _
        Range("c7").Value = "" Or _
        Range("c8").Value = "" Or _
        Range("c9").Value = "" Or _
        Range("c10").Value = "" Or _
        Range("c108").Value = "" Or _
        Range("e16").Value = "" Or _
        Range("e106").Value = "" Or _
        Range("e115").Value = "" Then
        MsgBox "Required fields are blank."
    Exit Sub
    Else

    'Copy Ranges
    Range("e2:e16,e106:e117").Select
    Selection.Copy

    End If

End Sub

Блокировка / разблокировка ячеек:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

   'Change cells locked/unlocked
     ActiveSheet.Unprotect ""
     If Range("C3").Value = "1" Then
      Range("C112,c116").Locked = False
     Else: Range("C3").Value = "2"
      Range("C112,c116").Locked = True
     End If
     ActiveSheet.Protect ""

End Sub

1 Ответ

0 голосов
/ 12 февраля 2020

Я думаю, вы должны

A. Снимите защиту перед копированием Диапазон

Или

B. Не вызывайте «Worksheet_SelectionChange» во время выполнения «copyButton_Click»

код удара для случая B

Private Sub copyButton_Click()
    'Dont Call Sheet events
    Application.EnableEvents = false
    'Check for blanks'
    If Range("c3").Value = "" Or _
        Range("c6").Value = "" Or _
        Range("c7").Value = "" Or _
        Range("c8").Value = "" Or _
        Range("c9").Value = "" Or _
        Range("c10").Value = "" Or _
        Range("c108").Value = "" Or _
        Range("e16").Value = "" Or _
        Range("e106").Value = "" Or _
        Range("e115").Value = "" Then
        MsgBox "Required fields are blank."
    Exit Sub
    Else

    'Copy Ranges
    Range("e2:e16,e106:e117").Select
    Selection.Copy

    End If
    'rollBack
    Application.EnableEvents = True
End Sub


...