Excel精英培训网

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

[已解决]怎样用VBA写这样的统计表

[复制链接]
发表于 2014-10-14 11:28 | 显示全部楼层 |阅读模式
怎样用VBA写这样的统计表,sheet1和sheet2是可刷新的数据,sheet3表用VBA代码做出统计,而不是用函数公式来统计。另外,sheet1表的数据能有1600多页,用WEB查询一页一页的提取数据是一项很巨大的任务量,能否也帮忙写出用VBA自动提取网页里的数据,提取到sheet1表里。现在附件sheet1表里的数据是我我已经提取了100多页的数据了。
最佳答案
2014-10-15 11:38
可以。我把代码改了一下,sheet2不动,sheet3小改一下,把“涨幅”改为“涨幅↓”就可以了。
附件的代码可以直接移植到全数据表中。

实时大单统计表.rar

1.52 MB, 下载次数: 36

发表于 2014-10-14 13:23 | 显示全部楼层
可能附件太大,我的权限上传不了,传个代码吧。
  1. Sub tt()
  2.     xt = Timer
  3.     Set d = CreateObject("scripting.dictionary")
  4.     Set d1 = CreateObject("scripting.dictionary")
  5.    
  6.     r = Sheet1.Cells(Sheet1.Rows.Count, 1).End(3).Row  '根据Sheet1计算C列到L列
  7.     arr = Sheet1.Range("a1:h" & r)
  8.     For i = 2 To UBound(arr)
  9.         x = arr(i, 1) & arr(i, 7)   '名称+买卖盘性质
  10.         d(x) = d(x) + 1
  11.         d1(x) = d1(x) + arr(i, 5)
  12.     Next
  13.     brr = [a1].CurrentRegion
  14.     ReDim bbrr(1 To UBound(brr) - 1, 1 To 10)
  15.     For i = 2 To UBound(brr)
  16.         x1 = brr(i, 2) & "买盘"
  17.         x2 = brr(i, 2) & "卖盘"
  18.         x3 = brr(i, 2) & "中性盘"
  19.         p = i - 1
  20.         bbrr(p, 1) = d1(x1): bbrr(p, 8) = d(x1)       '买盘数/重复数
  21.         bbrr(p, 2) = d1(x2): bbrr(p, 9) = d(x2)       '卖盘数/重复数
  22.         bbrr(p, 3) = d1(x3): bbrr(p, 10) = d(x3)       '中性盘数/重复数
  23.         s = bbrr(p, 1) + bbrr(p, 2) + bbrr(p, 3): bbrr(p, 4) = s         '总盘数
  24.         If s > 0 Then
  25.             bbrr(p, 5) = bbrr(p, 1) / s          '买占比
  26.             bbrr(p, 6) = bbrr(p, 2) / s        '卖占比
  27.             bbrr(p, 7) = bbrr(p, 3) / s       '中占比
  28.         End If
  29.     Next
  30.     [C2].Resize(p, 10) = bbrr
  31.    
  32.     d.RemoveAll                   '根据Sheet2计算M列到Z列
  33.     r = Sheet2.Cells(Sheet2.Rows.Count, 1).End(3).Row
  34.     arr = Sheet2.Range("a1:ad" & r)
  35.     For i = 3 To UBound(arr)
  36.         Debug.Print i
  37.         For j = 6 To UBound(arr, 2)
  38.            x = Val(arr(i, 2)) & UCase(arr(1, j))
  39.            d(x) = d(x) + Val(arr(i, j))
  40.         Next
  41.     Next
  42.     ReDim crr(1 To UBound(brr) - 1, 1 To UBound(brr, 2))
  43.     For i = 2 To UBound(brr)
  44.         For j = 13 To UBound(brr, 2)
  45.             p = i - 1: q = j - 12
  46.             x = Val(brr(i, 1)) & brr(1, j)
  47.             crr(p, q) = d(x)
  48.         Next
  49.     Next
  50.     [M2].Resize(p, q) = crr
  51.     MsgBox "耗时" & Timer - xt & "秒"
  52. End Sub
