2015-10-01 36 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

相关问题