ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: lovelfg

[求助] 讨论一个有趣的统计问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-8-9 15:19 | 显示全部楼层
  1. Sub tj()
  2.     arr = [a1].CurrentRegion
  3.     Set d = CreateObject("scripting.dictionary")
  4.     Dim brr(100001 To 100100, 1 To 10)
  5.     For i = 2 To UBound(arr)
  6.         brr(arr(i, 1), 1) = arr(i, 2)
  7.     Next
  8.     For j = 7 To 11 Step 2
  9.         arr = Cells(1, j).CurrentRegion
  10.         c = (j - 3) / 2
  11.         For i = 2 To UBound(arr)
  12.             brr(arr(i, 1), c) = 1
  13.         Next
  14.     Next
  15.    
  16.     For i = LBound(brr) To UBound(brr)
  17.         lx = brr(i, 1)
  18.         If brr(i, 2) = 1 Then d("一号桌" & lx) = d("一号桌" & lx) + 1
  19.         If brr(i, 3) = 1 Then d("二号桌" & lx) = d("二号桌" & lx) + 1
  20.         If brr(i, 4) = 1 Then d("三号桌" & lx) = d("三号桌" & lx) + 1
  21.         If brr(i, 2) + brr(i, 3) + brr(i, 4) = 3 Then
  22.             d("一二三号桌" & lx) = d("一二三号桌" & lx) + 1
  23.         ElseIf brr(i, 2) + brr(i, 3) + brr(i, 4) = 2 Then
  24.             If brr(i, 2) + brr(i, 3) = 2 Then d("一二号桌" & lx) = d("一二号桌" & lx) + 1
  25.             If brr(i, 2) + brr(i, 4) = 2 Then d("一三号桌" & lx) = d("一三号桌" & lx) + 1
  26.             If brr(i, 3) + brr(i, 4) = 2 Then d("二三号桌" & lx) = d("二三号桌" & lx) + 1
  27.         End If
  28.     Next
  29.     For Each x In d.keys
  30.         s = s & Chr(10) & x & ":" & d(x) & "人"
  31.     Next
  32.     MsgBox Mid(s, 2)
  33. End Sub
复制代码
QQ截图20180809151617.png

桌号分配统计.rar

19.5 KB, 下载次数: 5

TA的精华主题

TA的得分主题

发表于 2018-8-9 15:25 | 显示全部楼层
规则不同时,统计结果会有较大差异:


Pic.png

TA的精华主题

TA的得分主题

发表于 2018-8-9 15:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
还有一种可能(第二个问题),和数为100,因为前面3个字典做过去重,所以结果可能有问题,不做去重的结果:

不参加桌3类客人分别为:6,8,16
一号桌3类客人分别为:2,2,6
二号桌3类客人分别为:3,2,12
三号桌3类客人分别为:3,6,17
一二号桌3类客人分别为:1,0,1
一三号桌3类客人分别为:2,1,2
二三号桌3类客人分别为:2,2,4
一二三号桌3类客人分别为:1,1,0

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-8-9 17:03 | 显示全部楼层
写了个代码,只用1个字典,反复计算解决,实际代码还是挺复杂的。

算法过程:
1. 根据【编码-类型】关系数据表, 写入字典
2. 根据【编码-桌号】关系数据表, 得到不重复桌号,也写入字典
3. 并同时根据桌号、展开计算各种桌号的全部可能组合 → 如果桌号数量增加,各种组合的总数飞速上升 (=2^n-1)
4. 再次根据【编码-桌号】关系数据表,得到不重复的【编码-桌号-类型】结果数据
5. 并同时生成不重复的【编码-桌号】关系展开表
6. 最后根据【编码-桌号】关系展开表,整理统计【不重复编号-桌号 对应的 类型统计结果】
7. 过程中需同时根据【编码-桌号】统计展开为各种桌号组合,才能正取统计向下覆盖的结果
最后输出统计结果。

