看签名 粗看了一下,大致注了一下,希望对你有帮助: 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
|