Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2119|回复: 5

[已解决]代码看不明白,请解释并加注释!

[复制链接]
发表于 2010-5-10 22:16 | 显示全部楼层 |阅读模式

 

Sub 生成通知单()
 Dim Dic As Object, ArrData, Temparr, aa$, bb
 aa = "月份水、电、管理费收费通知单"
 On Error Resume Next
    Sheets("通知单").Cells.Clear
 On Error GoTo 0
 
 Set Dic = CreateObject("scripting.dictionary")
 shn = CStr(Application.InputBox("请输入源数据工作表名称"))
 bb = Left(shn, Len(shn) - 1)
 bb = Choose(bb, "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二")
 Application.ScreenUpdating = 0
 If shn = False Then Exit Sub
 With Sheets(shn)
  ArrData = .Range("A3:L" & .Range("A65536").End(xlUp).Row)
  For i = 1 To UBound(ArrData)
   Dic(ArrData(i, 2)) = Dic(ArrData(i, 2)) & "," & i + 2
  Next i
 End With
 With Sheets("通知单")
  .Cells.RowHeight = 22.5
  r = 1
  For j = 1 To 12
   .Columns(j).ColumnWidth = Sheets("样表").Columns(j).ColumnWidth
  Next j
For Each tempk In Dic.keys
    Sheets("样表").Range("A1:L4").Copy
    .Range("A" & r & ":L" & r + 3).PasteSpecial Paste:=xlValues
    .Range("A" & r & ":L" & r + 3).PasteSpecial Paste:=xlPasteFormats
    .Range("A" & r) = bb & aa
    .Rows(r + 2).RowHeight = 60
    Temparr = Split(Dic(tempk), ",")
    For j = 1 To UBound(Temparr)
     .Rows(r + 2).Insert
     r = r + 1
     .Range("A" & r + 1 & ":L" & r + 1).Value _
        = Sheets(shn).Range("A" & Temparr(j) & ":L" & Temparr(j)).Value
     .Range("A" & r + 1 & ":L" & r + 1).Borders.LineStyle = 1
    Next j
    r = r + 6
Next
 End With
 aGeSet
 pr
 Application.ScreenUpdating = 1
 Sheets("样表").Activate
End Sub

T3CAcotk.rar (21.53 KB, 下载次数: 3)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2010-5-10 22:27 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2010-5-10 22:37 | 显示全部楼层

程序整个过程讲解下。每句都要有注释。

注释完后,如果再看不明白,再请教。

谢谢!

回复

使用道具 举报

 楼主| 发表于 2010-5-10 22:43 | 显示全部楼层

静坐参禅为枯禅,枯禅的人佛学与武学均有极高造诣,同理枯禅的人VBA水平肯定很高。
回复

使用道具 举报

发表于 2010-5-10 23:09 | 显示全部楼层    本楼为最佳答案   

看签名

粗看了一下,大致注了一下,希望对你有帮助:

Sub 生成通知单()
 Dim Dic As Object, ArrData, Temparr, aa$, bb
 aa = "月份水、电、管理费收费通知单"
 On Error Resume Next '忽略错误
    Sheets("通知单").Cells.Clear '清除表格内容
 On Error GoTo 0 '错误跳转
 
 Set Dic = CreateObject("scripting.dictionary") '绑定字典
 shn = CStr(Application.InputBox("请输入源数据工作表名称")) '获取数据源表名
 bb = Left(shn, Len(shn) - 1)
 bb = Choose(bb, "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二")
 Application.ScreenUpdating = 0 '关闭屏幕刷新
 If shn = False Then Exit Sub '数据源表不存在退出
 With Sheets(shn)
  ArrData = .Range("A3:L" & .Range("A65536").End(xlUp).Row) '读取数据到数组
  For i = 1 To UBound(ArrData)
   Dic(ArrData(i, 2)) = Dic(ArrData(i, 2)) & "," & i + 2 '循环产生字典条目,主要是为了获取每个数据源所在的行号
  Next i
 End With
 With Sheets("通知单")
  .Cells.RowHeight = 22.5 '设置行高
  r = 1
  For j = 1 To 12
   .Columns(j).ColumnWidth = Sheets("样表").Columns(j).ColumnWidth '设置列宽
  Next j
For Each tempk In Dic.keys '遍历字典
    Sheets("样表").Range("A1:L4").Copy '复制样表
    .Range("A" & r & ":L" & r + 3).PasteSpecial Paste:=xlValues '选择性粘贴至目标表
    .Range("A" & r & ":L" & r + 3).PasteSpecial Paste:=xlPasteFormats
    .Range("A" & r) = bb & aa '设置表头
    .Rows(r + 2).RowHeight = 60 '设置行高
    Temparr = Split(Dic(tempk), ",") '分列字典ITEMS成数组
    For j = 1 To UBound(Temparr) '这里要的这是行号,循环一下
     .Rows(r + 2).Insert
     r = r + 1
     .Range("A" & r + 1 & ":L" & r + 1).Value _
        = Sheets(shn).Range("A" & Temparr(j) & ":L" & Temparr(j)).Value '复制相同姓名的各行数据
     .Range("A" & r + 1 & ":L" & r + 1).Borders.LineStyle = 1 '设置边框
    Next j
    r = r + 6
Next
 End With
 aGeSet
 pr
 Application.ScreenUpdating = 1
 Sheets("样表").Activate
End Sub

回复

使用道具 举报

发表于 2010-5-10 23:11 | 显示全部楼层

按F8逐步执行比看我上面的强多了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-9-21 08:57 , Processed in 0.434546 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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