楼主 raulerini |
最近一直在帮客户做企业所得税的汇算清缴,其中,汇算清缴网上申报的客户端是由 "中国软件与技术服务股份有限公司上海分公司"开发的一个EXCEL的客户端。呵呵,由于其源代码开放,就细细研究了一下它的代码,顺便也把我研究的心得分享一下。 这里首先分析该客户端为了保护数据设计的一个屏蔽菜单栏、工具栏、功能区以及禁用快捷键的程序。 功能: 该工作簿打开时,所有菜单栏,工具栏和编辑栏都隐藏掉了,让我们在进行数据编辑时处处感到不便,如何将它们调出来呢? 分析:只有打开“汇算清缴”的工作簿才会隐藏掉菜单栏,工具栏和编辑栏等,当关闭此工作簿的时候,所有的工具栏等又会复原,因此基本可以判定,工作簿加入了一个open事件,一个beforeclose事件,open事件会隐藏菜单栏,而beforeclose事件将复原菜单栏。 解决方法:关闭该工作簿,在弹出的确认对话框中,点击“取消”。 这样,程序就先执行了一次beforeclose事件,而隐藏的菜单栏,编辑栏,工具栏等又恢复啦,而工作簿实际上并不会真正被关闭。
深入分析代码:下面我们来深入分析其代码,只有知其然才能知其所以然。首先用上面的方法复原菜单栏和工具栏,然后进入VBA编辑器(ALT+F11的快捷键已经被屏蔽)。呵呵,发现其代码居然是开放的,这正给了我们一个学习的好机会,且让我们来看看“中国软件与技术服务股份有限公司上海分公司”这样一个专业软件公司的程序员们是如何写代码的。
1、进入thiswoekbook看其open事件的代码如下:
- Private Sub Workbook_Open()
- Dim ls_ms As String
- Dim ls_fn As String
- 'If Year(Now) <> 2007 Then
- ' ls_ms = MsgBox("您用的版本已经过期,请更新版本", vbOKOnly, "信息提示")
- ' wb_sjjs.Saved = True
- ' wb_sjjs.Close
- 'Application.Quit
- 'End If
- Call Init_hsqj
- Sheets("main").Select
- Sheets("main").Range("C2").Select
- 'ls_fn = Application.ThisWorkbook.FullName
-
-
- ls_fn = "查账征收"
- Sheet1.ComboBox_Lx.AddItem ls_fn
- ls_fn = "核定征收"
- Sheet1.ComboBox_Lx.AddItem ls_fn
- If Sheet1.Range("c2").Value = "" Then
- Sheet1.cmd_sbb.Caption = "2010年度企业所得税年度纳税申报表"
- Else
- If Sheet1.Range("c2").Value = "查账征收" Then
- Sheet1.cmd_sbb.Caption = "2010年度企业所得税年度纳税申报表(A类)"
- ElseIf Sheet1.Range("c2").Value = "核定征收" Then
- Sheet1.cmd_sbb.Caption = "2010年度企业所得税年度纳税申报表(B类)"
- End If
- End If
- '启用宏的时候,功能可见
- Sheets("main").Fir_Image.Visible = False
- Sheets("main").Fir_Lb.Visible = False
- End Sub
呵呵,发现其代码中居然还存在修改,更新和调试的痕迹(您的版本已经过期这一段的代码被设为了注释)。下面一长段的为combobox添加item的代码也不是我们关注的重点,最重要的是这段代码调用了init_hsqj这样一个程序,我们重新找到init_hsqj这个程序,代码如下:
- Sub Init_hsqj()
- Dim li_ver As Integer
- Dim ls_bar As String
- Dim lb_Vis As Boolean
- Dim i As Integer
- Parent.ScreenUpdating = False
- pi_Login = 1
- li_ver = Application.Version
- If li_ver < 8 Then
- MsgBox "本系统必须在Office 97以上的系统中使用"
- ActiveWorkbook.Close
- End If
-
- '隐藏工具条
- For i = 1 To Application.CommandBars.count
- ls_bar = Application.CommandBars(i).Name
- Select Case ls_bar
- Case "Standard", "Formatting", "Forms", "Visual Basic", "Web", "Drawing", _
- "Control Toolbox", "Reviewing", "PivotTable", "Picture", _
- "External Data", "WordArt", "Clipboard" ', "Chart"
- Application.CommandBars(i).Visible = False
- End Select
- Next i
-
-
- '隐藏菜单
-
- For i = Application.CommandBars("Worksheet Menu Bar").Controls.count To 1 Step -1
- ls_caption = Application.CommandBars("Worksheet Menu Bar").Controls(i).Caption
- ls_caption = Left(ls_caption, 2)
- Select Case ls_caption
- Case "文件", "编辑", "帮助", "窗口", "数据", "工具", "格式", "插入", "视图"
- Application.CommandBars("Worksheet Menu Bar").Controls(i).Visible = False
- End Select
- Application.ExecuteExcel4Macro "SHOW.**(""Ribbon"",False)"
- Next i
- With ActiveWindow
- .DisplayHeadings = False
- .DisplayOutline = False
- .DisplayWorkbookTabs = False
- End With
-
- With Application
- .Caption = "中国软件与技术服务股份有限公司"
- .WindowState = xlNormal
- .DisplayAlerts = False
- ' .DisplayCommentIndicator = False
- .DisplayExcel4Menus = False
- .DisplayFormulaBar = False
- ' .DisplayFullScreen = False
- ' .DisplayNoteIndicator = False
- ' .DisplayRecentFiles = False
- ' .DisplayScrollBars = True
- ' .DisplayStatusBar = False
- End With
- '保护工作表
- 'For i = 1 To Sheets.Count
- 'Sheets(i).Visible = True
- 'Sheets(i).Select
- 'ActiveSheet.Protect DrawingObjects:=False, contents:=True, Scenarios:=True
- 'Next i
- Parent.ScreenUpdating = True
-
- Application.WindowState = xlMaximized
- Application.OnKey "%{f11}", ""
- 'Application.OnKey "^{c} ", " "
-
- End Sub
其中设置了注释块的废代码还挺多,值得关注的是,保护工作表这一段代码,原本可能是用代码保护的吧,后来可能觉得安全性不高,所以现在设置注释块了。 其中重要的代码: 1、li_ver = Application.Version 通过判断application的version属性来判断office的版本号,从而确定是否打开工作簿 2、隐藏工具条:Application.CommandBars(i).Visible = False这一段,通过循环,获取每个commandbar的name属性,然后对特定名称的工具条隐藏。(很奇怪的是,为什么最后一个chart工具条设置了注释块?要隐藏干嘛不隐藏彻底?) 3、隐藏菜单栏Application.CommandBars("Worksheet Menu Bar").Controls(i).Visible = False这一段:同上面一样,也是通过循环来隐藏菜单栏,同理,代码只对标准菜单栏进行了隐藏,对自定义菜单栏并没有进行隐藏 4、代码同样对EXCEL2007也没有放过, Application.ExecuteExcel4Macro "SHOW.**(""Ribbon"",False)" 这一段代码就将2007的功能区也给隐藏了 5、隐藏编辑栏的代码在这里:.DisplayFormulaBar = False 6、屏蔽ALT+F11快捷键的代码是这一段:Application.OnKey "%{f11}", "" 7、不甚理解的是,程序员关闭屏幕更新比较喜欢用parent.screenupting,实在看不出与application.screenupdating有什么区别。
beforeclose的代码和open的代码差不多,基本就是将隐藏的工具栏,功能区等重新恢复。大家可以自己看看,这里就不赘述了。
总结: 总体来说,这些代码还是写的非常好的,也给我们留下了很多学习的地方。让我们掌握了如何隐藏工具栏,隐藏菜单栏,隐藏2007的功能区,屏蔽一些主要的快捷键等等。对于哪些想限制别人使用工作表的人来说的确是一些不错的代码。
2010年度上海市企业所得税汇算清缴(客户端)3月10日.rar |