代码写的有点复杂了。但是,是比较通用的算法,即关系类型、桌号种类怎么改名称、增加种类数量都可以处理。
而SQL语句往往需要事先写好条件。当条件变化,代码要重新写了。
当桌号增加时,更是不能简单处理了。


桌号分配统计.zip

28.11 KB, 下载次数: 2

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-9 17:06 | 显示全部楼层
香川群子 发表于 2018-8-9 14:42
问一个问题:
桌号组合,如是3个桌子就有 7种组合(2^n-1)

这三者没有重复关系,假如一个人参加了1号桌和3号桌,那么只记入1&3这个记录中

TA的精华主题

TA的得分主题

发表于 2018-8-9 17:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一把小刀闯天下 发表于 2018-8-9 11:32
代码审核中,估计差不多

1号桌3类客人分别为:6,4,9

你这个统计结果,规则比较混乱了。

举例:
1号单桌子统计时,你把1或者1,2或者1,3或者1,2,3这几种桌子组合都算进去了
而非排除某个编码既到过1号桌,也到过其它桌的情形。

但是,1,2桌子组合时,你却没有把1,2,3的情况统计进去。
即, 你排除了1,2,3桌都到过的编码。只统计了唯一出现过1,2组合的编码

…………
到底该如何统计,需要楼主来决定。

TA的精华主题

TA的得分主题

发表于 2018-8-9 17:14 | 显示全部楼层
一把小刀闯天下 发表于 2018-8-9 15:00
'应该有7+1种组合,因为有都不参加的。代码审核中,,,

1号桌3类客人分别为:6,4,9

一号桌3类客人分别为:2,2,6
二号桌3类客人分别为:3,2,12
三号桌3类客人分别为:3,6,17
一二号桌3类客人分别为:1,0,1
一三号桌3类客人分别为:2,1,2
二三号桌3类客人分别为:2,2,4
一二三号桌3类客人分别为:1,1,0

你这个统计结果,是不向下覆盖时的情形。

而下面这个,是向下覆盖统计的结果:
1号桌3类客人分别为:6,4,9
2号桌3类客人分别为:7,5,17
3号桌3类客人分别为:8,10,23

TA的精华主题

TA的得分主题

发表于 2018-8-9 17:26 | 显示全部楼层
lovelfg 发表于 2018-8-9 17:06
这三者没有重复关系,假如一个人参加了1号桌和3号桌,那么只记入1&3这个记录中

意思是,1号桌和单独3号桌都不再重复统计入内。


那这样的统计简单多了。无需对各种组合再进行拆分组合统计了。
类型/桌子组合
,1
,2
,1,2
,3
,1,3
,2,3
,1,2,3
一类宾客
2
3
1
3
2
2
1
二类宾客
2
2
6
1
2
1
三类宾客
6
12
1
17
2
4
 

桌号分配统计.zip

24.38 KB, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2018-8-9 17:28 | 显示全部楼层
这样,最后不重复的各种组合类型的统计总数=70,和编码-桌号关系的实际不重复处理结果数量一致。

TA的精华主题

TA的得分主题

发表于 2018-8-9 19:49 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川群子 发表于 2018-8-9 17:14
一号桌3类客人分别为:2,2,6
二号桌3类客人分别为:3,2,12
三号桌3类客人分别为:3,6,17

感谢飞仙老师的回复

觉得它并不矛盾,第一个问题我觉得条件是可以交叉的。就是如果条件1、条件2同时成立,那么条件1或者条件2都可以成立。但是第二个问题就不一样了,只能取其一,也就是如果011成立那么001或010肯定不成立,所以后面的问题就是一个组合问题了

觉得9楼的代码应该没毛病,下午审核通过了但没看到代码,现在能看到。直接排序后的数组可以输出到工作表,最多可以有8种组合(多了000)

评分

1

查看全部评分

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

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-11 21:02 , Processed in 0.040345 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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