有没有办法使用 sheet 保护来允许用户输入值但保护格式?
Is there a way using sheet protection to allow a user to enter values but protect formats?
我有一个作品sheet 包含一列数字。该列的格式为背景颜色、数字格式等。该列已解锁。我通过右键单击选项卡并选择保护来手动保护 sheet。在“保护 Sheet”对话框中,'format cells' 未选中。我解释为用户不应该能够格式化单元格。然而,当用户粘贴到列中时,格式会与值一起粘贴。
如果我保护 VBA 中的 sheet 使用
sh.Protect UserInterfaceOnly:=True
我得到相同的结果:格式被粘贴。我没有指定 AllowFormattingCells:=False,因为默认值为 False。
我看到帖子建议可以通过从阴影区域复制和粘贴来恢复格式。在我开始保护工作 sheet 之前,我已经使用过这个解决方案,但发现它过于复杂。我曾希望这是保护会处理的事情。如果有办法处理,我想在VBA.
没有可用于实现所需结果的内置保护选项。
在这种情况下唯一可行的是您提到的笨拙的解决方法,即使用 Worksheet_Change 事件来确保在修改单元格后格式正确。
由于有许多不同的方式来粘贴内容,即通过各种菜单、功能区命令、键盘快捷键等,任何试图拦截粘贴的 VBA 解决方案都会变得非常复杂,比将格式恢复到其原始状态的更改事件。
另一个选择可能是用户教育和培训(因此他们知道只粘贴值),尽管用户行为可能是整个场景中最难改变的因素。
这个问题有点老了,但是我有同样的问题,过去很多人也有同样的问题。通过一些浏览,我想出了一个看起来很干净并且似乎有效的解决方案。我错过了什么吗?
Private Sub Worksheet_Change(ByVal rngTarget As Range)
Dim vPaste As Variant
With Application.CommandBars("Standard").Controls("&Undo")
If Not .Enabled Then Exit Sub
If .ListCount < 1 Then Exit Sub
If .List(1) <> "Paste" Then Exit Sub
End With
vPaste = rngTarget.Value2
On Error Resume Next
Application.EnableEvents = False
Application.Undo
rngTarget.Value2 = vPaste
Application.EnableEvents = True
On Error GoTo 0
End Sub
这可以放在 Workbook_SheetChange
中,但如果您已经在 Worksheet_Change
中有代码则不能,因为工作表事件处理程序在工作簿事件处理程序之前被调用。但是这段代码可以放在一个模块中以保持整洁。
我有一个作品sheet 包含一列数字。该列的格式为背景颜色、数字格式等。该列已解锁。我通过右键单击选项卡并选择保护来手动保护 sheet。在“保护 Sheet”对话框中,'format cells' 未选中。我解释为用户不应该能够格式化单元格。然而,当用户粘贴到列中时,格式会与值一起粘贴。
如果我保护 VBA 中的 sheet 使用
sh.Protect UserInterfaceOnly:=True
我得到相同的结果:格式被粘贴。我没有指定 AllowFormattingCells:=False,因为默认值为 False。
我看到帖子建议可以通过从阴影区域复制和粘贴来恢复格式。在我开始保护工作 sheet 之前,我已经使用过这个解决方案,但发现它过于复杂。我曾希望这是保护会处理的事情。如果有办法处理,我想在VBA.
没有可用于实现所需结果的内置保护选项。
在这种情况下唯一可行的是您提到的笨拙的解决方法,即使用 Worksheet_Change 事件来确保在修改单元格后格式正确。
由于有许多不同的方式来粘贴内容,即通过各种菜单、功能区命令、键盘快捷键等,任何试图拦截粘贴的 VBA 解决方案都会变得非常复杂,比将格式恢复到其原始状态的更改事件。
另一个选择可能是用户教育和培训(因此他们知道只粘贴值),尽管用户行为可能是整个场景中最难改变的因素。
这个问题有点老了,但是我有同样的问题,过去很多人也有同样的问题。通过一些浏览,我想出了一个看起来很干净并且似乎有效的解决方案。我错过了什么吗?
Private Sub Worksheet_Change(ByVal rngTarget As Range)
Dim vPaste As Variant
With Application.CommandBars("Standard").Controls("&Undo")
If Not .Enabled Then Exit Sub
If .ListCount < 1 Then Exit Sub
If .List(1) <> "Paste" Then Exit Sub
End With
vPaste = rngTarget.Value2
On Error Resume Next
Application.EnableEvents = False
Application.Undo
rngTarget.Value2 = vPaste
Application.EnableEvents = True
On Error GoTo 0
End Sub
这可以放在 Workbook_SheetChange
中,但如果您已经在 Worksheet_Change
中有代码则不能,因为工作表事件处理程序在工作簿事件处理程序之前被调用。但是这段代码可以放在一个模块中以保持整洁。