2016-03-28 84 views
3

我在Excel中创建了一个VBA项目,并且在所述项目中是一个将代码写入另一个模块的模块。我最终密码保护了项目,以便隐藏代码(不会马上意识到这会造成一些非常明显的问题)。将VBA过程/函数写入.xlam插件

当用户与文件交互时,模块会尝试运行代码,但遇到错误(密码保护的项目无法自行修改!嘿,我们都有我们的时刻: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 

虽然我发现对堆栈的一些信息和其他有关例如.xlam插件(Updating an xlam add-in using VBA),我宁愿只是不停地尽可能简单。建议和提示非常感谢。谢谢!

回答

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 
+0

当使用上述如你所说,我得到一个运行时错误“9”,下标超出范围。根据excel,外挂程序已安装,我还使用了一个独特的外挂程序名称,并带有.xlam扩展名,没有运气:/ – Singularity20XX

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)

我仍然好奇如何直接写它,所以我会更多地玩它,看看我是否得到它,虽然这样的工作

谢谢:)