我在Excel中创建了一个VBA项目,该项目中有一个模块将代码写入另一个模块。我最终对该项目进行了密码保护,以便隐藏代码(没有立即意识到这会带来一些非常明显的问题)。
当用户与文件交互时,模块尝试运行代码,但遇到错误(受密码保护的项目无法修改自己!嘿,我们都有自己的duh时刻: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加载项),但我宁愿尽可能简单。非常感谢您的建议和提示。谢谢
使用未受保护的Addin似乎是一种合理的方法。但是您发布的代码会写入受保护加载项中的另一个模块。您需要将另一个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
所以我找到了一种似乎可行的方法,我使用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)
我仍然很好奇如何"直接"写它,所以我会更多地玩它,看看我是否能得到它,尽管这种方式适用于
谢谢:)