VBA Excel密码来locking编辑macros,但仍然允许用户看到代码

我无法find任何信息,如果可以让用户看到macros代码,但同时,使他们无法更改VBA代码。 我需要locking它只进行编辑。 我有一个很多用户使用的excel文件。 我希望他们看到代码学习,但同时我想保护和保护代码免受任何改变。 那可能吗?

我希望他们看到代码学习,但同时我想保护和保护代码免受任何改变。

这是一个XY问题:你所需要的不是“locking模块进行编辑”,你需要的是一种“恢复”可能已经被不经意的观察者无意中做出的改变的方式。

唯一的内置的,合法的,100%安全的方法来做你想做的事情就是打印出代码并发放硬拷贝供学习。

实际需要的解决scheme存在,称为源代码pipe理

没有源代码控制,“真相”就驻留在文档主机中; 该文件中存在的任何代码都是单一的真理版本 ,而对其进行的任何修改都将成为新的事实。 避免这种情况的一种方法是使用文件系统:制作你分发的macros的版本化副本,这样,如果某个用户修改了某些内容并将其中断,那么你总是可以重新发送你给出的原始版本。

通过源代码控制,“真相”位于文档主机之外存储库中 。 源代码pipe理系统负责跟踪所有变更,何时制定以及由谁制定。 “真相”成为一棵树 ,您可以创build分支,并开始实施新function,而不会影响“主干”,直到您合并您的更改。

不幸的是,VBE不是很好的源代码pipe理:源代码控制工作正常,需要它分别跟踪每个单独的源代码文件/模块 – 而VBA代码根据定义embedded在一个主机文档中,包含引用VBA代码的东西(例如,分配给macros形状 /button),VBA代码可以引用主机文档中的东西(例如引用特定Worksheet对象的代码),所以虽然有很多或多或less简单的解决scheme,将项目中的代码导出到文件系统中,然后将其导入到文件系统中…我不知道涵盖每个用例的任何解决scheme。

我有一个开源的VBE插件项目(见GitHub上的Rubberduck ),其中包含一个IDE集成的Git源代码控制面板:

Rubberduck的源代码控制面板

很多问题 – 例如它完全不依赖于主机,所以不支持任何主机特定的东西(例如,Rubberduck不使用宿主应用程序的对象模型)。 但是这个项目是开源的,而且非常活跃,所以所有的bug最终都会被压制掉:)

注意上面截图中包含的更改部分:

“撤消更改”按钮

“撤消”源代码控制命令从文件库中拉出后,将文件恢复到文件所做的任何更改:使用源代码控制,您不必再担心本地更改会破坏单一版本的事实 。 即使“错误”更改被提交到存储库,您也可以随时恢复它们,并“返回”任何以前的提交。

您可以控制哪些人能够也可以不能将更改推送到存储库,因此您不必担心一个用户推动“不良”更改并破坏项目。 而且他们的地方变化可以很容易地恢复。

现在,不pipe是引入不实的可能编码器来源控制概念是一个好主意,是另一个辩论……但海事组织从一开始就暴露于诸如源代码pipe理和unit testing之类的东西, 尤其是如果VBA将成为一个更大,更广泛,更狂野的编程世界的入口。

这是不可能通过任何传统的手段。 一些疯狂的解决scheme也许可以通过子类化(拦截同义词)的消息队列和取消任何键盘笔画,但这太复杂了。

对不起,它不像C#.Net的VB.NET那里模块可能是源代码控制的,如果没有检出只读。

您可以立即创build第二个工作簿,并将模块复制到那里,所以您不必担心其他人更改代码。

正如其他答复者所指出的那样,如果不采取一些非凡的行动,比如安装监视所有按键的插件,或者其他一些严重的解决scheme,这是不可能的。 如果您只想让用户查看代码,请向他们显示代码。 你根本不需要使用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 

请注意,上面的示例只是使用消息框来显示每个模块的代码 – 如果有大量的代码,您可能想要构build一个自定义的UserForm来显示它或类似的东西。

首先是:

在这里输入图像说明

然后你会看到这个(根据需要勾选/取消勾选):

在这里输入图像说明