ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 所得税汇算清缴客户端源代码赏析

所得税汇算清缴客户端源代码赏析

作者:绿色风 分类: 时间:2022-08-18 浏览:148
楼主
raulerini
      最近一直在帮客户做企业所得税的汇算清缴,其中,汇算清缴网上申报的客户端是由 "中国软件与技术服务股份有限公司上海分公司"开发的一个EXCEL的客户端。呵呵,由于其源代码开放,就细细研究了一下它的代码,顺便也把我研究的心得分享一下。
     这里首先分析该客户端为了保护数据设计的一个屏蔽菜单栏、工具栏、功能区以及禁用快捷键的程序。
     功能: 该工作簿打开时,所有菜单栏,工具栏和编辑栏都隐藏掉了,让我们在进行数据编辑时处处感到不便,如何将它们调出来呢?
     分析:只有打开“汇算清缴”的工作簿才会隐藏掉菜单栏,工具栏和编辑栏等,当关闭此工作簿的时候,所有的工具栏等又会复原,因此基本可以判定,工作簿加入了一个open事件,一个beforeclose事件,open事件会隐藏菜单栏,而beforeclose事件将复原菜单栏。
    解决方法:关闭该工作簿,在弹出的确认对话框中,点击“取消”。
              这样,程序就先执行了一次beforeclose事件,而隐藏的菜单栏,编辑栏,工具栏等又恢复啦,而工作簿实际上并不会真正被关闭。


深入分析代码:下面我们来深入分析其代码,只有知其然才能知其所以然。首先用上面的方法复原菜单栏和工具栏,然后进入VBA编辑器(ALT+F11的快捷键已经被屏蔽)。呵呵,发现其代码居然是开放的,这正给了我们一个学习的好机会,且让我们来看看“中国软件与技术服务股份有限公司上海分公司”这样一个专业软件公司的程序员们是如何写代码的。

1、进入thiswoekbook看其open事件的代码如下:


     

  1. Private Sub Workbook_Open()
  2. Dim ls_ms As String
  3. Dim ls_fn As String
  4.     'If Year(Now) <> 2007 Then
  5.      '   ls_ms = MsgBox("您用的版本已经过期,请更新版本", vbOKOnly, "信息提示")
  6.       '  wb_sjjs.Saved = True
  7.        ' wb_sjjs.Close
  8.         'Application.Quit
  9.     'End If
  10.     Call Init_hsqj
  11.     Sheets("main").Select
  12.     Sheets("main").Range("C2").Select
  13.     'ls_fn = Application.ThisWorkbook.FullName
  14.    
  15.    
  16. ls_fn = "查账征收"
  17. Sheet1.ComboBox_Lx.AddItem ls_fn

  18. ls_fn = "核定征收"
  19. Sheet1.ComboBox_Lx.AddItem ls_fn
  20. If Sheet1.Range("c2").Value = "" Then
  21.   Sheet1.cmd_sbb.Caption = "2010年度企业所得税年度纳税申报表"
  22. Else
  23.   If Sheet1.Range("c2").Value = "查账征收" Then
  24.     Sheet1.cmd_sbb.Caption = "2010年度企业所得税年度纳税申报表(A类)"
  25.   ElseIf Sheet1.Range("c2").Value = "核定征收" Then
  26.     Sheet1.cmd_sbb.Caption = "2010年度企业所得税年度纳税申报表(B类)"
  27.   End If
  28. End If
  29. '启用宏的时候,功能可见
  30. Sheets("main").Fir_Image.Visible = False
  31. Sheets("main").Fir_Lb.Visible = False
  32. End Sub



呵呵,发现其代码中居然还存在修改,更新和调试的痕迹(您的版本已经过期这一段的代码被设为了注释)。下面一长段的为combobox添加item的代码也不是我们关注的重点,最重要的是这段代码调用了init_hsqj这样一个程序,我们重新找到init_hsqj这个程序,代码如下:

  1. Sub Init_hsqj()
  2. Dim li_ver As Integer
  3. Dim ls_bar As String
  4. Dim lb_Vis As Boolean
  5. Dim i As Integer
  6. Parent.ScreenUpdating = False

  7.     pi_Login = 1
  8.     li_ver = Application.Version
  9.     If li_ver < 8 Then
  10.         MsgBox "本系统必须在Office 97以上的系统中使用"
  11.         ActiveWorkbook.Close
  12.     End If
  13.    
  14.     '隐藏工具条
  15.     For i = 1 To Application.CommandBars.count
  16.         ls_bar = Application.CommandBars(i).Name
  17.         Select Case ls_bar
  18.             Case "Standard", "Formatting", "Forms", "Visual Basic", "Web", "Drawing", _
  19.                 "Control Toolbox", "Reviewing", "PivotTable", "Picture", _
  20.                 "External Data", "WordArt", "Clipboard"     ', "Chart"
  21.                 Application.CommandBars(i).Visible = False
  22.         End Select
  23.     Next i
  24.    

  25.    
  26.     '隐藏菜单
  27.    
  28.     For i = Application.CommandBars("Worksheet Menu Bar").Controls.count To 1 Step -1
  29.         ls_caption = Application.CommandBars("Worksheet Menu Bar").Controls(i).Caption
  30.         ls_caption = Left(ls_caption, 2)
  31.         Select Case ls_caption
  32.            Case "文件", "编辑", "帮助", "窗口", "数据", "工具", "格式", "插入", "视图"
  33.               Application.CommandBars("Worksheet Menu Bar").Controls(i).Visible = False
  34.         End Select
  35.         Application.ExecuteExcel4Macro "SHOW.**(""Ribbon"",False)"
  36.     Next i
  37.     With ActiveWindow
  38.         .DisplayHeadings = False
  39.         .DisplayOutline = False
  40.         .DisplayWorkbookTabs = False
  41.      End With
  42.    
  43.      With Application
  44.      .Caption = "中国软件与技术服务股份有限公司"
  45.      .WindowState = xlNormal
  46.      .DisplayAlerts = False
  47. '     .DisplayCommentIndicator = False
  48.      .DisplayExcel4Menus = False
  49.      .DisplayFormulaBar = False
  50. '     .DisplayFullScreen = False
  51. '     .DisplayNoteIndicator = False
  52. '     .DisplayRecentFiles = False
  53.   '  .DisplayScrollBars = True
  54. '     .DisplayStatusBar = False
  55.     End With

  56.     '保护工作表
  57.     'For i = 1 To Sheets.Count
  58.         'Sheets(i).Visible = True
  59.         'Sheets(i).Select
  60.         'ActiveSheet.Protect DrawingObjects:=False, contents:=True, Scenarios:=True
  61.     'Next i


  62.     Parent.ScreenUpdating = True
  63.    
  64.     Application.WindowState = xlMaximized
  65.     Application.OnKey "%{f11}", ""
  66.     'Application.OnKey "^{c} ", " "
  67.    

  68. End Sub


其中设置了注释块的废代码还挺多,值得关注的是,保护工作表这一段代码,原本可能是用代码保护的吧,后来可能觉得安全性不高,所以现在设置注释块了。
其中重要的代码:
1、li_ver = Application.Version
通过判断applicationversion属性来判断office的版本号,从而确定是否打开工作簿

2、隐藏工具条:Application.CommandBars(i).Visible = False这一段,通过循环,获取每个commandbarname属性,然后对特定名称的工具条隐藏。(很奇怪的是,为什么最后一个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
2楼
LOGO
谢谢分享!
3楼
sonnygreen
啥时候能达到这水平  那就高了!谢谢分享

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap