求一段宏,把表中某人的多项数据写到新表中的一个格子里

qq-dabins 2010-10-11 01:36:49
举个例子,原始excel表是这样的(真正原始表里的数据是不确定的记录行数更多,有更多的人):

续保日期 用户名 金额

2010-1-15 李陆 2000
2010-1-16 李陆 2500
2010-2-10 李陆 2000
2010-2-12 赵嘉 3000
2010-2-18 赵嘉 3500
2010-3-16 赵嘉 2000
2010-3-19 赵嘉 1000
2010-3-26 王强 2000
2010-3-30 王强 1500


需要一段宏,执行后生成如下这样的一张表,即把一个人的续保金额都写入一个格子里,用正斜杠分开,然后算出总续保额。

续保人 续保金额 总额

李陆 2000/2500/2000 6500
赵嘉 3000/3500/2000/1000 9500
王强 2000/1500 3500




...全文
78 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq-dabins 2010-10-16
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20101016/10/335b9e1d-aeca-4ab7-88d4-ccdfe9c66f46.html?18008
出异常了。
qq-dabins 2010-10-16
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20101016/10/335b9e1d-aeca-4ab7-88d4-ccdfe9c66f46.html?54313
yaminor 2010-10-16
  • 打赏
  • 举报
回复
vvvvvvvvvvvvvvvvvvvvvvv
qq-dabins 2010-10-16
  • 打赏
  • 举报
回复
结的时候出问题了,分没给上。在这个帖子给补上吧。
http://topic.csdn.net/u/20101016/10/335b9e1d-aeca-4ab7-88d4-ccdfe9c66f46.html?54313
qq-dabins 2010-10-16
  • 打赏
  • 举报
回复
结的时候出问题了,分没给上。在这个帖子给补上吧。
http://topic.csdn.net/u/20101016/10/335b9e1d-aeca-4ab7-88d4-ccdfe9c66f46.html?54313
qq-dabins 2010-10-16
  • 打赏
  • 举报
回复
结的时候出问题了,分没给上。在这个帖子给补上吧。
http://topic.csdn.net/u/20101016/10/335b9e1d-aeca-4ab7-88d4-ccdfe9c66f46.html?54313
ZenRoi 2010-10-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dabins 的回复:]
太谢谢您了。结帖了。
[/Quote]
你牛,结贴了也不给分?
^_^
ZenRoi 2010-10-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dabins 的回复:]
太谢谢您了。结帖了。
[/Quote]
你牛,结贴也不给分?
^_^
ZenRoi 2010-10-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dabins 的回复:]
太谢谢您了。结帖了。
[/Quote]
你牛,结贴也不给分?
^_^
qq-dabins 2010-10-16
  • 打赏
  • 举报
回复
太谢谢您了。结帖了。
ZenRoi 2010-10-16
  • 打赏
  • 举报
回复
1.
[A65536].End(3) 是指A列最后一个非空单元格,3是方位代码xlUp
[A65536].End(3)(1, 3) 表示[A65536].End(3).Resize(0,2)

2.
遍历Arr时,为什么是从下标1开始的,而不是0?
Arr取单元格区域范围,默认下标从1开始。

3.
Dim Dic As Object 是不是也能写成 Dim Dic 不限定类型?
可以吧,但显然预指定类型比较合理。

4.
Sheets(2).[A65536].End(3)(2).Resize(1, 3) = Dic(itm)
这里的(2)即Offset(1,0).
字典的值在这里是一维数组,可以直接写入区域单元范围之内。

5. Set Dic = Nothing
如你所说,用以释放内存空间。
ZenRoi 2010-10-16
  • 打赏
  • 举报
回复
1.
[A65536].End(3) 是指A列最后一个非空单元格,3是方位代码xlUp
[A65536].End(3)(1, 3) 表示[A65536].End(3).Resize(0,2)

2.
遍历Arr时,为什么是从下标1开始的,而不是0?
Arr取单元格区域范围,默认下标从1开始。

3.
Dim Dic As Object 是不是也能写成 Dim Dic 不限定类型?
可以吧,但显然预指定类型比较合理。

4.
Sheets(2).[A65536].End(3)(2).Resize(1, 3) = Dic(itm)
这里的(2)即Offset(1,0).
字典的值在这里是一维数组,可以直接写入区域单元范围之内。

5. Set Dic = Nothing
如你所说,用以释放内存空间。
luara2008 2010-10-15
  • 打赏
  • 举报
回复
ccccccccccccc
qq-dabins 2010-10-15
  • 打赏
  • 举报
回复
非常感谢,很完美的实现了要求。因为刚开始学vba,还有几个看不懂的地方想请问下.

1.
[A65536].End(3) 是不是代表最后一行的第三个格子, 那
[A65536].End(3)(1, 3)表示什么?

2.
遍历Arr时,为什么是从下标1开始的,而不是0?

3.
Dim Dic As Object 是不是也能写成 Dim Dic 不限定类型?

4. 同样是end的用法,这句也不明白
Sheets(2).[A65536].End(3)(2).Resize(1, 3) = Dic(itm)

5. Set Dic = Nothing
这句是为了释放内存么?
ZenRoi 2010-10-11
  • 打赏
  • 举报
回复


Sub GetSums()
Dim Dic As Object, Arr, Ary, k%

Arr = Range("A2", [A65536].End(3)(1, 3))
Set Dic = CreateObject("Scripting.Dictionary")
For k = 1 To UBound(Arr)
If Not Dic.exists(Arr(k, 2)) Then
Ary = Array(Arr(k, 2), Arr(k, 3), Arr(k, 3))
Else
Ary = Dic(Arr(k, 2))
Ary(1) = Ary(1) & "/" & Arr(k, 3)
Ary(2) = Ary(2) + Arr(k, 3)
End If
Dic(Arr(k, 2)) = Ary
Next

Sheets(2).[A1].Resize(1, 3) = Array("续保人", "续保金额", "总额")
For Each itm In Dic
Sheets(2).[A65536].End(3)(2).Resize(1, 3) = Dic(itm)
Next
Set Dic = Nothing
End Sub

5,139

社区成员

发帖
与我相关
我的任务
社区描述
其他开发语言 Office开发/ VBA
社区管理员
  • Office开发/ VBA社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