复制代码
回复

使用道具 举报

发表于 2014-10-14 13:24 | 显示全部楼层
另外,由于sheet3和sheet2的表头不同,所以要把sheet2的表头参照sheet3的表头改一下。具体见你另一帖子的sheet2,那里的表头已经改好了。
回复

使用道具 举报

 楼主| 发表于 2014-10-15 10:06 | 显示全部楼层
grf1973 发表于 2014-10-14 13:24
另外,由于sheet3和sheet2的表头不同,所以要把sheet2的表头参照sheet3的表头改一下。具体见你另一帖子的sh ...

grf1973老师:按照您的代码,怎么有没参与计算的列呢。我把大部分数据删除了,文件变小了,你看看能上传附件了吧!

实时大单统计表1.rar

618.22 KB, 下载次数: 7

回复

使用道具 举报

发表于 2014-10-15 10:17 | 显示全部楼层
注意sheet2的表头。。。。。。。。如果不改是不能正确汇总的。因为我是按sheet3的表头作汇总的,所以要把sheet2的表头改成可以和sheet3表头相对应。

实时大单统计表1.rar

622 KB, 下载次数: 11

回复

使用道具 举报

 楼主| 发表于 2014-10-15 10:56 | 显示全部楼层
grf1973 发表于 2014-10-15 10:17
注意sheet2的表头。。。。。。。。如果不改是不能正确汇总的。因为我是按sheet3的表头作汇总的,所以要把sh ...

grf1973老师:我明白了,sheet2的表头必须跟sheet3的表头一致才可以!但是,sheet2表是可刷新的表,刷新之后,又变成原来的样子,我还要在重新修改sheet2的表头,您看这样行不行,我把sheet3的表头修改成和sheet2表头的样式一致,这样,我每次刷新完sheet2表后就不用在修改表头了。
回复

使用道具 举报

发表于 2014-10-15 11:38 | 显示全部楼层    本楼为最佳答案   
可以。我把代码改了一下,sheet2不动,sheet3小改一下,把“涨幅”改为“涨幅↓”就可以了。
附件的代码可以直接移植到全数据表中。

test.rar

622.34 KB, 下载次数: 47

回复

使用道具 举报

 楼主| 发表于 2014-10-15 11:38 | 显示全部楼层
grf1973 发表于 2014-10-15 10:17
注意sheet2的表头。。。。。。。。如果不改是不能正确汇总的。因为我是按sheet3的表头作汇总的,所以要把sh ...

grf1973老师,我已经将sheet3表头修改成与sheet2表头一致,顺利成功通过,问题解决了!!!!!!!!!
回复

使用道具 举报

发表于 2014-10-15 11:42 | 显示全部楼层
我估计你改的会有问题的。因为原来代码是通过sheet2的第一行确定的,而第一行内容不唯一(比如有几个“大单”“中单”“小单”,汇总会出错的。7楼代码改过来了,把sheet2的第一行+第二行作为判断条件,就具备唯一性了。
回复

使用道具 举报

 楼主| 发表于 2014-10-15 11:54 | 显示全部楼层
grf1973 发表于 2014-10-15 11:38
可以。我把代码改了一下,sheet2不动,sheet3小改一下,把“涨幅”改为“涨幅↓”就可以了。
附件的代码可 ...

grf1973老师:涨幅要修改,换手率。特大差。大单差。.....等的“率”和“差都要删除”我是不是很聪明呀!经过您的指导和帮助,成功解决了我的问题,计算速度好快,5万多行的数据,还不到2秒钟就计算完毕,要是函数公式的话,至少需要20多分钟,没想到VBA是如此的强大,可以说这个统计表在您的指导下是相当的完美和无暇,在这里,我要给您grf1973老师深深的鞠躬,谢谢您这几日里的指导和帮助,让您费心了,我也不知道是不是因为我耽误您很多的重要事情,如果是的话,在这里向您表示深深的歉意!谢谢您的帮助和指导,谢谢您。我的好grf1973老师!!!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 05:42 , Processed in 0.282766 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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