【发布时间】:2019-03-07 20:00:04
【问题描述】:
我想禁用复制/粘贴功能,这样人们就无法在我创建的工作簿上粘贴任何内容。
使用下面的代码,我成功地阻止了人们从另一个工作簿复制到这个工作簿,反之亦然。
但是,他们仍然可以从其他非 Excel 来源(例如 Outlook 或 Internet 浏览器)复制。如果它不是来自 excel,则可以将其粘贴到此工作簿中。如何防止这种情况发生,以便在工作簿中不会发生任何粘贴?
模块中的代码:
Sub ToggleCutCopyAndPaste(Allow As Boolean)
'Activate/deactivate cut, copy, paste and pastespecial menu items
Call EnableMenuItem(21, Allow) ' cut
Call EnableMenuItem(19, Allow) ' copy
Call EnableMenuItem(22, Allow) ' paste
Call EnableMenuItem(755, Allow) ' pastespecial
'Activate/deactivate drag and drop ability
Application.CellDragAndDrop = Allow
'Activate/deactivate cut, copy, paste and pastespecial shortcut keys
With Application
Select Case Allow
Case Is = False
.OnKey "^c", ""
.OnKey "^v", ""
.OnKey "^x", ""
.OnKey "^{DEL}", ""
.OnKey "^{INSERT}", ""
Case Is = True
.OnKey "^c"
.OnKey "^v"
.OnKey "^x"
.OnKey "^{DEL}"
.OnKey "^{INSERT}"
End Select
End With
End Sub
Sub EnableMenuItem(ctlId As Integer, Enabled As Boolean)
'Activate/Deactivate specific menu item
Dim cBar As CommandBar
Dim cBarCtrl As CommandBarControl
For Each cBar In Application.CommandBars
If cBar.Name <> "Clipboard" Then
Set cBarCtrl = cBar.FindControl(ID:=ctlId, recursive:=True)
If Not cBarCtrl Is Nothing Then cBarCtrl.Enabled = Enabled
End If
Next
End Sub
ThisWorkbook 中的代码:
Private Sub Workbook_Open()
Call ToggleCutCopyAndPaste(False)
End Sub
Private Sub Workbook_Activate()
Call ToggleCutCopyAndPaste(False)
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call ToggleCutCopyAndPaste(True)
End Sub
Private Sub Workbook_Deactivate()
Call ToggleCutCopyAndPaste(True)
End Sub
【问题讨论】:
-
也许每次选择一个单元格时都清空缓冲区 - 或者一个 Window 被激活?这应该涵盖大多数可能性。
-
阻塞细胞怎么样?您已经设法防止人们从另一个工作簿复制到这个工作簿,反之亦然。现在尝试阻止单元格,这样任何人都无法更改该工作簿中的任何值。
-
保护工作表,但允许数据验证,以便他们可以输入范围内的数字或从选项中进行选择。
-
我在代码中添加了以下内容: Private Sub Workbook_WindowActivate() Call ToggleCutCopyAndPaste(False) End Sub 但是,问题尚未解决。工作表受到保护。除了我希望用户能够添加数据的未锁定单元格之外,不能更改任何单元格。当一位用户加入时,将所有内容从他们的电子邮件或在线复制到工作簿时,就会出现这个特定问题。然后我了解到工作簿并非不透水。当用户这样做时,格式会发生变化,字段会被移动,未锁定的单元格会被锁定。我无法解释为什么会发生后者。
标签: excel vba copy-paste