Excel精英培训网

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

[已解决]统计不同元素的个数,数组添加时没有结果

[复制链接]
发表于 2014-6-9 23:10 | 显示全部楼层 |阅读模式
本帖最后由 f1red88 于 2014-6-10 14:39 编辑

请教不用Application.Transpose方法输出统计的数和每个数的个数
第一位从1-5里选出1个数,第二位从1-10选出1个数并是奇数,
当二位符合奇数时,输出第一位和第二位的和,
统计和的数和每个数的个数
  1. Sub duib()
  2.     Dim x, y As Integer
  3.     Dim array1(1 To 51, 1 To 1) As Long
  4.     Set d = CreateObject("scripting.dictionary")
  5.     For x = 1 To 5
  6.        For y = 1 To 10
  7.        If x Mod 2 = 1 Then
  8.         xt = xt + 1
  9.          array1(xt, 1) = y + x
  10.          d(array1(xt, 1)) = d(array1(xt, 1)) + 1
  11.         End If
  12.        Next
  13.     Next
  14.    

  15.     [A1].Resize(25, 1) = array1
  16.     [c7].Resize(1, 2) = Array("相同元素", "出现次数")
  17.     [c8].Resize(d.Count, 1) = Application.Transpose(d.keys)
  18.     [d8].Resize(d.Count, 1) = Application.Transpose(d.items)
  19. End Sub
复制代码
输出结果:

2
3
4
5
6
7
8
相同元素出现次数
9
2
1
10
3
1
11
4
2
4
5
2
5
6
3
6
7
3
7
8
3
8
9
3
9
10
3
10
11
3
11
12
2
12
13
2
13
14
1
6
7
8
9
10
最佳答案
2014-6-10 11:53
代码请测试,是完全按照你原有的功能改编的,如果数据结果有误,也是原来的代码缺陷
造成的,因为我不知道你到底需要什么。
  1. Sub duib()
  2. Dim x&, y&, array1(1 To 51, 1 To 1) As Long, brr(1 To 51, 1 To 2), d As Object, r&
  3. r = 1
  4. brr(1, 1) = "相同元素": brr(1, 2) = "出现次数"
  5. Set d = CreateObject("scripting.dictionary")
  6. For x = 1 To 5
  7.   For y = 1 To 10
  8.     If x Mod 2 = 1 Then
  9.       xt = xt + 1
  10.       array1(xt, 1) = y + x
  11.       If Not d.exists(array1(xt, 1)) Then
  12.         r = r + 1
  13.         brr(r, 1) = array1(xt, 1)
  14.         brr(r, 2) = 1
  15.         d(array1(xt, 1)) = r
  16.       Else
  17.         brr(d(array1(xt, 1)), 2) = brr(d(array1(xt, 1)), 2) + 1
  18.       End If
  19.     End If
  20.   Next
  21. Next
  22. [A1].Resize(25, 1) = array1
  23. [c7].Resize(d.Count, 2) = brr
  24. End Sub
复制代码

统计.rar

10.49 KB, 下载次数: 4

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-6-9 23:33 | 显示全部楼层
你把字典的keys(相当于1维数组)当作ms的一个元素赋值,
又想直接输出至工作表,这就是错误原因。
第2段代码内,我连建立ms数组的用意都没看明白,直接把字典keys赋值给单元格区域不就行了。
还有,你怎么能事先知道d.count不会大于15?
问题有点多,基础注意一下
回复

使用道具 举报

发表于 2014-6-9 23:42 | 显示全部楼层
这样改一下
[c8].Resize(15, 1) = ms(t, 1)
至少你能看到某些结果出来。
回复

使用道具 举报

 楼主| 发表于 2014-6-10 04:02 | 显示全部楼层
大灰狼1976 发表于 2014-6-9 23:42
这样改一下
[c8].Resize(15, 1) = ms(t, 1)
至少你能看到某些结果出来。

我想把统计结果传递给数组怎么实现
回复

使用道具 举报

发表于 2014-6-10 08:35 | 显示全部楼层
本帖最后由 FnG 于 2014-6-10 08:37 编辑
f1red88 发表于 2014-6-10 04:02
我想把统计结果传递给数组怎么实现

直接ms= Application.Transpose(d.keys)

忘了说了,你前面ms就不要定义为数组了,定义为变体
回复

使用道具 举报

发表于 2014-6-10 10:52 | 显示全部楼层
你这样把统计结果传递给数组跟直接输出到单元格区域已经没有多少区别了,
同样要用到transpose。
应该在生成数据的前期就借用字典直接把每次的结果赋值给二维数组,
处理结束后把二维数组输出至单元格区域,这样速度保证了,也不会用到
transpose转置。
回复

使用道具 举报

 楼主| 发表于 2014-6-10 11:28 | 显示全部楼层
大灰狼1976 发表于 2014-6-10 10:52
你这样把统计结果传递给数组跟直接输出到单元格区域已经没有多少区别了,
同样要用到transpose。
应该在生 ...

你的方法不错,不知道在呢么不用application.tanspose,直接输出给数组
回复

使用道具 举报

发表于 2014-6-10 11:53 | 显示全部楼层    本楼为最佳答案   
代码请测试,是完全按照你原有的功能改编的,如果数据结果有误,也是原来的代码缺陷
造成的,因为我不知道你到底需要什么。
  1. Sub duib()
  2. Dim x&, y&, array1(1 To 51, 1 To 1) As Long, brr(1 To 51, 1 To 2), d As Object, r&
  3. r = 1
  4. brr(1, 1) = "相同元素": brr(1, 2) = "出现次数"
  5. Set d = CreateObject("scripting.dictionary")
  6. For x = 1 To 5
  7.   For y = 1 To 10
  8.     If x Mod 2 = 1 Then
  9.       xt = xt + 1
  10.       array1(xt, 1) = y + x
  11.       If Not d.exists(array1(xt, 1)) Then
  12.         r = r + 1
  13.         brr(r, 1) = array1(xt, 1)
  14.         brr(r, 2) = 1
  15.         d(array1(xt, 1)) = r
  16.       Else
  17.         brr(d(array1(xt, 1)), 2) = brr(d(array1(xt, 1)), 2) + 1
  18.       End If
  19.     End If
  20.   Next
  21. Next
  22. [A1].Resize(25, 1) = array1
  23. [c7].Resize(d.Count, 2) = brr
  24. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2014-6-10 12:10 | 显示全部楼层
大灰狼1976 发表于 2014-6-10 11:53
代码请测试,是完全按照你原有的功能改编的,如果数据结果有误,也是原来的代码缺陷
造成的,因为我不知道 ...

请看下输出结果
字典在数据小的情况下会慢,有比字典好的方法吗,统计一组数里,不同数出现的个数
回复

使用道具 举报

发表于 2014-6-10 12:50 | 显示全部楼层
数据小的时候字典比较慢,这个结论不知你从哪里得来的,
即使是正确的,你也说了“数据小”,差个0.0几秒你很在意。
反而应该考虑大数据时的速度。
不同的使用场合数组和字典的速度是不能相比较的,这要看怎么应用。
以前看到过类似要求的纯数组解决方法,但是比较复杂,我是没兴趣的。
你可以BAIDU下。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 09:36 , Processed in 0.320862 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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