VBA Select 并且在 Excel 中添加 Locked/Unlocked 个单元格后复制不起作用

VBA Select and Copy Not Working After Adding Locked/Unlocked Cells in Excel

我创建了一个 Excel Sheet,它有一个命令按钮(Active X 控件)。按钮 select 并复制单元格 e2:e16,e106:e117。

我还添加了代码以根据单元格 C3 锁定或解锁单元格 C112 和 C116。如果 C3 为“1”,则单元格保持解锁状态,如果为“2”,则单元格锁定。

sheet 开始受保护,因此除了需要输入数据的单元格外,大多数单元格都被锁定。

当 ActiveSheet.Protect "" 被注释掉时,它可以正确复制,但是 sheet 在我将 C3 更改为 "1" 或 "2" 后不会保护自己。

如果 'ActiveSheet.Protect "" 没有被注释掉 lock/unlock 有效,但它会尝试 select 并复制单元格 C3 并忽略它假设的范围 select并复制。

我希望两者一起工作。

左上'ActiveSheet.Protect注释掉了。

点击“复制叙述”按钮后右上角 select 复制了正确的区域,但整个 sheet 未受保护。

左下 ActiveSheet.Protect 未注释掉。

点击 Copy Narrative 后右下 selects 并复制单元格 C3。

Select 并复制单元格:

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

Lock/Unlock 单元格:

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

我认为你应该

一个。复制前取消保护范围

或者

乙。不要在 "copyButton_Click" 运行期间调用 "Worksheet_SelectionChange"

打击代码为案例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