Excel精英培训网

 找回密码
 注册
查看: 8296|回复: 29

[习题] 练习(一)12.11:求和【已开贴】

  [复制链接]
发表于 2011-12-11 21:20 | 显示全部楼层 |阅读模式
本帖最后由 wcymiss 于 2011-12-13 14:00 编辑

快开课了,是不是来个热身?

QQ截图未命名.png

题目说明:
1、如图,A、B、C列均为数字或空,数据从A1开始,要求对以空行分隔的区域按列分别求和。
2、每行要么都是数字,要么都是空。不会出现空和数字的混合。
3、空行不一定只空一行。
3、结果放在F:H列的每块连续数字区域的第一行里。如模拟效果所示。
4、数据很多,请勿直接引用"A1:C7"。
5、不得在循环内出现单元格操作。
Book11.rar (2.89 KB, 下载次数: 79)

点评

谢谢出题,不过我评不了分。  发表于 2011-12-12 09:27

评分

参与人数 5 +100 收起 理由
白开水的微笑 + 40 很给力!
?﹎尐蜻蜓.o0 + 3 赞一个!
csmctjg + 15 赞一个!
JLxiangwei + 30 很给力!
windimi007 + 12 很给力!

查看全部评分

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2011-12-11 22:22 | 显示全部楼层
试一个
  1. Sub Xsum()
  2. Dim rng As Range, area As Range
  3. Dim arr
  4. Dim i As Long, cnt As Long, j As Integer
  5. Set rng = Range(Cells(1, 1), Cells([C65536].End(3).Row, 3))
  6. arr = rng.Cells
  7. For i = UBound(arr) To 2 Step -1
  8.   If arr(i - 1, 1) <> "" Then
  9.    For j = 1 To 3
  10.     arr(i - 1, j) = arr(i - 1, j) + arr(i, j)
  11.     arr(i, j) = ""
  12.    Next
  13.   End If
  14.   Next
  15.   rng.Offset(0, 5) = arr
  16. End Sub
复制代码

评分

参与人数 3 +29 收起 理由
CheryBTL + 18
snowangel007 + 1 很给力!
wcymiss + 10 效率!比我的好!

查看全部评分

回复

使用道具 举报

发表于 2011-12-11 22:28 | 显示全部楼层
本帖最后由 Benol 于 2011-12-12 10:05 编辑

突然发现吴姐为我开了后门了,哈哈,那就再发一个

  1. Sub Xsum()
  2. Dim rng As Range, area As Range
  3. Set rng = Range("A:C").SpecialCells(xlCellTypeConstants, 1)
  4. For Each area In rng.Areas
  5.   arr = area.Cells
  6.   For i = 1 To 3
  7.   arr(1, i) = WorksheetFunction.Sum(Application.Index(arr, , i))
  8.   area.Rows(1).Offset(0, 5) = arr
  9.   Next
  10. Next
  11. End Sub
复制代码



ps: 经吴姐启发,发现SpecialCells方法有局限。
1. 数据量大的时候,效率很低。不论是手工还是VBA,它都很慢。
2. 以上面代码为例,rng源于SpecialCells方法,当rng.areas.count>=8192 (注:8192=2^13)时,将不能返回正确结果。同样的,即便是手工操作定位功能,也不能一次性定位8192个及以上area(姑且就叫area,你们知道我所指,嘿嘿)

点评

SpecialCells是不是有行数限制?用6万数据测试,areas里面只有1个area了。 代码比较耗时,是2楼的50倍。  发表于 2011-12-11 23:04

评分

参与人数 1 +10 收起 理由
wcymiss + 10 多谢分享知识点,学习了

查看全部评分

回复

使用道具 举报

发表于 2011-12-11 22:47 | 显示全部楼层
本帖最后由 wcymiss 于 2011-12-11 22:55 编辑

Book11.zip (13.46 KB, 下载次数: 10)

点评

当有多个空行时,求和里会有0值出现。请看题目说明的第3点:空行不一定只空一行。  发表于 2011-12-11 23:14
回复

使用道具 举报

发表于 2011-12-11 23:36 | 显示全部楼层
本帖最后由 wcymiss 于 2011-12-11 23:41 编辑

Book11.zip (76.84 KB, 下载次数: 2)

评分

参与人数 1 +10 收起 理由
wcymiss + 10 ok,这会对了,代码很效率,赞一个!

查看全部评分

回复

使用道具 举报

