Endline = LinesCount
Loop
'找到了过程头部位置
If ch.CodeModule.Find("Sub " & MyProname & "()", StartLine, StartCol, LinesCount, 1, False, False) And ch.CodeModule.ProcOfLine(StartLine, vbext_pk_Proc) = MyProname Then
'若还没有插入规定的代码
If Trim(ch.CodeModule.Lines(StartLine + 1, 1)) <> "'隐藏过程代码" Then
'代码1……,在按钮过程代码的首部加入过程调用代码
'代码2……,调整本代码行以后的已经插入的代码行调用参数
Endif
End If
Label4:
Next
Next
Next i
ActiveWorkbook.Save
2.2 插入过程调用代码
经过查找按钮的执行过程代码的正确位置,就能够限定其执行的有效性。本文的处理方法是,在按钮的对应过程代码的首部加入两行代码,如:
'隐藏过程代码
Call 模块5.隐藏过程代码(256,73,”Sheet2”,2,3)
可以看出第一行代码是一注释行,第二行代码是一过程调用。正是这一过程调用,在按钮点击时首先被执行,从而实现了对按钮执行的准确计数,并在按钮执行到达规定次数时,阻止其执行。
下面的代码通过对找到的按钮过程所在代码模块VBComponent的下层对象CodeModule采用InsertLines方法,首先在按钮对应过程的首部插入两行临时代码,然后通过该对象的ReplaceLine方法,将它们分别替换为正确的上述两行代码。这样先插入代码行、后替换代码行的目的是,在插入代码行后便于获得准确的过程起始代码行号,从而为下面的替换代码行语句准备正确的参数。下面即是上述查找按钮过程代码中“代码1”位置处的算法代码,其功能是在查找到的按钮过程代码的首部加入上述的两行代码:
ModuleName = Application.VBE.SelectedVBComponent.Nam' 获得过程所处的代码模块名
CodeName = ch.Name
' 插入两行临时代码行
ch.CodeModule.InsertLines StartLine + 1, "'插入代码行1"
ch.CodeModule.InsertLines StartLine + 2, "'插入代码行2"
' 获得模块代码总行数、过程起始行号、过程代码总行数
LinesCount = ch.CodeModule.CountOfLines
' 过程代码起始行号
ProcStartline = ch.CodeModule.ProcStartline(MyProname, vbext_pk_Proc)
' 过程代码总行数
ProcCountLines = ch.CodeModule.ProcCountLines(MyProname, vbext_pk_Proc)
' 替换为两行正确的代码行
ch.CodeModule.ReplaceLine StartLine + 1, "'隐藏过程代码"
ch.CodeModule.ReplaceLine StartLine + 2, "Call " & ModuleName & ".隐藏过程代码(" & ProcStartline & "," & ProcCountLines & "," & """" & CodeName & """" & "," & i & "," & sh.ZOrderPosition & ")"
此外,当按钮被点击执行并进入到插入的调用过程内部时,还需要确定哪个按钮被执行、执行的次数情况、以及执行按钮的对应过程代码的行范围等情况,以便准确地实施对执行按钮及其过程代码的控制,所以在上述为按钮过程替换为正确的过程调用代码的同时,需要添入正确的下列五个过程调用参数:
(1)按钮的对应过程头部所在代码模块中的代码起始行号;
(2)按钮过程的对应代码行数;
(3)按钮过程所处的代码模块名;
(4)按钮所在的工作表序号;
(5)按钮在所在工作表上的Shape形状对象集合的序号。
从上面的插入代码中可以看出获得这些参数的方法。针对上例的过程调用语句:Call 模块5.隐藏过程代码(256,73,”Sheet2”,2,3),其参数含义是:当第2个工作表中的第3个Shape对象(按钮)执行次数到达规定次数时,则将名称为“Sheet2”的代码模块中从256行起的73行代码设为无效,并将该按钮进行隐藏。
注册
个人空间
