【Excel VBA编程】为工作簿加上“防盗锁:禁用复制功能
- 2026-11-14 04:11:06
总是听到或看到有人问,编程好学吗?如何入门?多久能学会?它能做些什么?怎么写代码呀?执行过程中出问题了谁能帮帮我...如果你也有类似的问题那就赶快关注我的公众号,一起学起来吧!
现今,数据安全越来越受到重视,在Excel中,使用VBA编码禁用复制功能是一种有效的数据保护手段,可以防止重要数据被意外复制、剪切、粘贴
1 实现原理
通过VBA代码,能够禁用鼠标拖拽操作、拦截复制粘贴的快捷键(如Ctrl+C/Ctrl+V),并屏蔽右键菜单中的相关选项,从而将所有可能的复制粘贴操作入口全部封锁,具体做法:
屏蔽键盘快捷键:让快捷键“失灵”。使用 Application.OnKey 方法将Ctrl+C(复制)、Ctrl+X(剪切)、Ctrl+V(粘贴)等快捷键设置“空指令”。当我们再按Ctrl+C时,Excel接收到的命令是“什么都不做”,复制功能就被禁用了
清除剪贴板状态:剪贴板就像是一个“临时中转站”。通过“Ctrl+C”复制数据时,数据就暂存在这里等待后续粘贴。而Application.CutCopyMode = False 的作用就是一键清空这个中转站。当中转站空了,粘贴命令自然就失效了
禁用拖放操作:除了复制粘贴,用鼠标直接拖拽单元格边框也能移动或复制数据,设置 Application.CellDragAndDrop = False 即可冻结这个拖拽功能
禁用菜单和右键命令:通过控制 CommandBars 集合,禁用工具栏、右键菜单中的“剪切”、“复制”、“粘贴”命令(.Enabled = False)
另外,对于极其敏感的区域,还可以再叠加“工作表保护”进行彻底锁定
友情提醒:这些方法对于熟悉Excel的高级用户并非绝对安全,但对于防范普通的、无意的数据复制和泄露已经足够有效
2 代码及说明
2.1 操作步骤
打开要禁用复制功能的工作簿,另存为.xlsm
按下 Alt + F11 快捷键,打开VBA编辑器
在VBA编辑器左侧的“工程资源管理器”窗口中,找到并双击目标工作簿下的ThisWorkbook对象,打开代码窗口 
将文中代码复制粘贴到ThisWorkbook对象代码窗口中
2.2 代码实现
代码中使用了以下四个工作簿事件
Workbook_Open
Workbook_Activate
Workbook_Deactivate
Workbook_BeforeClose
以此确保无论我们是通过打开文件、切换窗口还是其他方式操作,禁用功能都能及时生效;在离开该工作簿或关闭时,功能被恢复,不影响我们使用其他Excel文件
参考代码
Option ExplicitPrivate Sub Workbook_Open()' 工作簿打开时,禁用复制相关功能Call DisableCopyPasteEnd SubPrivate Sub Workbook_Activate()' 工作簿被激活时(例如从其他工作簿切换回来),确保功能被禁用Call DisableCopyPasteEnd SubPrivate Sub Workbook_Deactivate()' 工作簿失活时,恢复功能,避免影响其他Excel实例或工作簿的正常使用Call EnableCopyPasteEnd SubPrivate Sub Workbook_BeforeClose(Cancel As Boolean)' 工作簿关闭前,恢复所有功能Call EnableCopyPasteEnd Sub' 禁用复制、剪切、粘贴Sub DisableCopyPaste()With Application' 清除当前剪贴板模式.CutCopyMode = False' 屏蔽键盘快捷键.OnKey "^c", "" ' Ctrl+C.OnKey "^x", "" ' Ctrl+X.OnKey "^v", "" ' Ctrl+V'禁用单元格拖放.CellDragAndDrop = False' 禁用常用工具栏上的命令On Error Resume Next ' 防止在不存在该命令栏的Excel版本中报错.CommandBars("Standard").Controls("剪切(&T)").Enabled = False.CommandBars("Standard").Controls("复制(&C)").Enabled = False.CommandBars("Standard").Controls("粘贴(&P)").Enabled = False' 禁用单元格右键菜单中的命令.CommandBars("Cell").Controls("剪切(&T)").Enabled = False.CommandBars("Cell").Controls("复制(&C)").Enabled = False.CommandBars("Cell").Controls("粘贴(&P)").Enabled = FalseOn Error GoTo 0End With' 为了以防万一,开启保护所有工作表功能(密码:123456),禁止选中单元格(强化禁止复制)Dim ws As WorksheetFor Each ws In ThisWorkbook.Worksheetsws.Protect Password:="123456", AllowFormattingCells:=True, _AllowSorting:=True, AllowFiltering:=True' 取消选中单元格的权限,使复制无法进行ws.EnableSelection = xlNoSelectionNext wsEnd Sub' 启用复制、剪切、粘贴Sub EnableCopyPaste()With Application.CutCopyMode = False' 恢复键盘快捷键.OnKey "^c".OnKey "^x".OnKey "^v"' 启用单元格拖放.CellDragAndDrop = True' 恢复常用工具栏和右键菜单命令On Error Resume Next.CommandBars("Standard").Controls("剪切(&T)").Enabled = True.CommandBars("Standard").Controls("复制(&C)").Enabled = True.CommandBars("Standard").Controls("粘贴(&P)").Enabled = True.CommandBars("Cell").Controls("剪切(&T)").Enabled = True.CommandBars("Cell").Controls("复制(&C)").Enabled = True.CommandBars("Cell").Controls("粘贴(&P)").Enabled = TrueOn Error GoTo 0End With' 解除所有工作表的保护(密码:123456)Dim ws As WorksheetFor Each ws In ThisWorkbook.Worksheetsws.Unprotect Password:="123456"Next wsEnd Sub
备注:解除工作表保护时使用的密码(第80行代码),必须与当初设置保护时使用的密码(第49行代码)一致。如果需要更改密码,请务必同时更新
3 结尾
好了,今天的编程知识到此结束了,咱们下期继续
本公众号一直在不间断地分享免费的编程案例和实用技巧。无论您是用来提升自动化办公效率还是想提升自我,请关注我的公众号,解锁更多的编程知识