我正在尝试向工作表添加数据验证,但是当我粘贴值时,数据验证和条件格式都会被删除。
我尝试过“保护工作簿”,但找不到任何允许编辑锁定单元格中的值同时保留其他所有内容的选项。
我也尝试了大约五种不同的方法来编写一些 VBA 来执行此操作,但到目前为止,它们都没有起作用,主要是因为在应用新值之前无法保存旧属性。
我如何锁定工作表或编写一些 VBA 来锁定单元格的所有内容(除了其值)?我使用的是 Excel 2016,但我的用户可能不是。我需要一个可以在尽可能多的旧版本中运行的解决方案。
我知道“选择性粘贴”只会粘贴值,但我将此电子表格提供给用户填写并返回,并且我不确定他们是否会理解或记住每次“选择性粘贴”,导致我们尝试使用无效数据。
答案1
这个问题没有简单的答案。您已经探索了使用 VBA 的选项,但您可能发现有太多方法可以将某些内容粘贴到单元格中,而无法使用 VBA 拦截它们。
网上有很多关于如何处理这种情况的讨论,但到目前为止,还没有一个能真正解决问题。如果单元格不受保护,那么任何东西都可以粘贴到其中。
唯一有效的方法就是教育你的用户。
答案2
VBA 确实是可行的方法。
您要做的就是录制一个宏。宏录制激活后,设置一个单元格的数据保护,然后停止录制。
这将为您提供根据您的单元需要的方式设置数据保护的 VBA 代码。
现在,创建一个在单元格更改时运行的宏。您可以使用 activecell 获取用户已粘贴到哪个单元格,并在该单元格上执行数据保护设置例程以再次修复它。
接下来,您需要评估用户粘贴到单元格中的内容是否正确,如果不正确,请在宏中修复它,或者直接清除它。可以使用消息框通知用户他们做错了什么。
当然,如果您指导用户允许做什么,发生错误的可能性就会减少,但我曾在大型办公环境中工作过,我知道一个好的宏对于防止愚蠢的错误有多么强大。
答案3
另一种方法是这样的。
您仍然需要 VBA,但基本上可以查明用户是否粘贴了。如果是,则撤消粘贴,然后改为选择性粘贴。
您必须记录宏以进行选择性粘贴才能查看 Excel 代码。
你的代码看起来应该是这样的:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim lastAction As String
' Get the last action performed by user
lastAction = Application.CommandBars("Standard").Controls("&Undo").List(1)
' Check if the last action was a paste
If Left(lastAction, 5) = "Paste" Then
' Perform an undo here
' Do a Paste special here
End If
End Sub
也可以看看https://stackoverflow.com/questions/12525942/how-to-detect-paste-event-in-excel