ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: yuanzhuping

VBA常用技巧代码解析

    [复制链接]

TA的精华主题

TA的得分主题

发表于 2009-7-2 09:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:开发帮助和教程
感激之情都不知道怎么说了~

TA的精华主题

TA的得分主题

发表于 2009-7-2 09:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
感谢感谢。。。。。

TA的精华主题

TA的得分主题

发表于 2009-7-2 14:59 | 显示全部楼层
系统学习一下,受益非浅,非常感谢版主的无私和辛勤的劳动。

TA的精华主题

TA的得分主题

发表于 2009-7-2 15:12 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-7-2 16:12 | 显示全部楼层

第11部分 其他应用

技巧194         制作发放条
       虽然大多数企业的工资核算都已使用了专业软件,但是有些不能上工资表的项目还是需要使用Excel来制作发放表,比如如图所示的奖金发放表,这时往往需要提供发放条给每一个职工。
Snap2.jpg
制作发放条的方法有很多,其中使用VBA制作发放条是最方便快捷的,如下面的代码 所示。
  1. #001  Sub Printissued()
  2. #002      Dim r As Integer
  3. #003      Dim Sh As Worksheet
  4. #004      Dim i As Integer
  5. #005      Application.ScreenUpdating = False
  6. #006      r = Sheet1.Range("B65536").End(xlUp).Row
  7. #007      With Worksheets
  8. #008          Set Sh = .Add(after:=Worksheets(.Count))
  9. #009      End With
  10. #010      With Sh
  11. #011          Sheet1.Range("A1:K" & r).Copy .Range("A1")
  12. #012          .Range("A5:K" & r) = Sheet1.Range("A5:K" & r).Value
  13. #013          .Range("F2,K2") = ""
  14. #014          With .PageSetup
  15. #015              .PrintTitleRows = "$1:$1"
  16. #016              .LeftMargin = Application.CentimetersToPoints(1)
  17. #017              .RightMargin = Application.CentimetersToPoints(1)
  18. #018              .CenterHorizontally = True
  19. #019          End With
  20. #020          For i = 1 To r
  21. #021              .Rows(i).RowHeight = Sheet1.Rows(i).RowHeight
  22. #022          Next
  23. #023          For i = 1 To 11
  24. #024              Columns(i).ColumnWidth = Sheet1.Columns(i).ColumnWidth
  25. #025          Next
  26. #026          r = .Range("B65536").End(xlUp).Row
  27. #027          For i = r To 6 Step -1
  28. #028              .Rows("2:4").Copy
  29. #029              .Rows(i).Insert Shift:=xlDown
  30. #030          Next
  31. #031          Application.CutCopyMode = False
  32. #032          ActiveWindow.View = xlPageBreakPreview
  33. #033          For i = 1 To .HPageBreaks.Count
  34. #034              If .HPageBreaks(i).Location.Offset(-1, 0) <> "" Then
  35. #035                  .HPageBreaks.Add Before:=.HPageBreaks(i).Location.Offset(-2, 0)
  36. #036              End If
  37. #037          Next
  38. #038          ActiveWindow.View = xlNormalView
  39. #039          .PrintOut
  40. #040          Application.DisplayAlerts = False
  41. #041          .Delete
  42. #042          Application.DisplayAlerts = True
  43. #043      End With
  44. #044      Application.ScreenUpdating = True
  45. #045  End Sub
复制代码
代码解析:
       Printissued过程将发放表以发放条的形式打印。
       第5行代码关闭屏幕刷新加快运行速度。
       第7行到第9行代码,为了不破坏原表的结构,在工作簿中新建一张工作表用来制作发放条。
       第11行代码,将发放表中需要制作发放条的区域拷贝到新工作表中。
       第12行代码,将表中的公式部分转化为数值。
       第13行代码,删除原表中的年度和人数。
       第14行到第19行代码,设置发放条表的打印标题行、左右边距及水平居中。
       第20行到第25行代码,设置发放条表的行高列宽与原表一致。
       第26行到第31行代码,在发放条的每行数据前插入表头部分。
       第32行到第38行代码,因为可能存在同一个人表头和数据不在同一页面的现象,所以逐一检查分页符,如果分页符所在单元格的上面单元格不是空白行则将分页符上移两行。
       第39行代码,使用PrintOut方法打印发放条。
       第40行到第42行代码,使用Delete方法删除发放条表。
       运行Printissued过程,发放条表没删除前如图所示。
Snap1.jpg

技巧194 制作发放条.rar

