Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: qhllqhll

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

[复制链接]
发表于 2012-12-11 09:17 | 显示全部楼层
qhllqhll 发表于 2012-12-11 08:49
您好:为何提示 “下标越界”啊?

你截个图来看吧,是不是把F列的内容先清空了?
回复

使用道具 举报

发表于 2012-12-11 09:17 | 显示全部楼层
qhllqhll 发表于 2012-12-11 08:49
您好:为何提示 “下标越界”啊?

你截个图来看吧,是不是把F列的内容先清空了?
我这运行没问题。
回复

使用道具 举报

 楼主| 发表于 2012-12-11 09:25 | 显示全部楼层
hwc2ycy 发表于 2012-12-11 09:17
你截个图来看吧,是不是把F列的内容先清空了?
我这运行没问题。

当f列全部清空时(在f3也为空时)出现的 下标越界
回复

使用道具 举报

发表于 2012-12-11 09:30 | 显示全部楼层
肯定的,我改下吧代码吧。
回复

使用道具 举报

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

评分

参与人数 1 +3 收起 理由
qhllqhll + 3 优秀作品

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2012-12-11 09:38 | 显示全部楼层
hwc2ycy 发表于 2012-12-11 09:34

非常感谢 完全正确
回复

使用道具 举报

 楼主| 发表于 2012-12-11 09:57 | 显示全部楼层
hwc2ycy 发表于 2012-12-11 09:34

还有一个问题:当e5小于d5时 不应该计算(或应该是负值),现在代码的结果为差的正值
麻烦您看看
回复

使用道具 举报

发表于 2012-12-11 10:01 | 显示全部楼层
你的要求还真多啊。
回复

使用道具 举报

发表于 2012-12-11 10:05 | 显示全部楼层
E列大于等于D列才参与运算是吧?
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 10:29 , Processed in 0.302763 second(s), 8 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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