将 VBA procedure/function 写入 .xlam 插件

Writing VBA procedure/function to an .xlam addin

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

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

因此,作为解决此问题的方法,我想 'why not make the portion that is edited unprotected',同时保持文件的其余部分处于锁定状态。所以我想我会创建一个不受保护的 .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 加载项 (Updating an xlam add-in using VBA) 的信息,但我宁愿让它尽可能简单。非常感谢建议和提示。谢谢!

使用不受保护的插件似乎是一种合理的方法。但是您发布的代码写入了 Protected 插件中的另一个 Module。您需要将其他插件引用为 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

所以我找到了一种似乎可行的方法,我使用 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)

我还是很好奇怎么写'directly',所以我会多玩玩看能不能搞定,虽然这样可行

谢谢:)