发表于 2011-12-12 09:15 | 显示全部楼层

  1. Sub 习题()
  2. Dim i As Long, j As Byte, m As Long, arr, brr(1 To 60000, 1 To 3)
  3. arr = Range("A1: C" & [A65536].End(xlUp).Row + 1)
  4. For i = 1 To UBound(arr)
  5.     m = i
  6.     While arr(i, 1) <> ""
  7.         For j = 1 To 3
  8.             brr(m, j) = brr(m, j) + arr(i, j)
  9.         Next j
  10.         i = i + 1
  11.     Wend
  12. Next i
  13. [F1].Resize(UBound(arr), 3) = brr
  14. End Sub
复制代码

评分

参与人数 1 +10 收起 理由
wcymiss + 10 赞,速度很快。

查看全部评分

回复

使用道具 举报

发表于 2011-12-12 09:21 | 显示全部楼层

  1. Sub lee()
  2. Dim arr, brr()
  3. arr = ActiveSheet.UsedRange
  4. ReDim brr(1 To UBound(arr, 1), 1 To UBound(arr, 2))

  5. For i = 1 To UBound(arr)
  6.     If arr(i, 1) <> "" Then
  7.         For j = 1 To UBound(arr, 2)
  8.             brr(x + 1, j) = brr(x + 1, j) + arr(i, j)
  9.         Next j
  10.     Else
  11.         x = i
  12.     End If
  13. Next i

  14. ActiveSheet.[f1].Resize(UBound(brr, 1), UBound(brr, 2)) = brr

  15. End Sub
复制代码

评分

参与人数 1 +10 收起 理由
wcymiss + 10 赞一个!效率!

查看全部评分

回复

使用道具 举报

发表于 2011-12-12 09:26 | 显示全部楼层
  1. Sub huizong()
  2.     Dim arr, brr(), x&, k&, r&, t
  3.     t = Timer
  4.     r = Cells(Rows.Count, 1).End(3).Row
  5.     arr = Range("a1", Cells(r, 3))
  6.     ReDim brr(1 To r, 1 To 3)
  7.     k = 1
  8.     For x = 1 To r
  9.         If Len(arr(x, 1)) Then
  10.             brr(k, 1) = brr(k, 1) + arr(x, 1)
  11.             brr(k, 2) = brr(k, 2) + arr(x, 2)
  12.             brr(k, 3) = brr(k, 3) + arr(x, 3)
  13.             Else: k = x + 1
  14.         End If
  15.     Next x
  16.     Range("f:h").Clear
  17.     Range("f1").Resize(r, 3) = brr
  18.     MsgBox Timer - t
  19. End Sub
复制代码
如果我写的话,和乐满地的思路应该一样。

评分

参与人数 1 +10 收起 理由
wcymiss + 10 也很快,谢谢支持。

查看全部评分

回复

使用道具 举报

发表于 2011-12-12 10:53 | 显示全部楼层
本帖最后由 JLxiangwei 于 2011-12-12 10:54 编辑

Sub text()
    Dim arr, arr1(1 To 60000, 1 To 3), x As Long, y As Long, z As Long, m As Long, t
    t = Timer
    x = Range("a65536").End(xlUp).Row
    arr = Range("a1:c" & x)
    m = 1
    For y = 1 To x
        If arr(y, 1) <> "" Then
            For z = 1 To 3
                arr1(m, z) = arr1(m, z) + arr(y, z)
            Next z
        Else
            m = y + 1
        End If
    Next y
    Range("f1").Resize(60000, 3) = arr1
    t = Timer - t
    MsgBox t
End Sub

评分

参与人数 1 +10 收起 理由
wcymiss + 10 很给力!非常快!

查看全部评分

回复

使用道具 举报

发表于 2011-12-12 11:33 | 显示全部楼层
交练习喽!{:3512:}

  1. Sub aa()
  2.     Dim arr
  3.     Dim i&, j&, k%
  4.     arr = Range("A1:C" & Cells(Rows.Count, 1).End(3).Row + 1)
  5.     For i = 1 To UBound(arr) - 1
  6.         j = i
  7.         If arr(i, 1) = "" Then GoTo 7
  8.         Do Until arr(i + 1, 1) = ""
  9.             i = i + 1
  10.             For k = 1 To 3
  11.                 arr(j, k) = arr(j, k) + arr(i, k)
  12.                 arr(i, k) = ""
  13.             Next k
  14.         Loop
  15. 7:
  16.     Next i
  17.     Range("E1").Resize(UBound(arr), 3) = arr
  18. End Sub
复制代码

60000数据的模拟附件.rar

393.2 KB, 下载次数: 16

评分

参与人数 1 +10 收起 理由
wcymiss + 10 不错!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 10:34 , Processed in 0.332451 second(s), 21 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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