31.53 KB, 下载次数: 1499

TA的精华主题

TA的得分主题

发表于 2009-7-2 18:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
楼主加油继续更新

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-7-3 08:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

第11部分 其他应用

技巧195         费用统计表
       对于经常发生的一些费用开支,可以使用Excel进行录入和统计,比如使用本统计表可以方便的录入汽车费用明细,对费用明细按时间或类别进行统计,并以图表的形式在窗体中显示出来。
       步骤1,新建工作簿,将Sheet1表重命名为“费用明细”并设置为如图所示的格式。
Snap1.jpg
       步骤2,在Sheet1工作表中单击菜单“视图”→“工具栏”→“控件工具箱”,在显示的工具栏中选择“其他附件”中的DTPicker控件,在工作表中拖动添加一个DTPicker控件。如果“其他附件”中没有该控件,请参阅技巧118 对其进行注册。
       步骤3,在VBE中双击Sheet1,在工作表的SelectionChange事件过程中写入以下代码。
  1. #001  Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2. #002      Dim r As Integer
  3. #003      r = Sheet1.Range("B65536").End(xlUp).Row
  4. #004      If Target.Row > 1 And Target.Row < r And Target.Count = 1 Then
  5. #005          If Target.Column = 1 Then
  6. #006              With Me.DTPicker1
  7. #007                  .Visible = True
  8. #008                  .Value = Date
  9. #009                  .Top = Target.Top
  10. #010                  .Left = Target.Left
  11. #011                  .Width = Target.Width + 15
  12. #012                  .Height = Target.Height
  13. #013              End With
  14. #014          Else
  15. #015              Me.DTPicker1.Visible = False
  16. #016          End If
  17. #017          If Target.Column = 3 Then
  18. #018              With Target.Validation
  19. #019                  .Delete
  20. #020                  .Add Type:=xlValidateList, _
  21. #021                  AlertStyle:=xlValidAlertStop, _
  22. #022                  Operator:=xlBetween, _
  23. #023                  Formula1:="汽油费,过路费,保险费,修理费,保养费,装饰费,改装费,养路费,其他费"
  24. #024              End With
  25. #025          End If
  26. #026       End If
  27. #027  End Sub
复制代码
代码解析:
       工作表的SelectionChange事件,当选择A列单元格时显示日历控件,选择C列时建立数据有效性,便于在工作表中录入时间及费用类别。
       第4行代码,设置该事件的触发条件,只有在选择第2行和“合计”行之间单元格并且只选择一个单元格时事件触发。
       第5行到第16行代码如果选择的是第一列录入日期的单元格时,显示日历控件并对其格式进行相应的设置,如图 所示,方便录入费用日期,否则隐藏日历控件。
Snap2.jpg
       第17行到第26行代码如果选择的是第三列录入费用类别的单元格时,在单元格中建立数据有效性设置,如图所示。关于在工作表中建立数据有效性请参阅12-1。
Snap3.jpg
       在VBE中双击Sheet1,在工作表的Change事件过程中写入以下代码。
  1. #001  Private Sub Worksheet_Change(ByVal Target As Range)
  2. #002      Dim r1 As Integer
  3. #003      Dim r2 As Integer
  4. #004      With Sheet1
  5. #005          r1 = .Range("D65536").End(xlUp).Row
  6. #006          r2 = .Range("E65536").End(xlUp).Row
  7. #007          If Target.Column = 4 And Target.Row > 1 And Target.Count = 1 Then
  8. #008              .Range("E2:E" & r1).FormulaR1C1 = "=SUM(R2C4:RC4)"
  9. #009              .Range("E2:E" & r1) = Range("E2:E" & r1).Value
  10. #010              .Cells(r2, 5).FormulaR1C1 = "=SUM(R2C4:RC4)"
  11. #011              .Cells(r2, 5) = .Cells(r2, 5).Value
  12. #012          End If
  13. #013      End With
  14. #014  End Sub
复制代码
代码解析:
       工作表的Change事件过程,当工作表的第四列单元格中录入费用金额时,在第五列“合计”单元格中写入金额合计的公式,并将公式转化为数值。
       在设计模式下双击DTPicker控件,写入下面的代码。
  1. #001  Private Sub DTPicker1_CloseUp()
  2. #002      ActiveCell = DTPicker1.Value
  3. #003      DTPicker1.Visible = False
  4. #004  End Sub
