2016-12-21 69 views
0

我无法找到任何信息,如果有可能让用户看到宏代码,但同时使他们无法更改VBA码。我需要锁定它才能进行编辑。 我有一个很多用户使用的excel文件。我希望他们看到要学习的代码,但同时我希望保护代码免受任何更改。 这可能吗?VBA Excel密码锁定宏编辑但仍然允许用户看到的代码

+0

用于查看的锁,正如@Jeremy所示,然后在单独的文件中提供代码 – SeanC

+1

为什么需要锁定编辑中的* code *?你不能只是* Excel文件*只读? – Comintern

+0

我很惊讶,这不是一个重复的问题...某处... –

回答

-2

还有就是,第一:

enter image description here

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

enter image description here

+1

一旦锁定代码是不可见的。 –

+0

道歉 - 误解了正在寻找的东西 – Jeremy

1

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

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

您可以即时创建第二个工作簿并在那里复制模块,因此您赢了;不必担心其他人更改代码。

2

我希望他们看到要学习的代码,但同时我希望保护代码免受任何更改。

这是X-Y的问题:你需要的是不要“的编辑锁模块”,你需要的是一个方法来“恢复”可能已被inexperimented观众在不经意间做任何更改。

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

实际上需要的解决方案存在,它叫做源控件

没有源代码控制,“真相”驻留在文档主机内;该文件中存在的任何代码都是单一版本的真相,并且对其做出的任何更改成为的新真理。避免这种情况的一种方法是使用文件系统:制作您分发的宏的版本化副本,以便如果某些用户更改某些内容并将其中断,可以随时重新发送您提供的原始版本。

随着源控制中,“真”驻留文档主机,在。源代码管理系统负责跟踪所有变更,何时制定以及由谁制定。 “真相”成为,并且您可以创建分支并开始实施新功能而不影响“中继”,直到您合并您的更改。

不幸的是,VBE是不是很源头控制友好:源控制工作得很好,你需要它来追踪各个单独的源代码文件/模块 - 和VBA代码,顾名思义,在嵌入式主机文件,其本身可以包含事物引用VBA代码(例如一个形状 /按钮已分配给一个),和VBA代码可以参考的东西主机文件中(例如,指的特定码Worksheet对象),因此,尽管有大量的或多或少的简单解决方案的代码从项目导出到文件系统,并导入回来......我不知道,涵盖了每一个使用情况下,任何解决方案。

我有包括IDE集成的Git源控制面板的开源VBE外接程序项目正在进行(见GitHub上Rubberduck):

Rubberduck's source control panel

a number of issues它 - 例如它完全与主机无关,因此对于任何主机特定的东西(例如,Rubberduck不使用宿主应用程序的对象模型)都没有支持。不过,这个项目是开源的,而且非常活跃,所以所有的错误最终会被压扁:)

通知的变化包括在上面的截图部分:

"Undo changes" button

“撤消”源代码控制命令从字面上恢复到一个文件中所做的任何更改,因为它是从仓库拉:与源代码控制你再也不用担心局部变化打破了真相您单一版本。即使“错误”更改提交到存储库,您也可以随时恢复它们,并“返回”任何以前的提交。

您可以控制谁可以或不可以更改推到仓库,所以你不必担心一个用户推动的“坏”的变化,打破你的项目。而且他们的地方变化可以很容易地恢复。

现在,无论是引入inexperimented 将待编码到源代码管理的概念是一个好主意,是另一个争论......但IMO不能伤害暴露喜欢的东西源控制和单元测试从一开始 - 尤其如果VBA是成为一个入口进入编程更大,更宽,狂野的世界。

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来显示它或类似的东西。