2015-10-01 37 views
3

我無法鎖定我的工作表,因爲我需要訪問某些單元來運行宏。強制用戶只選擇一個特定單元

我想要一個當用戶試圖選擇任何其他單元格時選擇單元格(F1)的宏。

我需要這樣一個宏,我想:

Private Sub Worksheet_Change(ByVal Target As Range) 


    End Sub 
+0

你知道你可以取消保護,保護內VBA材料了嗎?鎖定你的工作表可能更容易,並在執行宏時解鎖! ;) – R3uK

+0

好吧,我知道,但是在我訪問這張表的代碼中有很多次,我不得不多次鎖定和解鎖它。 –

+1

你可以保護範圍,只需要打開你需要的範圍。 http://stackoverflow.com/questions/7763205/lock-certain-cells-in-a-range – MatthewD

回答

2

把工作表模塊中的代碼:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    Call Cells(1, 6).Select 
End Sub 
+0

他希望「每當用戶嘗試選擇任何其他單元格時,選擇該單元格的宏(F1)」。無論如何,我認爲不改變任何單元格是不可能的(除非你使用VBA,但我想用戶不會使用VBA)。 – mielk

+0

這應該這樣做+1,但用戶將能夠粘貼100個值(遍佈整個地方) –

+0

你們有沒有看看我發現的這個bug(http://bit.ly/1KXjeuf)?謝謝。 –

1

像其他人寫的,是更好地取消保護片,播放您的宏和保護工作表,但如果您認爲禁用所有單元格,減去您識別的單元格是最好的方法,則可以使用此代碼:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Application.EnableEvents = False 
    If Not Intersect(Target, Range("F10")) Is Nothing Then 'use your free cell 
     do 
    Else 
     Application.Undo 
     MsgBox "you can modify only the cell(F10)" 'Just to inform what is the cell editable 
     Range("F10").Select 
    End If 
    Application.EnableEvents = True 
End Sub 
+0

你們有沒有看看我發現的這個bug(http://bit.ly/1KXjeuf)?謝謝。 –

0

以下是2種選擇:

1.在不保護片 - 每片模塊中的自定義 「解鎖」 細胞(實施例 「C3」)


Private Sub Worksheet_Change(ByVal Target As Range) 
    Application.EnableEvents = False 
    With Target 
     If .Column <> 3 Or .Row <> 3 Or .CountLarge > 1 Then Application.Undo 
    End With 
    Application.EnableEvents = True 
End Sub 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    Application.EnableEvents = False 
    With Target 
     If .Column <> 3 Or .Row <> 3 Or .CountLarge > 1 Then Cells(3, 3).Select 
    End With 
    Application.EnableEvents = True 
End Sub 

2.保護片 - 的ThisWorkbook模塊中


Private Sub Workbook_Open() 
    Dim ws As Worksheet 
    For Each ws In ThisWorkbook.Worksheets 
     protectWS ws 
    Next 
End Sub 
Private Sub Workbook_SheetActivate(ByVal Sh As Object) 
    protectWS Sh 
End Sub 

Public Function protectWS(Optional ByRef ws As Worksheet = Nothing) As Boolean 
    If ws Is Nothing Then Set ws = Application.ActiveSheet 
    If Not isWSProtected(ws) Then 
     ws.Protect Password:=vbNullString, _ 
        DrawingObjects:=True, _ 
        Contents:=True, _ 
        Scenarios:=True, _ 
        UserInterfaceOnly:=True, _ 
        AllowFormattingCells:=False, _ 
        AllowFormattingColumns:=False, _ 
        AllowFormattingRows:=False, _ 
        AllowInsertingColumns:=False, _ 
        AllowInsertingRows:=False, _ 
        AllowInsertingHyperlinks:=False, _ 
        AllowDeletingColumns:=False, _ 
        AllowDeletingRows:=False, _ 
        AllowSorting:=False, _ 
        AllowFiltering:=False, _ 
        AllowUsingPivotTables:=False 
    End If 
End Function 

Private Function isWSProtected(Optional ByRef ws As Worksheet = Nothing) As Boolean 
    isWSProtected = ws.ProtectContents Or _ 
        ws.ProtectDrawingObjects Or _ 
        ws.ProtectScenarios 
End Function 

  • 選項1迫使用戶到小區C3

    • 可以移動到的ThisWorkbook模塊,帶有行參數和列
  • 選項2使用空密碼,並允許VBA執行(UserInterfaceOnly

相關問題