![](/img/trans.png)
[英]Excel - How to conditionally lock and unlock a particular cell using VBA.
[英]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
鎖定所有單元格空白單元格(注意:公式中的=""
值被視為一個值,並將保持解鎖狀態)
Unprotect
和Protect
都需要使您的更改完全生效。
如果這是每次更改值時要運行的代碼,則必須查看Worksheet_Change
事件。 如果您的目標是解鎖空單元格並鎖定包含值的單元格,只需交換True
和False
。
編輯(根據您的評論)
如果這是您希望在每個下一個單元格選擇上運行的東西,請嘗試以下操作(包括錯誤處理程序,因為您不再使用整個工作表)
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.