Excel精英培训网

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

[已解决]难题:请问用vba的for循环能否得到F列的结果

[复制链接]
发表于 2012-12-10 09:44 | 显示全部楼层 |阅读模式
本帖最后由 qhllqhll 于 2012-12-10 09:46 编辑

请问用vba的数组 for循环能否得到F列的结果
请看附件:谢谢各位赐教
附件.rar (3.87 KB, 下载次数: 22)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2012-12-10 10:47 | 显示全部楼层
附件.rar (9.83 KB, 下载次数: 5)

评分

参与人数 1 +3 收起 理由
qhllqhll + 3 很给力!

查看全部评分

回复

使用道具 举报

发表于 2012-12-10 10:55 | 显示全部楼层
  1. Sub 求和()
  2.     Dim arr, i

  3.     arr = Range("c3").CurrentRegion
  4.     Dim irow
  5.     Dim iSum
  6.     Dim startRow
  7.     For i = LBound(arr) + 1 To UBound(arr)
  8.         If Len(arr(i, 1)) > 0 Then
  9.             startRow = i
  10.         End If
  11.         iSum = iSum + Abs(arr(i, 2) - arr(i, 3))
  12.         If i = UBound(arr) Then arr(startRow, 4) = iSum: Exit For
  13.         If Len(arr(i + 1, 1)) > 0 Then
  14.             arr(startRow, 4) = iSum
  15.             iSum = 0
  16.             startRow = 0
  17.         End If
  18.     Next
  19.     Range("c3").Resize(UBound(arr), UBound(arr, 2)) = arr
  20. End Sub
复制代码

评分

参与人数 2 +6 收起 理由
qhllqhll + 3 很给力!
从从容容 + 3 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2012-12-10 17:12 | 显示全部楼层
本帖最后由 qhllqhll 于 2012-12-12 09:54 编辑

首先感谢两位的辛勤赐教:经测试 当e20:e23为空时 3楼的代码在空行区后面的计算有误,还请各位老师抽空帮我看看有没有更简便的代码,最好在每句代码的后面加上注释
见附件
谢谢
附件2.rar (9.93 KB, 下载次数: 7)
回复

使用道具 举报

 楼主| 发表于 2012-12-11 08:01 | 显示全部楼层
风化石 发表于 2012-12-10 10:47

非常感谢您的赐教:
不好意思:还有点小问题
见4楼附件
回复

使用道具 举报

 楼主| 发表于 2012-12-11 08:02 | 显示全部楼层
hwc2ycy 发表于 2012-12-10 10:55

非常感谢您的赐教:
不好意思:还有点小问题
见4楼附件
回复

使用道具 举报

发表于 2012-12-11 08:31 | 显示全部楼层
那两行空单元格,你要求结果等于多少?
回复

使用道具 举报

发表于 2012-12-11 08:33 | 显示全部楼层
  1. Sub 求和()
  2.     Dim arr, i
  3.     arr = Range("c3").CurrentRegion
  4.     Dim irow
  5.     Dim iSum
  6.     Dim startRow
  7.     For i = LBound(arr) + 1 To UBound(arr)
  8.         If Len(arr(i, 2)) = 0 Or Len(arr(i, 3)) = 0 Then GoTo 0
  9.         If Len(arr(i, 1)) > 0 Then
  10.             startRow = i
  11.         End If
  12.         iSum = iSum + Abs(arr(i, 2) - arr(i, 3))
  13.         If i = UBound(arr) Then arr(startRow, 4) = iSum: Exit For
  14.         If Len(arr(i + 1, 1)) > 0 Then
  15.             arr(startRow, 4) = iSum
  16.             iSum = 0
  17.             startRow = 0
  18.         End If
  19. 0:
  20.     Next
  21.     Range("c3").Resize(UBound(arr), UBound(arr, 2)) = arr
  22. End Sub
复制代码
回复

使用道具 举报

发表于 2012-12-11 08:39 | 显示全部楼层
  1. Sub 求和()
  2.     Dim arr, i
  3.     arr = Range("c3").CurrentRegion     '取C3区域
  4.     Dim iSum                            '求和
  5.     Dim startRow                        '开始行标记
  6.     For i = LBound(arr) + 1 To UBound(arr)
  7.         '如果有单元格为空,则跳过计算过程
  8.         If Len(arr(i, 2)) = 0 Or Len(arr(i, 3)) = 0 Then GoTo 0
  9.         If Len(arr(i, 1)) > 0 Then  '如果C列单元格不为空,则标志着一轮求和开始
  10.             startRow = i            '要写入求和的行号(此处是数组,则是数组的一维坐标)
  11.         End If
  12.         iSum = iSum + Abs(arr(i, 2) - arr(i, 3))    '累加求和,D列减去E列,取绝对值
  13.         If i = UBound(arr) Then arr(startRow, 4) = iSum: Exit For
  14.         '如果到达数据最后一行则写入累加数据,退出循环
  15.         
  16.         '判断下一行是否有数据标志,如果有,则此轮求和结束
  17.         If Len(arr(i + 1, 1)) > 0 Then
  18.             arr(startRow, 4) = iSum     '写入求和
  19.             iSum = 0                    '清零
  20.             startRow = 0                '清零
  21.         End If
  22. 0:
  23.     Next
  24.     Range("c3").Resize(UBound(arr), UBound(arr, 2)) = arr
  25.     '把计算好的数据回写入单元格
  26. End Sub
复制代码

评分

参与人数 1 +3 收起 理由
qhllqhll + 3 非常感谢:

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2012-12-11 08:49 | 显示全部楼层
hwc2ycy 发表于 2012-12-11 08:39

您好:为何提示 “下标越界”啊?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 01:38 , Processed in 0.583662 second(s), 23 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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