复制代码
代码解析:
       DTPicker控件的Change事件,选择日历控件的日期时将日期写入到工作表的活动单元格中。
       步骤4,在VBE窗口中单击菜单“插入”→“用户窗体”,添加一个“统计”窗体,在窗体中添加一个ListView和一个框架控件控件,在框架控件中添加三个组合框控件、三个按钮控件和一个框架控件,在其中添加一个标签控件,如图所示。
Snap4.jpg
       在VBE中双击窗体写入下面的代码。
  1. #001  Private Sub UserForm_Initialize()
  2. #002      Dim Col As New Collection
  3. #003      Dim rng As Range, arr, Category
  4. #004      Dim i As Integer
  5. #005      On Error Resume Next
  6. #006      For Each rng In Sheet1.Range("A2:A" & [A65536].End(xlUp).Row)
  7. #007          Col.Add Left(rng, 7), Key:=CStr(Left(rng, 7))
  8. #008      Next
  9. #009      ReDim arr(1 To Col.Count)
  10. #010      For i = 1 To Col.Count
  11. #011          arr(i) = Col(i)
  12. #012      Next
  13. #013      Me.Frame1.ComboBox1.List = arr
  14. #014      Me.Frame1.ComboBox2.List = arr
  15. #015      Category = Array("汽油费", "过路费", "保险费", "修理费", "保养费", "装饰费", "其他费")
  16. #016      Me.Frame1.ComboBox3.List = Category
  17. #017      With Me.ListView1
  18. #018          .ColumnHeaders.Clear
  19. #019          .ColumnHeaders.Add , , "   日期", 55, lvwColumnLeft
  20. #020          .ColumnHeaders.Add , , "       费用内容", 110, lvwColumnLeft
  21. #021          .ColumnHeaders.Add , , "费用类别", 50, lvwColumnCenter
  22. #022          .ColumnHeaders.Add , , "金额   ", 50, lvwColumnRight
  23. #023          .ColumnHeaders.Add , , "合计   ", 60, lvwColumnRight
  24. #024          .View = lvwReport
  25. #025          .Gridlines = True
  26. #026      End With
  27. #027      Me.CommandButton3.Enabled = False
  28. #028  End Sub
