我在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加载项(Updating an xlam add-in using VBA)的一些信息,但我宁愿保持尽可能简单。建议和提示非常感谢。谢谢!
答案 0 :(得分:1)
使用不受保护的Addin似乎是一种合理的方法。但是您发布的代码会写入受保护的插件中的另一个模块。您需要将其他AddIn引用为VBProject
将不受保护的AddIn的名称更改为唯一的名称(默认为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
答案 1 :(得分: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)
我仍然很好奇如何'直接'写它,所以我会更多地玩它,看看我是否得到它,虽然这种方式有效
谢谢:)