我有一张包含多个不连续下拉列的 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
另一种验证类型 — 或者即使它们具有相同的类型(例如下拉列表)但参数不同(例如不同的有效值列表)。
如果您已完成设置并正常运行,并且想要添加范围,则您应该:
无论按什么顺序,
- 定义命名范围并
- 将验证应用于单元格
只有那时
将新范围添加到
Worksheet_Change
例程中。
在更一般的情况下,当您更改验证规则时,您可能需要遵循以下步骤:
- 将例程重命名
Worksheet_Change
为其他名称(例如Worksheet_ChangeX
)。 - 无论按什么顺序,
- 对工作表进行更改,然后
- (如有必要)更改代码,例如更改
到HasValidation(Range("DataValidationRange2")) And _
HasValidation(Range("DataValidationRange2a")) And _ HasValidation(Range("DataValidationRange2b")) And _
- 将例程重命名回
Worksheet_Change
。
就我个人而言,我相信这段代码可以设计得更好,但如果它能起作用,那它就起作用了。