【问题标题】:Disable Copy/Paste to Excel from other sources禁用从其他来源复制/粘贴到 Excel
【发布时间】: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


【解决方案1】:

我发现了另一种方法,它禁止人们从 Outlook、Internet 浏览器等粘贴到工作簿中。不需要模块。只需将以下代码放入 ThisWorkbook:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.CutCopyMode = True
Application.OnKey "^c"
Application.OnKey "^v"
Application.OnKey "^{INSERT}",
Application.OnKey "^{DELETE}",
Application.CommandBars("Cell").Enabled = True
Application.CellDragAndDrop = True
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",True)"
End Sub

Private Sub Workbook_Open()
Application.CutCopyMode = False
Application.OnKey "^c", ""
Application.OnKey "^v", ""
Application.OnKey "^{INSERT}", ""
Application.OnKey "^{DELETE}", ""
Application.CommandBars("Cell").Enabled = False
Application.CellDragAndDrop = False
'use if statement here if you want to situationally keep ribbon
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",False)"
'Else
'Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",True)"
'End If
End Sub

Private Sub Workbook_Activate()
Application.CutCopyMode = False
Application.OnKey "^c", ""
Application.OnKey "^v", ""
Application.OnKey "^{INSERT}", ""
Application.OnKey "^{DELETE}", ""
Application.CommandBars("Cell").Enabled = False
Application.CellDragAndDrop = False
'use if statement here if you want to situationally keep ribbon
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",False)"
'Else
'Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",True)"
'End If
End Sub

Private Sub Workbook_Deactivate()
Application.CellDragAndDrop = True
Application.OnKey "^c"
Application.OnKey "^v"
Application.OnKey "^{INSERT}"
Application.OnKey "^{DELETE}"
Application.CommandBars("Cell").Enabled = True
Application.CutCopyMode = True
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",True)"
End Sub

Private Sub Workbook_WindowActivate(ByVal Wn As Window)
Application.CutCopyMode = False
Application.OnKey "^c", ""
Application.OnKey "^v", ""
Application.OnKey "^{INSERT}", ""
Application.OnKey "^{DELETE}", ""
Application.CommandBars("Cell").Enabled = False
Application.CellDragAndDrop = False
End Sub

Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
Application.CellDragAndDrop = True
Application.OnKey "^c"
Application.OnKey "^v"
Application.OnKey "^{INSERT}"
Application.OnKey "^{DELETE}"
Application.CommandBars("Cell").Enabled = True
Application.CutCopyMode = True
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Application.OnKey "^c", ""
Application.OnKey "^v", ""
Application.OnKey "^{INSERT}", ""
Application.OnKey "^{DELETE}", ""
Application.CommandBars("Cell").Enabled = False
Application.CellDragAndDrop = False
Application.CutCopyMode = False
End Sub

请注意,我也禁用了功能区,因为仍然可以使用“主页”选项卡进行粘贴。令人沮丧的是,似乎没有办法完全禁用复制/粘贴,而不仅仅是从 Excel 到 Excel。

如果需要,您可以将此代码放入模块中,并在需要访问复制/粘贴工具时手动运行:

Sub Enable_CopyPaste()

'Run this sub when you need to access copy/paste tools

Application.CutCopyMode = True
Application.OnKey "^c"
Application.OnKey "^v"
Application.OnKey "^{INSERT}"
Application.OnKey "^{DELETE}"
Application.CommandBars("Cell").Enabled = True
Application.CellDragAndDrop = True
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",True)"

End Sub

【讨论】:

    【解决方案2】:

    感谢 CLR 指出窗口激活。我将此添加到 ThisWorkbook:

    Private Sub Workbook_Deactivate()
        Call ToggleCutCopyAndPaste(True)
    End Sub
    
    Private Sub Workbook_WindowActivate(ByVal Wn As Window)
        Call ToggleCutCopyAndPaste(False)
    End Sub
    

    虽然它最初并没有解决问题,但它与添加到模块中的这段代码一起解决了:

    Dim oData   As New DataObject 'object to use the clipboard
    
        oData.SetText Text:=Empty 'Clear
        oData.PutInClipboard 'take in the clipboard to empty it
    

    现在用户无法通过从 Outlook、Internet 浏览器等复制/粘贴来替换和重新格式化工作簿的内容。

    【讨论】:

    • 我正在重新审视这一点,因为仍有一些方法可以绕过禁用的复制/粘贴,这是一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 2011-09-10
    相关资源
    最近更新 更多