复制代码
代码解析:
       窗体的Initialize事件,窗体初始化时对其中的控件进行相应的设置。
       第6行到第14行代码,使用Add方法将第一列中的日期去除重复值后取其年月添加到“开始日期”和“结束日期”组合框中,关于使用Add方法去除重复值请参阅技巧110 。
       第15、16行代码在“费用类别”组合框中添加列表项。关于在组合框中添加列表项的方法请参阅技巧109 。
       第17行到第26行代码在ListView控件中添加标题列并进行相应的设置,请参阅技巧131 。
       第27行代码将“图表”按钮的Enabled属性设置为False,使之暂不可用。
       在VBE中双击窗体上的“统计”按钮写入下面的代码。
  1. #001  Private Sub CommandButton1_Click()
  2. #002      Dim StartDate As Date
  3. #003      Dim EndDate As Date
  4. #004      Dim r As Integer
  5. #005      Dim r2 As Integer
  6. #006      Dim Itm As ListItem
  7. #007      Dim i As Integer
  8. #008      Dim Col As New Collection
  9. #009      Dim rng As Range
  10. #010      Dim StrResults As String
  11. #011      r = Sheet1.Range("A65536").End(xlUp).Row
  12. #012      With Me.Frame1.ComboBox1
  13. #013          If .Value = "" Then
  14. #014              StartDate = .List(0) & "-1"
  15. #015          Else
  16. #016              StartDate = .Value & "-1"
  17. #017          End If
  18. #018      End With
  19. #019      With Me.Frame1.ComboBox2
  20. #020          If .Value = "" Then
  21. #021              EndDate = DateSerial(Year(.List(.ListCount - 1) & "-1"), Month(.List(.ListCount - 1) & "-1") + 1, 0)
  22. #022          Else
  23. #023              EndDate = DateSerial(Year(.Value & "-1"), Month(.Value & "-1") + 1, 0)
  24. #024          End If
  25. #025      End With
  26. #026      If StartDate > EndDate Then
  27. #027          MsgBox "开始日期不能大于结束日期,请重新选择!", , "提示"
  28. #028          Exit Sub
  29. #029      End If
  30. #030      If Me.Frame1.ComboBox3 = "" Then
  31. #031          Me.CommandButton3.Enabled = True
  32. #032      Else
  33. #033          Me.CommandButton3.Enabled = False
  34. #034      End If
  35. #035      Application.ScreenUpdating = False
  36. #036      Sheet1.Range("A1:E" & r).AutoFilter Field:=1, Criteria1:=">=" & StartDate, Criteria2:="<=" & EndDate
  37. #037      If Me.Frame1.ComboBox3 <> "" Then
  38. #038          Sheet1.Range("A1:E" & r).AutoFilter Field:=3, Criteria1:=Me.Frame1.ComboBox3.Value
  39. #039      End If
  40. #040      With Sheet2
  41. #041          .Cells.Clear
  42. #042          Sheet1.AutoFilter.Range.SpecialCells(12).Copy .Cells(1, 1)
  43. #043          r2 = .Range("A65536").End(xlUp).Row
  44. #044          If r2 > 1 Then
  45. #045              .Range("E2:E" & r2).FormulaR1C1 = "=SUM(R2C4:RC4)"
  46. #046              .Range("E2:E" & r2) = .Range("E2:E" & r2).Value
  47. #047          End If
  48. #048      End With
  49. #049      Sheet1.Range("A1:E" & r).AutoFilter
  50. #050      With Me.ListView1
  51. #051          .ListItems.Clear
  52. #052          For i = 2 To r2
  53. #053              Set Itm = .ListItems.Add()
  54. #054              With Sheet2
  55. #055                  Itm.Text = .Cells(i, 1)
  56. #056                  Itm.SubItems(1) = .Cells(i, 2)
  57. #057                  Itm.SubItems(2) = .Cells(i, 3)
  58. #058                  Itm.SubItems(3) = Format(.Cells(i, 4), "0.00")
  59. #059                  Itm.SubItems(4) = Format(.Cells(i, 5), "0.00")
  60. #060              End With
  61. #061          Next
  62. #062      End With
  63. #063      On Error Resume Next
  64. #064      Sheet3.Range("A1:B30").Clear
  65. #065      If r2 > 1 Then
  66. #066          For Each rng In Sheet2.Range("C2:C" & r2)
  67. #067              Col.Add rng, Key:=CStr(rng)
  68. #068          Next
  69. #069          For i = 1 To Col.Count
  70. #070              With Sheet3
  71. #071                  .Cells(i, 1) = Col(i)
  72. #072                  .Cells(i, 2).FormulaR1C1 = "=SUMIF(统计数据!R2C[1]:R" & r2 & "C[1],RC[-1],统计数据!R2C[2]:R" & r2 & "C[2])"
  73. #073                  .Cells(i, 2) = .Cells(i, 2).Value
  74. #074                  StrResults = StrResults & Space(2) & .Cells(i, 1) & ":" & Space(3) & .Cells(i, 2) & "元" & Chr(13)
  75. #075              End With
  76. #076          Next
  77. #077          Label4.Caption = Space(2) & StartDate & " 至:" & Chr(13) & Space(2) & EndDate & " 期间" & Chr(13) & StrResults & Space(2) & "合  计:" & Space(3) & Sheet2.Cells(r2, 5).Value & "元"
  78. #078      Else
  79. #079          Label4.Caption = Space(2) & StartDate & " 至:" & Chr(13) & Space(2) & EndDate & " 期间" & Chr(13) & Space(2) & Me.Frame1.ComboBox3.Value & "没有发生!"
  80. #080      End If
  81. #081      Application.ScreenUpdating = True
  82. #082  End Sub
