Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 锁定下拉选择_Excel_Vba_Excel Formula - Fatal编程技术网

Excel 锁定下拉选择

Excel 锁定下拉选择,excel,vba,excel-formula,Excel,Vba,Excel Formula,我正在做一个测验 一张工作表上的问题和另一张工作表上的答案 当一个问题被回答时,另一个字段使用此公式 =IF(C5="","",IF(C5=Answers!A5,"Correct","Incorrect")) 告诉此人答案是否正确 我使用下拉列表进行数据验证,因此他们只能选择真/假(a、b、c、d)等 是否有办法锁定选定的答案,直到按下主重置按钮 比如说, 问题在A1中 可能的答案是B1中的下拉菜单形式 有时答案

我正在做一个测验

一张工作表上的问题和另一张工作表上的答案

当一个问题被回答时,另一个字段使用此公式

=IF(C5="","",IF(C5=Answers!A5,"Correct","Incorrect"))
告诉此人答案是否正确

我使用下拉列表进行数据验证,因此他们只能选择真/假(a、b、c、d)等

是否有办法锁定选定的答案,直到按下主重置按钮

比如说,

  • 问题在A1中
  • 可能的答案是B1中的下拉菜单形式
  • 有时答案是真假,有时是多选。在true-false的例子中,如果一个人输入true,c3会说correct,如果输入false,则表示correct
  • 现在,这个人可以随心所欲地来回切换

我希望这样,一旦选择了答案,他们就无法更改它。

您可以使用纸张保护,并结合范围锁定和更改事件

将此代码放入相关的
工作表
模块中。调整
Private
常量以满足您的需要

Option Explicit

' Reference the cells that your users may enter data into
Private Const DataCells As String = "J1,J3,J5"
Private Const PW As String = "password"

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim cl As Range
    Dim DataRange As Range

    Set DataRange = Me.Range(DataCells)
    'Loop thru changed cells
    For Each cl In Target.Cells
        'If changed cell is in the DataCells range and is not blank, lock it
        If Not Application.Intersect(cl, DataRange) Is Nothing Then
            If Not IsEmpty(cl) Then
                Me.Unprotect PW
                Target.Locked = True
                Me.Protect PW
            End If
        End If
    Next
End Sub

'Re-enable data entry to all DataCells
Sub MasterReset()
    'Unlock the sheet, prompt for password
    Me.Unprotect
    'Unlock the cells
    Me.Range(DataCells).Locked = False
    'Optional, clear DataCells
    Me.Range(DataCells).ClearContents
    'Lock the sheet again
    Me.Protect PW
End Sub

您可以结合范围锁定和更改事件使用板材保护

将此代码放入相关的
工作表
模块中。调整
Private
常量以满足您的需要

Option Explicit

' Reference the cells that your users may enter data into
Private Const DataCells As String = "J1,J3,J5"
Private Const PW As String = "password"

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim cl As Range
    Dim DataRange As Range

    Set DataRange = Me.Range(DataCells)
    'Loop thru changed cells
    For Each cl In Target.Cells
        'If changed cell is in the DataCells range and is not blank, lock it
        If Not Application.Intersect(cl, DataRange) Is Nothing Then
            If Not IsEmpty(cl) Then
                Me.Unprotect PW
                Target.Locked = True
                Me.Protect PW
            End If
        End If
    Next
End Sub

'Re-enable data entry to all DataCells
Sub MasterReset()
    'Unlock the sheet, prompt for password
    Me.Unprotect
    'Unlock the cells
    Me.Range(DataCells).Locked = False
    'Optional, clear DataCells
    Me.Range(DataCells).ClearContents
    'Lock the sheet again
    Me.Protect PW
End Sub

这很有效:

在“此工作簿”模块中,插入代码:

Private Sub Workbook_Open()

    Sheet1.Protect userinterfaceonly:=True 'allows macros to run
    Sheet1.Range("A1:A20").Locked = False 'replace this range with the range the user deals with.

End Sub
在用户将与之交互的图纸模块中,添加以下代码:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Locked = True Then Exit Sub

    If Target.Locked = False Then
        If Target.Value = "" Then Exit Sub
        If Target.Value <> "" Then Target.Locked = True
    End If

