(据我所知)这个主题没有从CPearson's resource site涉及到(对于那些希望使用Excel中的宏以编程方式将代码插入新工作表/工作簿或现有工作表/工作簿的人来说,这是一个很好的资源) )。
我目前有工作表Sheet1,其中包含一系列四个到五个单独的子宏,这些子宏执行的功能目前互不影响。我编写了一个宏,当通过用户按下按钮激活该宏时,将创建一个新的工作表,并将几行代码插入到该工作表中(此任务已经完成并且可以正常运行)。
我的目标是在此过程中添加一行,以便在执行上述操作后,将“代码行xyz#1”添加到此CodeModule中的特定过程,即:“ Sub MacroMain()”。
我目前可以(几乎)使用以下命令来实现此结果,其中“ AddCode”是文本字符串:
ActiveWorkbook.VBProject.VBComponents(Sheets("Sheet1").CodeName).CodeModule.AddFromString AddCode
但是,此解决方案的问题在于,它仅将新的代码行添加到Sheet1的CodeModule的最上部分,而不是特定的子宏Sub MacroMain。尝试在上面的行中引用SubMacroMain会产生“期望的函数或变量”错误。我认为这是我的用户格式错误。
我想知道是否应该在上面列出的代码行中遵循某种语法,以便将在此过程中插入的代码放入Sheet1的CodeModule中的特定宏中。
谢谢。
最佳答案
您有几种选择。如果您知道确切的行号,则可以使用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
原始解决方案用斜体表示:如果您不知道确切的行号,则可以将整个模块读取为字符串数组,然后遍历该模块,并在所需的行之后添加一行。我手头没有一个示例,但是如果需要,可以稍后添加。编辑:感谢Mikegrann,一个可能更好的解决方案是使用
Module.Find
;但是,下面的评论中有一些关于该解决方案是否可行的争论(请参见Mat's Mug的更新)。根据OP的特定问题,这可能是一种可行的方法。编辑2:根据注释,Module.Find
不应在大多数(如果不是全部)情况下使用。使用VBIDE API或自定义数组搜索功能来可靠地找到一行代码。最后,如果您不知道模块中的确切行号,但是知道相对于特定过程开始的确切行号,则可以结合使用我上面的第一个示例和
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
关于excel - Excel VBA-以编程方式将代码的InsertLine插入工作表的CodeModule中的特定子宏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38961711/