Excel VBA – 以编程方式将代码插入到工作表的CodeModule中的特定子macros

这是一个(据我所知)从CPearson的资源站点 (这是一个非常好的资源,那些希望在Excel中使用macros以编程方式将代码插入新的工作表/工作簿,或现有的工作表/工作簿)。

我目前有Sheet1包含一系列四到五个独立的子macros,执行目前不相互影响的function。 我已经写了一个macros,当用户按下button激活时,会创build一个新的工作表,并在该工作表上插入几行代码(此任务已经完成且function正常)。

我的目标是在这个过程中添加一行,这样,一旦执行了上述操作,“Code of xyz#1”将被添加到CodeModule中的特定过程,即:“Sub MacroMain()”。

我目前能够(几乎)使用以下的“AddCode”是一个文本string来实现这个结果:

ActiveWorkbook.VBProject.VBComponents(Sheets("Sheet1").CodeName).CodeModule.AddFromString AddCode 

然而,这个解决scheme的问题是,它只是将新的代码行添加到Sheet1的CodeModule的最上部分,而不是特定的子macrosSub MacroMain。 试图在上面的行中引用SubMacroMain不幸的是产生了“期望的函数或variables”错误。 我认为这是我的部分用户格式错误。

我想知道是否应该使用上面列出的代码行来确定是否有特定的语法,以便将在此过程中插入的代码放入Sheet1的CodeModule中的特定macros中。

谢谢。

你有几个select。 如果您知道确切的行号,则可以使用InsertLines在特定的行号处添加行。 例如:

 Sub AddLineToModule(LineNum as Long, StrLineText as String) Dim VBProj As VBIDE.VBProject Dim VBComp As VBIDE.VBComponent Dim CodeMod As VBIDE.CodeModule Const DQUOTE = """" ' one " character Set VBProj = ActiveWorkbook.VBProject Set VBComp = VBProj.VBComponents("Module1") Set CodeMod = VBComp.CodeModule CodeMod.InsertLines LineNum, StrLineText Set VBProj = Nothing Set VBComp = Nothing Set CodeMod = Nothing End Sub 

原始解决scheme斜体:如果您不知道确切的行号,则可以将整个模块读取到一个string数组,然后遍历它并在所需的行后添加一行。 我手边没有例子,但是如果你需要的话,可以稍后添加。 编辑 :感谢Mikegrann ,一个可能更好的解决scheme是使用Module.Find ; 然而,在下面的评论中有一些辩论是否这是一个可取的解决scheme(请参阅Mat's Mug的更新)。 根据OP的具体问题,这可能是一个可行的方法。 编辑2 :每个评论, Module.Find不应该在大多数(如果不是全部)情况下使用。 使用VBIDE API或自定义数组searchfunction来可靠地find一行代码。

最后,如果您不知道模块中的确切行号,但知道相对于特定过程开始的确切行号,可以使用上面第一个示例和ProcStarLine的组合。

 Sub AddLineToProcedure(StrProcName as String, LineNum as Long, StrLineText as String) Dim VBProj As VBIDE.VBProject Dim VBComp As VBIDE.VBComponent Dim CodeMod As VBIDE.CodeModule Const DQUOTE = """" ' one " character Set VBProj = ActiveWorkbook.VBProject Set VBComp = VBProj.VBComponents("Module1") Set CodeMod = VBComp.CodeModule With CodeMod LineNum = LineNum + .ProcStartLine(ProcName, vbext_pk_Proc) .InsertLines LineNum, StrLineText End With Set VBProj = Nothing Set VBComp = Nothing Set CodeMod = Nothing End Sub ProcName = "DeleteThisProc" With CodeMod StartLine = .ProcStartLine(ProcName, vbext_pk_Proc) NumLines = .ProcCountLines(ProcName, vbext_pk_Proc) .DeleteLines StartLine:=StartLine, Count:=NumLines End With