End Sub
Private子工作表\u selection更改(ByVal目标作为范围)
如果Target.Locked=True,则退出Sub
如果Target.Locked=False,则
如果Target.Value=”“,则退出Sub
如果Target.Value为“”,则Target.Locked=True
如果结束
端接头

那会帮你处理好事情的

这很有效:

在“此工作簿”模块中,插入代码:

Private Sub Workbook_Open()

    Sheet1.Protect userinterfaceonly:=True 'allows macros to run
    Sheet1.Range("A1:A20").Locked = False 'replace this range with the range the user deals with.

End Sub
在用户将与之交互的图纸模块中,添加以下代码:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Locked = True Then Exit Sub

    If Target.Locked = False Then
        If Target.Value = "" Then Exit Sub
        If Target.Value <> "" Then Target.Locked = True
    End If

End Sub
Private子工作表\u selection更改(ByVal目标作为范围)
如果Target.Locked=True,则退出Sub
如果Target.Locked=False,则
如果Target.Value=”“,则退出Sub
如果Target.Value为“”,则Target.Locked=True
如果结束
端接头


那会帮你处理好事情的

是,在工作表更改事件中使用vba取消工作表保护,锁定目标单元格,然后重新保护工作表,确保他们无法选择受保护的单元格。抱歉,我认为我没有明确说明我的请求。我不是在问如何保护细胞不受改变配方的影响。我在问是否有下拉菜单的单元格,如何锁定答案,例如,如果他们选择true,他们以后就不能将其更改为false。不幸的是,单凭数据验证无法做到这一点。@ScottCraner推荐的是您需要使用的,如果您需要的话。旁注:如果您有Office 365,您是否签出了Microsoft表单?这对您和您的用户来说可能更容易,并且应该满足您的需要。是的,在工作表更改事件中使用vba取消工作表保护,锁定目标单元格,然后重新保护工作表,确保他们无法选择受保护的单元格。抱歉,我认为我没有明确说明我的请求。我不是在问如何保护细胞不受改变配方的影响。我在问是否有下拉菜单的单元格,如何锁定答案,例如,如果他们选择true,他们以后就不能将其更改为false。不幸的是,单凭数据验证无法做到这一点。@ScottCraner推荐的是您需要使用的,如果您需要的话。旁注:如果您有Office 365,您是否签出了Microsoft表单?这对您和您的用户来说可能更容易,并且应该满足您的需要。非常感谢,我明天会尝试一下。@Gehn47关于为什么这不能解决您的问题的任何反馈?因此,我找到了一篇很好的文章,对我有帮助,也有一些解释。这是文章。我现在遇到的问题是,当用户输入时,它会锁定所有单元格,而不仅仅是他们输入数据的单元格。很抱歉,大约一年前我才开始学习VBA,所以我还是比较新的。很抱歉,我还没有机会完全实现您的代码部分。很抱歉,这是我正常工作之外的一个辅助项目,所以我没有时间来做。非常感谢,我明天会尝试一下。@Gehn47关于为什么这不能解决你的问题的任何反馈?所以我找到了一篇很好的文章,对我有帮助,也有一些解释。这是文章。我现在遇到的问题是,当用户输入时,它会锁定所有单元格,而不仅仅是他们输入数据的单元格。很抱歉,大约一年前我才开始学习VBA,所以我还是比较新的。很抱歉,我还没有机会完全实现您的代码部分。很抱歉,这是我正常工作之外的一个兼职项目,所以我没有全职工作。为什么
SelectionChange
?而不是实际的价值变化?当用户在工作表中移动时,会运行很多代码,但没有效果。我在测试时遇到了一个错误,但回过头来看,这完全是无关的,谢谢你的评论!我改变了答案以反映这一点!为什么选择更改
?而不是实际的价值变化?当用户在工作表中移动时,会运行很多代码,但没有效果。我在测试时遇到了一个错误,但回过头来看,这完全是无关的,谢谢你的评论!我改变了答案以反映这一点!