我有一个带有一个空白工作表的Excel工作簿,以便 worksheet is protected 和其中,保护少数单元格,例如A1,A3和A4设置为 unlocked ,而单元格A2的保护设置为 locked . 我想只在未锁定的单元格中写入数据而不更改锁定单元格中的任何内容 . 我也写了这个宏 .

Sub WriteValue()
    On Error GoTo ErrHandler
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(1)

    Dim oCell As Range
    Set oCell = ws.Range("A1")

    Dim ValueArray() As Variant
    ReDim ValueArray(3, 0)

    ValueArray(0, 0) = "A1"
    ValueArray(1, 0) = "A2"
    ValueArray(2, 0) = "A3"
    ValueArray(3, 0) = "A4"

    oCell.Resize(UBound(ValueArray) + 1, 1).Value2 = ValueArray
    MsgBox "Success"
    Exit Sub
ErrHandler:
     Debug.Print Err.Description
End Sub

当在excel 2013中执行宏时,它会抛出“应用程序定义的或对象定义的错误”,因为单元格A2被锁定并且工作表受到保护,但它仍然会将数据写入未锁定的单元格A1,A3和A4中 . 当我在Excel 2016中运行相同的宏时,它会抛出“应用程序定义的或对象定义的错误”,但不会在未锁定的单元格中写入任何数据 .

为了在Excel 2016中实现上述Excel 2013行为,我可以循环遍历每个单元格以检查单元格是否在向其写入数据之前被锁定,但如果单元格数量巨大则会非常耗时 . 在excel 2016中还有其他方法可以实现这一目标吗?