复制代码
代码解析:
       窗体上的“统计”按钮的单击事件,按日期统计费用类型和金额并显示在ListView控件中。
       第12行到第18行代码取得需要统计的开始日期,如果没有选择开始日期则默认为工作表中已录入日期的第一个月的第一天。
       第19行到第25行代码取得需要统计的结束日期,如果没有选择结束日期则默认为工作表中已录入日期的最后一个月的最后一天。
       第26行到第29行代码检查开始日期和结束日期,开始日期不能大于结束日期,否则无法正确统计数据。
       第30行到第34行代码设置“图表”按钮的Enabled属性,如果没有选择“费用类别”说明统计的是全部类别,则“图表”按钮有效;如果选择了“费用类别”中的明细类别,则不需要“图表”按钮,因为单一的费用类别是不需要使用图表进行分析的。
       第36行代码对工作表中的数据进行自定义筛选,筛选出介于所选开始日期和结束日期之间的数据。
       第37行到第39行代码如果同时选择了“费用类别”中的明细类别,则对工作表中筛选出来的数据进行第二次筛选,筛选出该类别的数据。
       第40行到第48行代码将筛选结果复制到Sheet2工作表中,请参阅技巧36 。
       第49行代码取消筛选模式。
       第50行到第62行代码将Sheet2工作表中的筛选结果显示到窗体的ListView控件中。关于ListView控件请参阅技巧131 。
       第63行到第68行代码将Sheet2工作表中的筛选结果中的C列中的明细类别使用使用Add方法去除重复值。请参阅技巧110 。
       第69行到第80行代码在Sheet3工作表A列中写入类别明细并在B列中写入SUMIF函数计算该费用类别在统计时段中的合计发生费用,并将公式转化为数值。最后使用标签将类别明细和费用金额显示有窗体中。
       在VBE中双击窗体上的“图表”按钮写入下面的代码。
  1. #001  Private Sub CommandButton3_Click()
  2. #002      Dim r As Integer
  3. #003      Dim myRange As Range
  4. #004      Dim myChart As ChartObject
  5. #005      Application.ScreenUpdating = False
  6. #006      With Sheet3
  7. #007          r = .Range("A65536").End(xlUp).Row
  8. #008          .ChartObjects.Delete
  9. #009          Set myRange = .Range("A" & 1 & ":B" & r)
  10. #010          Set myChart = .ChartObjects.Add(120, 40, 400, 250)
  11. #011          With myChart.Chart
  12. #012              .ChartType = xlPie
  13. #013              .SetSourceData Source:=myRange, PlotBy:=xlColumns
  14. #014              .Location xlLocationAsObject, "统计图表"
  15. #015              .Legend.Position = -4152
  16. #016              .Legend.Font.Size = 9
  17. #017              .PlotArea.Interior.ColorIndex = -4142
  18. #018              .PlotArea.Border.LineStyle = -4142
  19. #019              .SeriesCollection(1).ApplyDataLabels _
  20. #020                  AutoText:=True, _
  21. #021                  HasLeaderLines:=True, _
  22. #022                  ShowValue:=True, _
  23. #023                  ShowCategoryName:=True, _
  24. #024                  ShowPercentage:=True
  25. #025              .SeriesCollection(1).DataLabels.Font.Size = 9
  26. #026          End With
  27. #027          Set myChart = Nothing
  28. #028      End With
  29. #029      Sheet1.Select
  30. #030      Application.ScreenUpdating = True
  31. #031      UserForm2.Show
  32. #032  End Sub
复制代码
代码解析:
       窗体中“图表”按钮的单击事件,在Sheet3工作表中根据统计数据建立图表。
       第8行代码,首先删除工作表原有的图表。
       第10行代码,在Sheet3表中建立新的图表。
       第11行到第26行代码,对新建立的图表进行格式设置。关于图表请参阅技巧60 。
       第31行代码显示图表窗体。

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-7-3 08:29 | 显示全部楼层
步骤5,在VBE窗口中单击菜单“插入”→“用户窗体”,添加一个“图表”窗体,在窗体中添加一个Image控件和一个按钮控件,如图所示。
Snap5.jpg
       在VBE中双击窗体,写入下面的代码。
  1. #001  Private Sub UserForm_Initialize()
  2. #002      Dim Charts As Chart
  3. #003      Dim cName As String
  4. #004      Set Charts = Sheet3.ChartObjects(1).Chart
  5. #005      cName = ThisWorkbook.Path & "\Temp.gif"
  6. #006      Charts.Export Filename:=cName, FilterName:="GIF"
  7. #007      Image1.Picture = LoadPicture(cName)
  8. #008  End Sub
  9. #009  Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  10. #010      Kill ThisWorkbook.Path & "\Temp.gif"
  11. #011  End Sub
  12. #012  Private Sub CommandButton1_Click()
  13. #013      Unload Me
  14. #014  End Sub
