Excel精英培训网

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

[已解决]汇总问题, 代码优化

[复制链接]
发表于 2017-4-8 15:30 | 显示全部楼层 |阅读模式
本帖最后由 kmcla 于 2017-4-10 14:53 编辑

好烦啊,用了一天时间,代码有点长,感觉问题难度和长度不批配,比这问题大的都没用这么长
最佳答案
2017-4-10 10:40
  1. Sub 生成()
  2.     Dim sh As Worksheet, CopyRng As Range
  3.     Set d = CreateObject("scripting.dictionary")
  4.     Set sh = Worksheets("单位")
  5.     sh.Range("b4,e4,b9:g28,a9") = ""
  6.     sh.Rows("51:1000").Delete
  7.     Set CopyRng = sh.Range("a1:g32")
  8.     With Sheets("分部")
  9.         For i = 5 To .[a65536].End(3).Row Step 50
  10.             lx = .Cells(i, "D") '路线
  11.             If Len(lx) > 0 Then d(lx) = d(lx) & "," & i
  12.         Next
  13.         If d.Count = 0 Then Exit Sub
  14.         For Each lx In d.keys
  15.             r = k * 50 + 1
  16.             If k >= 1 Then CopyRng.Copy sh.Cells(r, 1)
  17.             sh.Cells(r + 3, 2) = lx
  18.             xrr = Split(d(lx), ",")
  19.             n = 0: zgc = ""
  20.             For i = 1 To UBound(xrr)
  21.                 r0 = xrr(i)
  22.                 gc = .Cells(r0, "E")     '工程名称
  23.                 zgc = zgc & "-" & gc   '把所有工程用“-”联起来
  24.                 fs = Application.WorksheetFunction.Average(.Range(.Cells(r0 + 5, 3), .Cells(r0 + 5, 3).End(xlDown)))    '平均分
  25.                 n = n + 1
  26.                 sh.Cells(r + n + 7, 2) = gc
  27.                 sh.Cells(r + n + 7, 3) = fs
  28.             Next
  29.             gcrr = Split(zgc, "-")
  30.             sh.Cells(r + 3, 5) = gcrr(1) & "-" & gcrr(UBound(gcrr))   '工程起点--止点
  31.             k = k + 1
  32.         Next
  33.     End With
  34. End Sub
复制代码

工要在地 - 副本 (2).rar

34.45 KB, 下载次数: 6

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2017-4-10 10:40 | 显示全部楼层    本楼为最佳答案   
  1. Sub 生成()
  2.     Dim sh As Worksheet, CopyRng As Range
  3.     Set d = CreateObject("scripting.dictionary")
  4.     Set sh = Worksheets("单位")
  5.     sh.Range("b4,e4,b9:g28,a9") = ""
  6.     sh.Rows("51:1000").Delete
  7.     Set CopyRng = sh.Range("a1:g32")
  8.     With Sheets("分部")
  9.         For i = 5 To .[a65536].End(3).Row Step 50
  10.             lx = .Cells(i, "D") '路线
  11.             If Len(lx) > 0 Then d(lx) = d(lx) & "," & i
  12.         Next
  13.         If d.Count = 0 Then Exit Sub
  14.         For Each lx In d.keys
  15.             r = k * 50 + 1
  16.             If k >= 1 Then CopyRng.Copy sh.Cells(r, 1)
  17.             sh.Cells(r + 3, 2) = lx
  18.             xrr = Split(d(lx), ",")
  19.             n = 0: zgc = ""
  20.             For i = 1 To UBound(xrr)
  21.                 r0 = xrr(i)
  22.                 gc = .Cells(r0, "E")     '工程名称
  23.                 zgc = zgc & "-" & gc   '把所有工程用“-”联起来
  24.                 fs = Application.WorksheetFunction.Average(.Range(.Cells(r0 + 5, 3), .Cells(r0 + 5, 3).End(xlDown)))    '平均分
  25.                 n = n + 1
  26.                 sh.Cells(r + n + 7, 2) = gc
  27.                 sh.Cells(r + n + 7, 3) = fs
  28.             Next
  29.             gcrr = Split(zgc, "-")
  30.             sh.Cells(r + 3, 5) = gcrr(1) & "-" & gcrr(UBound(gcrr))   '工程起点--止点
  31.             k = k + 1
  32.         Next
  33.     End With
  34. End Sub
复制代码

工要在地 - 副本 (2).rar

41.2 KB, 下载次数: 14

回复

使用道具 举报

 楼主| 发表于 2017-4-10 14:52 | 显示全部楼层

比我的快,我的短暂假死。
我好好研究下,我以前编的,有好多这类问题,都是用多次计算的笨办法
回复

使用道具 举报

 楼主| 发表于 2017-4-10 15:12 | 显示全部楼层

Set CopyRng = sh.Range("a1:g50")
If k >= 1 Then CopyRng.Copy sh.Rows(r)
这种复制,改变了行高,我隐藏起来的单元行,变成不隐藏了
能不能完全按第一组复制
我得复制几干个
问你问题时我想到了,改成这样。
Set CopyRng = sh.Rows("1:50")
你复制这招,比我好多了
我能大大地简化了。

回复

使用道具 举报

发表于 2017-8-11 10:55 | 显示全部楼层
学习了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 06:18 , Processed in 0.302606 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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