4

我在 Excel 中创建了一个 VBA 项目,并且在所述项目中是一个将代码写入另一个模块的模块。我最终对项目进行了密码保护,以隐藏代码(没有立即意识到这会带来一些非常明显的问题)。

当用户与文件交互时,模块尝试运行代码,但遇到错误(受密码保护的项目无法自行修改!嘿,我们都有自己的时刻:p)。

所以,作为解决这个问题的一种方法,我想“为什么不让编辑的部分不受保护”,同时保持文件的其余部分锁定。所以我想我会创建一个不受保护的 .xlam 插件,然后将所述代码写入这部分。但是,我很难弄清楚如何做到这一点。下面是我编写的将代码写入另一个模块的代码:

Public Sub errorWrite()

Dim VBComp As VBIDE.VBComponent
Dim CodeMod As VBIDE.CodeModule
Dim s As String
Dim d As String
Dim lineNumb As Long

With ThisWorkbook.VBProject.VBComponents.item("NewModule")
.CodeModule.InsertLines j, "Public sub newModule()"

j = j + 1

With ThisWorkbook.VBProject.VBComponents.item("NewModule")
.CodeModule.InsertLines j, "(my code etc..)"

j = j + 1

   With ThisWorkbook.VBProject.VBComponents.item("NewModule")
.CodeModule.InsertLines j, "end sub"


end sub

例如,虽然我在 Stack 和其他地方找到了一些关于 .xlam 插件(使用 VBA 更新 xlam插件)的信息,但我宁愿让它尽可能简单。非常感谢您的建议和提示。谢谢!

4

2 回答 2

1

使用不受保护的插件似乎是一种合理的方法。但是您发布的代码会写入受保护插件中的另一个模块。您需要将其他 AddIn 引用为VBProject

将未受保护的插件的名称更改为唯一名称(默认为VBAProject且不必是唯一的)

然后像这样创建对它的引用

Dim VBP As VBProject
Set VBP = ThisWorkbook.VBProject.VBE.VBProjects("NameOfYourUnprotectedAddin")

然后你的所有代码都使用这个引用而不是ThisWorkbook.VBProject

例如

With VBP.VBComponents.item("NewModule")
    .CodeModule.InsertLines j, "Public sub newModule()"
' etc

End With
于 2016-03-28T02:49:40.703 回答
0

所以我能够找到一种似乎可行的方法,我使用 FSO 编写了代码,然后将文件保存为 .bas 模块。从那里我使用以下将模块作为模块直接导入 .xlam 插件:

Public Sub importBas()
Dim VBP As VBProject
Set VBP = Workbooks("example.xlam").VBProject

VBP.VBComponents.Import ("C:\Users\...example.bas")
VBP.VBComponents.Remove

End Sub

然后,在原始模块中,我在执行完成后删除了 xlam 中的程序。因此看不到任何代码(假设我记得使用错误处理并禁用中断模式:p)

我仍然很好奇如何“直接”编写它,所以我会更多地使用它,看看我是否得到它,虽然这种方式有效

谢谢 :)

于 2016-03-28T21:50:51.763 回答