2012-04-17 120 views
11

我用下面的代碼來鎖定某些細胞VBA的Excel - 如何鎖定特定的細胞,但允許過濾和排序

Sub LockCell(ws As Worksheet, strCellRng As String) 
    With ws 
    .Unprotect 
    .Cells.Locked = False 
    .Range(strCellRng).Locked = True 
    .Protect Contents:=True, AllowFormattingCells:=True, AllowFormattingColumns:=True, AllowFormattingRows:=True, AllowInsertingColumns:=True, AllowInsertingRows:=True, AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True, DrawingObjects:=True 
    End With 
End Sub 

它運作良好,鎖定那些特定列的內容的內容。問題在於,在電子表格本身上工作時,用戶無法對濾鏡進行排序,也無法將邊框應用於單元格,因爲這些Excel菜單項已禁用。我認爲AllowSorting:=True,AllowFiltering:=TrueDrawingObjects:=True將允許與AllowFormattingColumns:=TrueAllowFormattingRows:=True允許調整大小相同的方式。

非常感謝您的幫助。

問候, 羅納德

+1

我建議你重新閱讀Excel工作表Proptect的幫助文件,特別是關於_Allow_參數保護_worksheets_和locked_cells_。 AllowSorting:「排序範圍內的每個單元格必須解鎖或不受保護」AllowFiltering:「用戶可以更改過濾條件,但不能啓用或禁用自動過濾器」 – 2012-04-17 19:43:36

+0

謝謝,雖然這很讓人傷心,因爲我需要能夠阻止某些內容,但允許用戶排序​​和過濾。有任何想法嗎? – 2012-04-17 22:13:42

+0

1.)確保你的範圍不與其他範圍重疊。 2)解鎖表格中的所有單元格,然後將鎖定應用於範圍。 3.)「當表單受到保護時,必須解鎖要過濾的單元格。」 ...所以只是不要將這些'過濾器單元'作爲鎖定範圍的一部分。 https://msdn.microsoft.com/en-us/library/office/ff839866.aspx – 2016-06-29 17:28:22

回答

5

這對我來說是一個大問題,我發現有一個相對簡單的答案下面的鏈接。謝謝Voyager !!!

注意,我指定的範圍內,我想其他人能夠進行排序

  • 撤消工作表
  • 進入「保護」 ---「允許用戶編輯區域」(如Excel 2007中,「評論」選項卡)
  • 添加‘新’範圍
  • 選擇要允許的範圍內的用戶進行排序
  • 單擊‘保護工作表’
  • 這一次,* 不允許用戶選擇 「鎖定單元格」 **
  • OK

http://answers.yahoo.com/question/index?qid=20090419000032AAs5VRR

7

有許多人用這個困難。主要的答案是,你無法保護內容不被編輯,同時允許無阻礙的排序。您的選項是:

1)允許編輯和排序:(

2)將保護和創造的代碼按鈕使用VBA進行排序。還有其他的帖子解釋瞭如何做到這一點。我認爲有兩種方法,(1)獲取代碼解除表單保護,應用排序,然後重新保護表單,或者(2)使用UserInterfaceOnly:=True保護表單。

3)羅瑞的答案,不允許用戶選擇單元格(https://stackoverflow.com/a/15390698/269953

4)一個解決方案,我沒有使用VBA提供一些基本的保護見過討論。例如,使用Worksheet_Change檢測並還原更改。然而,這遠非理想的解決方案。

5)當用戶選擇數據時,您可以保留工作表的保護,並且當用戶選擇標題時,您可以不保護。這給用戶留下了無數的方式,使用戶可能會混淆數據,同時也造成一些可用性問題,但至少可以減少討厭的同事不小心做出不必要更改的機率。

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    If (Target.row = HEADER_ROW) Then 
     wsMainTable.Unprotect Password:=PROTECTION_PASSWORD 
    Else 
     wsMainTable.Protect Password:=PROTECTION_PASSWORD, UserInterfaceOnly:=True 
    End If 
End Sub 
1

這裏是解釋問題和解決方案有很多更詳細的文章:

Sorting Locked Cells in Protected Worksheets

明白的事情是,鎖定細胞的目的是爲了防止它們被改變,並永久排序更改單元格值。您可以編寫一個宏,但更好的解決方案是使用「允許用戶編輯範圍」功能。這使得單元格可以編輯以便進行排序,但是由於單元格在技術上仍處於鎖定狀態,因此可以防止用戶選擇它們。

2

我剛想出一個棘手的方法來獲得幾乎相同的功能。不是以正常方式保護表單,而是使用事件處理程序來撤消用戶嘗試執行的任何操作。

以下添加到工作表的模塊:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Locked = True Then 
     Application.EnableEvents = False 
     Application.Undo 
     Application.EnableEvents = True 
    End If 
End Sub 

如果用戶做任何事情來改變這種狀況是鎖着的,動作將會立即撤消細胞。臨時禁用事件是爲了避免觸發此事件,導致無限循環。

排序和過濾不會觸發Change事件,因此這些功能保持啓用狀態。

請注意,此解決方案可防止更改或清除單元格內容,但不會阻止更改格式。確定的用戶可以通過簡單地設置要解鎖的單元來解決它。

+0

正是我在找的東西 - 這是使用'locked'標誌的巧妙方法。這應該是答案 – 2017-12-14 11:48:43

0

如果自動篩選是一個子程序操作的一部分,你可以使用

BioSum.Unprotect "letmein" 

'<Your function here> 

BioSum.Cells(1, 1).Activate 
BioSum.Protect "letmein" 

瞬間取消保護板,過濾單元,並重新保護之後。

-1

在Excel 2007中,解鎖要將數據輸入到的單元格。去查看

> Protect Sheet 
> Select Locked Cells (already selected) 
> Select unlocked Cells (already selected) 
> (and either) select Sort (or) Auto Filter 

沒有VB需要

+1

問題是如何使用VBA執行該操作。你的回答是錯誤的 – Dragos 2016-12-02 13:16:55

0

我知道這是超級老了,但來了,每當我谷歌這個問題。您可以取消上述單元格中給出的範圍的保護,然後將數據驗證添加到未受保護的單元格中,以引用諸如「423fdgfdsg3254fer」之類的出類拔萃的內容,然後如果用戶嘗試編輯任何這些單元格,它們將無法執行,但是您正在排序現在過濾將起作用。