复制代码
代码解析:
       第1行到第8行代码是窗体的Initialize事件,在窗体初始化时将工作表中的图表显示在窗体中。
       第9行到第11行代码是窗体的QueryClose事件,在窗体关闭时删除临时文件。
       关于将图表显示在窗体上的方法请参阅技巧146-1。
       步骤6,为了方便使用,需要在菜单栏上添加自定义菜单,在VBE窗口中单击菜单“插入”→“模块”,在模块中写入下面的代码。
  1. #001  Sub AddNewMenu()
  2. #002      Dim HelpMenu As CommandBarControl
  3. #003      Dim NewMenu As CommandBarPopup
  4. #004      With Application.CommandBars("Worksheet menu bar")
  5. #005          .Reset
  6. #006          Set HelpMenu = .FindControl(ID:=.Controls("帮助(&H)").ID)
  7. #007          If HelpMenu Is Nothing Then
  8. #008              Set NewMenu = .Controls.Add(Type:=msoControlPopup)
  9. #009          Else
  10. #010              Set NewMenu = .Controls.Add(Type:=msoControlPopup, _
  11. #011                  Before:=HelpMenu.Index)
  12. #012          End If
  13. #013          With NewMenu
  14. #014              .Caption = "汽车费用(&S)"
  15. #015              With .Controls.Add(Type:=msoControlButton)
  16. #016                  .Caption = "批量插入空行(&D)"
  17. #017                  .FaceId = 162
  18. #018                  .OnAction = "InSertRows"
  19. #019              End With
  20. #020              With .Controls.Add(Type:=msoControlButton)
  21. #021                  .Caption = "汽车费用统计(&T)"
  22. #022                  .FaceId = 590
  23. #023                  .OnAction = "Form"
  24. #024              End With
  25. #025          End With
  26. #026      End With
  27. #027      Set HelpMenu = Nothing
  28. #028      Set NewMenu = Nothing
  29. #029  End Sub
复制代码
  1. #030  Sub DelNewMenu()
  2. #031      Application.CommandBars("Worksheet menu bar").Reset
  3. #032  End Sub
  4. #033  Sub Form()
  5. #034      UserForm1.Show
  6. #035  End Sub
  7. #036  Sub InSertRows()
  8. #037      Dim dInput As Byte
  9. #038      Dim i As Byte
  10. #039      Dim r As Integer
  11. #040      r = Sheet1.Range("B65536").End(xlUp).Row
  12. #041      dInput = Application.InputBox(Prompt:="请输入插入的行数:", Title:="批量插入空行", Type:=1)
  13. #042      If dInput <> False Then
  14. #043          Application.ScreenUpdating = False
  15. #044          For i = 1 To dInput
  16. #045              Sheet1.Rows(r).Insert
  17. #046          Next
  18. #047          Application.ScreenUpdating = True
  19. #048      End If
  20. #049  End Sub
复制代码
代码解析:
       AddNewMenu过程在菜单栏的帮助菜单前添加“汽车费用”菜单。
       DelNewMenu过程删除添加的“汽车费用”菜单。
       Form过程是“汽车费用”菜单中的子菜单“汽车费用统计”所运行的宏过程,显示“图表”窗体。
       关于在工作表菜单栏中添加自定义菜单请参阅技巧80 。
I       nSertRows过程是“汽车费用”菜单中的子菜单“批量插入空行”所运行的宏过程,使用InputBox方法显示一个对话框,输入需要插入的行数后使用Insert方法在工作表中插入空行。
       关于InputBox方法请参阅技巧76 ,关于Insert方法请参阅技巧30 。
       为了在打开工作簿时自动添加菜单项,需要在工作簿的Activate事件中调用myTools过程,如下面的代码所示。
  1. #001  Private Sub Workbook_Activate()
  2. #002      Call AddNewMenu
  3. #003  End Sub
复制代码
为了在关闭工作簿时删除新添加的菜单项,还需要在工作簿的Deactivate事件中调用DelmyTools过程,如下面的代码所示。
  1. #001  Private Sub Workbook_Deactivate()
  2. #002      Call DelNewMenu
  3. #003  End Sub
复制代码
步骤7,因为在平时使用时是不需要操作Sheet2表和Sheet3表的,在VBE中分别选择Sheet2表和Sheet3表的属性窗口,将Visible设置为xlSheetVeryHidden,使工作表深度隐藏,这样在“格式”菜单中就不能取消隐藏。
       保存关闭工作簿,重新打开工作簿,在费用明细表中录入数据后,点击“汽车费用”菜单后显示“费用统计”窗体,选择统计条件后即能统计出明细费用,如图所示。
Snap6.jpg
       此时单击窗体中的“图表”按钮将用窗体显示该期间费用的图表,如图所示。
Snap7.jpg

技巧195 费用统计表.rar

39.53 KB, 下载次数: 1566

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2009-7-3 08:55 | 显示全部楼层

回复 1273楼 yuanzhuping 的帖子

感谢!!!!!!!!!!!!!

TA的精华主题

TA的得分主题

发表于 2009-7-3 09:45 | 显示全部楼层
楼主辛苦了,麻烦回答一个问题。
如何删除指定文件内的所有宏代码(包括窗体、控件、模块等)?
楼主根据技巧188-4中内容修改一下。
谢谢!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-25 04:56 , Processed in 0.064974 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表