gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:46:52 29 4
gpt4 key购买 nike

(据我所知)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 VBA - 以编程方式将代码行插入到工作表的 CodeModule 中的特定子宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38961711/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com