正在忽略数据验证列表



我有以下情况:在一个单元格上,我有一个数据验证列表,它应该限制用户只能从该列表中选择项目。在同一个单元格上,我在VBA中有更改触发器,所以当单元格值更改时,它也会将更改记录到更改日志表中(它使用undo来获取以前的值,再次undo来将更改重做为新值(

现在的问题是,数据验证列表被完全忽略了,所以用户可以把他们想要的东西放在特定的单元格中,即使我选中了"显示错误"。

有没有办法强制执行列表验证,这样用户只能从列表中选择项目,而不能输入他们想要的任何内容?或者在验证后触发单元格上的更改事件?

也许有人可以澄清这些事情发生的顺序。

我最近在靶场工作。Validation.type=xlValidateList,希望防止粘贴和剪切,并禁止在包含下拉列表的单元格中键入错误的字符(并允许键入与列表中的条目匹配的字符并显示该条目(。

在处理最后一件不好的事情时(剪切下拉列表并将其粘贴到已经包含下拉列表的另一个单元格中(,我发现了一种简单的方法,可以禁止粘贴和剪切数据验证列表,它确实允许根据输入的内容进一步处理,

以下代码必须在工作表模块中。它防止用户破坏单元格上的数据验证,并因此使用应用程序。撤消以恢复到不再需要粘贴或剪切之前的状态。

我不知道这是否有什么不同,但我保护了床单,并解锁了用户可能更改的单元格。

Private Function HasValidation(ByVal rng As Range) As Boolean
' See:       https://superuser.com/questions/870926/restrict-paste-into-dropdown-cells-in-excel
' Returns True if every cell in Range r uses Data Validation
On Error Resume Next
Dim rngType: rngType = rng.Validation.Type
HasValidation = (Err.number = 0)
End Function
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' Switch DragAndDrop on/off on a range containing DataValidation
Dim modeCutCopy: modeCutCopy = Application.CutCopyMode
Dim usesValidation: usesValidation = HasValidation(Target)
If ((usesValidation = True) And (modeCutCopy <> 0)) Then Application.CutCopyMode = False     ' MUST reset to avoid copying / cutting xlValidateList into another xlValidateList
' Turn DragAnddDrop on/off depending on if a cell uses Validation or not
If (usesValidation = Application.CellDragAndDrop) Then Application.CellDragAndDrop = (Not usesValidation)
GoTo SKIP
' Don't allow DragAndDrop if Target intersects with specified ranges
Dim myRange As Range
Set myRange = Worksheets("Evenementen").Range("Oordeel", "Waardering")
Dim rngIntersect As Range
Set rngIntersect = Application.Intersect(Target, myRange)
Application.CellDragAndDrop = (rngIntersect Is Nothing)
''    CheckInputValidationList(Target)          ' Sophisticated testing and actions depending on the selection made
''    CheckInputValidationList(Target, myRange) ' Sophisticated testing and actions depending on the selection made for specific ranges
SKIP:
Debug.Print "SelectionChange  " & Target.Address & "    usesValidation=" & usesValidation & "   cellDragAndDrop=" & Application.CellDragAndDrop
End Sub

在这种情况下,有两个命名范围包含(不同的(数据验证列表。用户单击单元格后,将立即检查该单元格是否使用数据验证。如果是这样,剪切和粘贴将被关闭,并且CutCopyMode将被清除,直到用户选择另一个单元格。

重要的是在执行任何更改某些内容的VBA代码之前检索当前CutCopyMode,因为当某些内容更改时,VBA将自动将CutCopyMode从xlCut或xlCopy更改为0。该初始状态是为了避免将一个下拉列表粘贴到另一个上所必需的。

Worksheet_SelectionChange子例程包含跳过的代码,如果用户访问两个范围之一的单元格,该代码会执行类似的操作。它还包含(转换为注释(代码,用于在用户选择单元格时执行其他操作。该代码也可能放在工作表_Change 中

相关内容

  • 没有找到相关文章

最新更新