簡體   English   中英

如何動態鎖定和解鎖 Excel 中的單元格?

[英]How to dynamically lock and unlock a cell in Excel?

我應該怎么做才能動態鎖定/解鎖 excel 中的單元格? 例如,如果我創建一個新文檔,默認情況下所有單元格都是解鎖的,但我在該單元格上輸入了一個數據,它將被鎖定。 我試過了,我在這里找到了Lock empty cells and unlock free cells

Sub test()
    Dim rngTemp As Range

    For Each rngTemp In Range("A1:XFD1048576").Cells
        With rngTemp
            If .Value > 0 Or Len(.Value) > 0 Then
                .Locked = False
            End If
        End With
    Next
End Sub

但它不適用於我的情況。 我使用的是 2007 excel 版本。 我還需要保存代碼還是Alt + Q就足夠了?


編輯:根據@JvdV 的回答,我嘗試了以下方法:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
With Sheet1
    .Unprotect
    .Cells.Locked = True
    .Cells.SpecialCells(xlCellTypeBlanks).Locked = False
    .Protect
End With
End Sub

但這會返回錯誤Run-time error '1004' No cells were found on .Cells.SpecialCells(xlCellTypeBlanks).Locked = False

如果您真的對這些單元格感興趣,您可以簡單地參考工作表的單元格。 此外,無需單獨遍歷這些單元格,例如:

Sub test()

Dim rng As Range
With Sheet1 'Change according to your sheet's CodeName
    .Unprotect
    .Cells.Locked = False
    .Cells.SpecialCells(xlCellTypeBlanks).Locked = True
    .Protect
End With

End Sub

其中.Cells.Locked = False解鎖所有單元格和.Cells.SpecialCells(xlCellTypeBlanks).Locked = True鎖定所有單元格空白單元格(注意:公式中的=""值被視為一個值,並將保持解鎖狀態)

UnprotectProtect都需要使您的更改完全生效。

如果這是每次更改值時要運行的代碼,則必須查看Worksheet_Change事件。 如果您的目標是解鎖空單元格並鎖定包含值的單元格,只需交換TrueFalse


編輯(根據您的評論)

如果這是您希望在每個下一個單元格選擇上運行的東西,請嘗試以下操作(包括錯誤處理程序,因為您不再使用整個工作表)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Sheet1.Unprotect 'Change according to your sheet's CodeName
With Target
    .Cells.Locked = True
    On Error Resume Next
    .Cells.SpecialCells(xlCellTypeBlanks).Locked = False
    On Error GoTo 0
End With
Sheet1.Protect

End Sub

如果您正在尋找循環遍歷目標范圍的替代方法,您可以實施@M.Schalk 的建議

作為上述(正確)答案的補充,這是我對Worksheet_Change事件的建議,正如您在評論中所要求的那樣。 這必須放在特定於工作簿的代碼模塊中:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim cll As Range
On Error Resume Next

For Each cll In Target.Cells
    With cll
        If .Value2 <> vbNullString Then
            .Locked = True
        Else
            .Locked = False
        End If
    End With
Next
End Sub

需要注意的是,(至少在我的 Excel 版本中)單元格的.Locked屬性僅在工作表受到保護時才有效。 但是,要更改.Locked屬性的值,工作表必須不受保護。 要合並這一點,您可能需要使用以下內容:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim cll As Range
On Error GoTo Handler

Me.Unprotect
For Each cll In Target.Cells
    With cll
        If .Value2 <> vbNullString Then
            MsgBox cll.Value2
            .Locked = True
        Else
            MsgBox "NullString"
            .Locked = False
        End If
    End With
Next
Handler:
    Me.Protect
End Sub

這將導致每個單元格在輸入值后變得不可更改,同時仍允許用戶在所有空單元格中輸入值。 要更改現有值,您需要手動取消對工作表的保護。 在工作表未受保護和更改后,您可以使用類似於上述答案中提供的代碼來恢復所需的 state。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM