如果可以允许用户查看宏代码,但是同时让他们无法更改VBA代码,我找不到任何信息。我需要锁定它才能进行编辑。 我有一个很多用户使用的excel文件。我希望他们能够看到要学习的代码,但同时我希望保护代码免受任何更改。 这可能吗?
答案 0 :(得分:2)
我希望他们看到要学习的代码,但同时我希望保护代码免受任何更改。
这是一个X-Y问题:你需要的不是“锁定模块进行编辑”,你需要的是一种“恢复”未经实验的观众可能无意中完成的任何更改的方法。
唯一能够做你想做的事情的内置,合法和100%安全的方法是打印出代码并分发硬拷贝供学习。
您实际需要的解决方案存在,它被称为源代码控制。
没有源代码控制,“真相”驻留在文档主机内;该文档中存在的任何代码都是单一版本的事实,对其进行的任何更改都成为新的真相。规避这种情况的一种方法是使用文件系统:制作您分发的宏的版本化副本,这样,如果某些用户更改了某些内容并将其分解,您可以随时重新发送您提供的原始版本。
使用源代码管理,“真相”位于存储库中的外部文档主机。源控制系统负责跟踪所有变更,制作时以及由谁制作。 “真相”变为树,您可以创建分支并开始实施新功能,而不会影响“主干”,直到您合并变化。
不幸的是,VBE对源代码控制并不友好:为了使源代码控制能够正常工作,您需要单独跟踪每个源代码文件/模块 - 根据定义,VBA代码是嵌入式在一个宿主文档中,它本身可以包含引用VBA代码的内容(例如 shape /分配给宏的按钮),VBA代码可以引用到主机文档中的东西(例如,引用特定Worksheet
对象的代码),所以虽然有很多或多或少的简单解决方案可以将代码从项目导出到文件系统中,然后将其导回。 ..我不知道任何涵盖每个用例的解决方案。
我有一个开源的VBE加载项项目(请参阅GitHub上的Rubberduck),其中包括一个集成了IDE的Git源控制面板:
a number of issues与它有关 - 例如它完全与主机无关,因此对于任何特定于主机的东西(即Rubberduck不使用主机)都没有支持应用程序的对象模型)。但该项目是开源的,非常活跃,所以所有的bug最终都会被压扁:)
请注意上面屏幕截图中的包含更改部分:
“撤消”源代码控制命令实际上还原了对文件所做的任何更改,因为它是从存储库中提取的:使用源代码控制,您不再需要担心本地更改会破坏单一版本的事实。即使“坏”更改已提交到存储库,您也可以始终还原它们,并“返回”任何先前的提交。
您可以控制谁可以也可以不将更改推送到存储库,因此您不必担心一个用户推送“错误”更改并破坏您的项目。他们的本地变化可以很容易地恢复。
现在,是否将未经实验的将要编码器引入源控制概念是一个好主意,是另一个争论......但是IMO它不会因为源控制这样的事情而受到伤害如果VBA要成为更大,更广,更狂野的编程世界的入口,那么从一开始就单元测试 - 尤其是。
答案 1 :(得分:1)
任何传统方法都无法做到这一点。一些疯狂的解决方案也许可以通过子类化(拦截同义词)windows消息队列和取消任何键盘笔划来实现,但这太复杂了。
抱歉,它不像C#.Net的VB.NET,可能模块是源控制的,如果没有以只读方式检出。
您可以动态创建第二个工作簿并将模块复制到那里以便您获胜;不得不担心其他人更改代码。
答案 2 :(得分:1)
正如其他回答者所指出的那样,如果没有采取一些特别的行动,例如安装监控所有击键的插件或其他一些重手解决方案,这根本不可能。如果您只想让用户查看代码,请向他们展示代码。你根本不需要用VBE来做这件事:
Public Sub DisplayWorkbookCode(wb As Workbook)
Dim i As Long
With wb.VBProject.VBComponents
For i = 1 To .Count
With .Item(i).CodeModule
If .CountOfLines > 0 Then
MsgBox .Lines(1, .CountOfLines), , .Name
End If
End With
Next
End With
End Sub
样本用法:
DisplayWorkbookCode ThisWorkbook
请注意,上面的示例只是使用一个消息框来显示每个模块的代码 - 如果有大量代码,您可能需要构建一个自定义UserForm来显示它或类似的东西。
答案 3 :(得分:-2)