VBA在限定Excel工作表用户按钮中的应用(2)
作者:佚名; 更新时间:2014-12-05
e.Lines(Line1 + 1, 1)
  If InStr(Str1, "Call") Then
   Str2 = Mid(Str1, InStr(Str1, "(") + 1, InStr(Str1, ",") - InStr(Str1, "(") + 1)
   Str2 = Trim(Str(Val(Trim(Str2)) + 2))
   Str1 = Left(Str1, InStr(Str1, "(")) & Str2 & Mid(Str1, InStr(Str1, ","))
   ch.CodeModule.ReplaceLine Line1 + 1, Str1
  End If
Label3:
  Line1 = Line1 + 1
  Col1 = 1
  Endline = LinesCount
 Loop
2.3 限定按钮对象及其执行过程代码
限定按钮对象本身,之前我们可以为之添加一个名为“按钮运行次数记录表”的工作表,以便使用其第i行j列的单元格来记录当前工程第i个工作表上第j个形状对象的运行次数。此外,为了实现对按钮执行的准确计数,也需要在工程打开时清除其内容,为了防止工作表数据意外修改,最好将其隐藏。这些均可以通过创建自动宏来加以实现。
下面的代码即是按钮执行时首先被调用的过程,其作用为对按钮执行进行计数,在按钮执行到达规定次数(这里暂定为5次)时,隐藏该按钮,并将其执行过程代码设为无效。这里将代码行设为无效的方式是将其改成注释,方法仍然是通过访问指定的VBComponent下CodeModule对象的Lines属性,并采用ReplaceLine方法来实现。改成的注释行的格式为:'隐藏行*:原代码行,其中*号代表其在本代码模块中的行号。下面的代码需要与前述的查找按钮过程代码位于同一代码模块。
Public Sub 隐藏过程代码(ByVal Beginline As Integer, ByVal LinesCount As Integer, ByVal CodeName As String, ByVal SheetIndex As Integer, ByVal ButtonIndex As Long)
……
      Sheets("按钮运行次数记录表").Cells(SheetIndex, ButtonIndex).Value = Sheets("按钮运行次数记录表").Cells(SheetIndex, ButtonIndex).Value + 1
      If Sheets("按钮运行次数记录表").Cells(SheetIndex, ButtonIndex).Value >= 5 Then
        Set MyCoponent = Application.VBE.ActiveVBProject.VBComponents
        For Each ch In MyCoponent
          If ch.Name <> CodeName Then
            GoTo Label5
          End If
          '将参数规定范围的代码改为注释
For k = Beginline To Beginline + LinesCount - 1
            Str1 = ch.CodeModule.Lines(k, 1)
            Str1 = "'隐藏行" & k - Beginline + 1 & ":" & Str1
            ch.CodeModule.ReplaceLine k, Str1
          Next k
          '隐藏执行的按钮
          ActiveWorkbook.Sheets(SheetIndex).Shapes(ButtonIndex).Visible = False
Label5:
        Next
……
      End If
End Sub

3  支撑对象与软件恢复
提供对VBE及其下层对象的访问,需要创建对其支撑对象的引用,方法是进入VBE编辑环境,单击“工具”菜单的“引用”命令,然后加入对“Microsoft Visual Basic for Application Extensibility 5.3”的引用。
此外,软件运行不应该影响其本来面目,所以在其被打开时需要将其本身提供的界面恢复初态,在工程保存时将已经变为注释行的代码恢复原状,下面通过编写当前工程的自动宏AUTO_OPEN和“ThisWorkbook”模块的Workbook_BeforeSave事件过程去分别实现这两个软件恢复功能:
Public Sub AUTO_OPEN()
'查找辅助工作表
 SheetsCount = Application.ActiveWorkbook.Worksheets.Count
 For i = 1 To SheetsCount
   If ActiveWorkbook.Sheets(i).Name = "按钮运行次数记录表" Then
      FoundSheet = True
   End If
 Next i
 '添加或清除辅助工作表内容
 If Not FoundSheet Then
   ActiveWorkbook.Unprotect
   Worksheets.add.Move After:=Worksheets(SheetsCount)
   ActiveSheet.Name = "按钮运行次数记录表"
   ActiveSheet.Visible = False
 Else
   Sheets("按钮运行次数记录表").Cells.Clear
   Sheets("按钮运行次数记录表").Visible = False
 End If
 '将工作表中按钮恢复为显示状态
 SheetsCount = ActiveWorkbook.Worksheets.Count
 For i = 1 To SheetsCount
   Set MySheet = Worksheets(i)
   For Each sh In MySheet.Shapes
    If sh.Visible = False Then sh.Visible = True
   Next
 Next i
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'恢复注释行为原来的正式代码行
 Set MyCoponent = Application.VBE.ActiveVBProject.VBComponents
  For Each ch In MyCoponent
    StartLine = 1
    StartCol = 1
    LinesCount = ch.CodeModule.CountOfLines
    Endline = LinesCount
    Do While ch.CodeModule.Find("'隐藏行", StartLine, StartCol, Endline, 1, False, False)
      If StartCol <> 1 Then GoTo Label7
      Str1 = ch.CodeModule.Lines(StartLine, 1)
      Str1 = Mid(Str1, InStr(Str1, ":") + 1)
      ch.CodeModule.ReplaceLine StartLine, Str1
Label7:
      StartLine = StartLine + 1
      StartCol = 1
      Endline = LinesCount
    Loop
  Next
End Sub

4  结束语
综上所述,针对基于Excel VBA测试软件的使用权限设定,信捷职称论文写作发表网,本文提出的通过执行过程代码的控制方法实现工作表用户按钮的限定技术,操作起来尽管存在一定的麻烦,但仍然具有相当的实用性。



 

 

参考文献
[1] 云舟工作室著,中文版Excel 2000 VBA一册通,人民邮电出版社,2000.1
[2] 
Microsoft Visual Basic for Application帮助

核心期刊快速发表
Copyright@2000-2030 论文期刊网 Corporation All Rights Reserved.
《中华人民共和国信息产业部》备案号:ICP备07016076号;《公安部》备案号:33010402003207
本网站专业、正规提供职称论文发表和写作指导服务,并收录了海量免费论文和数百个经国家新闻出版总署审批过的具有国内统一CN刊号与国际标准ISSN刊号的合作期刊,供诸位正确选择和阅读参考,免费论文版权归原作者所有,谨防侵权。联系邮箱:256081@163.com