防止单元格覆盖在 Excel 中的下拉列上复制/粘贴

防止单元格覆盖在 Excel 中的下拉列上复制/粘贴

我有一张包含多个不连续下拉列的 Excel 工作表。我可以通过单元格验证保护这些下拉列不输入任何未列出的条目。但我无法保护它们不被单元格覆盖复制/粘贴。我使用了此网站另一篇文章中的宏,但它只适用于 NamedRange 中的一列。(限制粘贴到 Excel 中的下拉单元格

我尝试将 NamedRanges 与 Union 和 CombinedRange 语法结合起来并运行宏。但它不适用于多个下拉列。

有人可以帮我吗?

答案1

我拿了答案链接问题“限制粘贴到 Excel 中的下拉单元格” 并针对多个范围进行了调整,还做了一些外观上的更改。我还添加了一个安全网来捕获递归。您可以删除粗体/斜体行:

Dim WSC_Recursive 作为布尔值
 
Private Sub Worksheet_Change(ByVal 目标作为范围)
    '验证范围还有验证吗?
    如果 WSC_Recursive 那么
        退出子程序
    万一
    如果 HasValidation(Range("DataValidationRange1")) 并且 _
       HasValidation(Range("DataValidationRange2")) 和 _
       HasValidation(Range("DataValidationRange3")) 和 _
       HasValidation(Range("DataValidationRange4")) 然后
          退出子程序
    万一
    WSC_Recursive = True
    应用程序.撤消
    WSC_Recursive = False
    MsgBox “错误:您无法将数据粘贴到这些单元格中。”& vbCrLf & _
          “请使用下拉菜单输入数据。”,vbCritical
子目录结束
 
私有函数 HasValidation(r) 作为布尔值
    '如果 Range r 中的每个单元格都使用数据验证,则返回 True
    出错时继续下一步
    x = r.验证.类型
    如果 Err.Number = 0 则 HasValidation = True 否则 HasValidation = False
结束函数

注意:每个 NamedRanges 都必须应用验证 — 事实上,必须对范围内的每个单元格应用相同的验证。例如,G17:H42 如果 范围G17:G42具有一种验证类型和H17:H42另一种验证类型 — 或者即使它们具有相同的类型(例如下拉列表)但参数不同(例如不同的有效值列表)。

如果您已完成设置并正常运行,并且想要添加范围,则您应该:

  1. 无论按什么顺序,

    • 定义命名范围并
    • 将验证应用于单元格

    只有那时

  2. 将新范围添加到Worksheet_Change例程中。

在更一般的情况下,当您更改验证规则时,您可能需要遵循以下步骤:

  1. 将例程重命名Worksheet_Change为其他名称(例如 Worksheet_ChangeX)。
  2. 无论按什么顺序,
    • 对工作表进行更改,然后
    • (如有必要)更改代码,例如更改
      HasValidation(Range("DataValidationRange2")) And _
      
      HasValidation(Range("DataValidationRange2a")) And _
      HasValidation(Range("DataValidationRange2b")) And _
      
    进而
  3. 将例程重命名回Worksheet_Change

就我个人而言,我相信这段代码可以设计得更好,但如果它能起作用,那它就起作用了。

相关内容