Vba 强制用户仅选择一个特定单元格

Vba 强制用户仅选择一个特定单元格,vba,excel,Vba,Excel,我无法锁定工作表,因为我需要访问一些单元格才能运行宏 我需要一个宏,每当用户尝试选择任何其他单元格时,该宏都会选择单元格(F1) 我需要这样一个宏,我想: Private Sub Worksheet_Change(ByVal Target As Range) End Sub 将此代码放入工作表模块: Private Sub Worksheet_SelectionChange(ByVal Target As Range) Call Cells(1, 6).Select

我无法锁定工作表,因为我需要访问一些单元格才能运行宏

我需要一个宏,每当用户尝试选择任何其他单元格时,该宏都会选择单元格(F1)

我需要这样一个宏,我想:

    Private Sub Worksheet_Change(ByVal Target As Range)


    End Sub

将此代码放入工作表模块:

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

正如其他人所写,最好是取消对工作表的保护,播放宏并保护工作表,但是,如果您认为禁用所有单元格(减去您标识的单元格)是最好的方法,您可以使用以下代码:

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
这里有两个选项:

1。不保护工作表-在每个工作表模块中自定义“解锁”单元格(例如“C3”)



  • 选项1强制用户选择单元格C3

    • 可以使用行和列的参数移动到此工作簿模块
  • 选项2使用空密码,并允许VBA执行(
    UserInterfaceOnly


您知道可以在VBA中取消保护和保护图纸吗?在执行宏时锁定工作表和解锁工作表可能会更容易!;)好吧,我知道,但是在我的代码中有很多次我访问这张表,我必须多次锁定和解锁它。你可以保护范围,只打开你需要的范围。听起来您正处于一个可能需要开始研究使用表单的阶段。如何锁定所有内容,除了单个单元格和apply
UserInterFaceOnly:=True
。您需要向工作簿打开事件中添加代码以每次重置它,但这意味着只有您的代码可以更改单元格。他想要“一个宏,每当用户试图选择任何其他单元格时,该宏都会选择此单元格(F1)”。无论如何,我认为不选择任何单元格是不可能改变的(除非你使用VBA,但我想用户不会使用VBA)。这应该可以+1,但用户可以粘贴100个值(到处都是)。你们中有人可以看看我发现的这个bug()吗?谢谢。你们谁能看看我发现的这个bug()吗?谢谢
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
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