作者l3112255 (米米)
看板Office
标题[算表] 组合加总最佳化
时间Tue Mar 17 09:33:55 2020
软体:Excel
版本:2016
大大好,有一问题如下
https://imgur.com/nIb49t9
有10位同学(A栏) 他们可以做的伏地挺身数量(B栏)
现在想分三组竞赛,要让他们的竞赛数值平均一点
第一组要3人 第二组3人 第三组4人
有办法让他自动计算如何分组後的加总是最平均的(k2,K4,K6越接近越好)
(从折线图看希望他是平坦一点)
(要知道每一组分别是那些人)(g:j)
再者 折线图有办法利用像是交叉分析筛选器 点选几号同学就自动依组别
加总并画在折线图上吗? 查过资料好像无法
再麻烦大大帮忙 谢谢。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 124.219.98.170 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Office/M.1584408837.A.571.html
1F:→ soyoso: 想法,巨集巢状回圈排出组合排列数字(3人),接来3人一样巢 03/17 12:29
2F:→ soyoso: 状回圈(排除前项已排列数字),前面二组3、3都确定了,那剩 03/17 12:29
3F:→ soyoso: 余的就是4人的部分,接着就是判断加总两两相减abs取正值的 03/17 12:29
4F:→ soyoso: 最小值组合,这样逻辑来看内文连结的话,第一组1,7,8、第 03/17 12:29
5F:→ soyoso: 二组4,5,9、第三组2,3,6,10三组加总都是50 03/17 12:29
6F:→ l3112255: 好 我再试试看 好难QQ 03/17 15:41
7F:→ soyoso: 还是要看原po需求,以巨集回圈的话,也可抓出多取符合最小 03/18 10:26
9F:→ soyoso: 只一组,就看看那种方式合适 03/18 10:28
10F:→ l3112255: 能请教大概的写法吗? 巨集还在学习中 03/18 11:50
11F:→ soyoso: 以内文10笔来看的想法上巢状回圈 03/18 14:27
12F:→ soyoso: for 变数a =1 to 8 03/18 14:27
13F:→ soyoso: for 变数b = 变数a+1 to 9 03/18 14:27
14F:→ soyoso: for 变数c = 变数b+1 to 10 03/18 14:27
15F:→ soyoso: next 03/18 14:27
16F:→ soyoso: next 03/18 14:27
17F:→ soyoso: next 03/18 14:27
18F:→ soyoso: 以上就是不重复三人一组的部分,执行上就是120次 03/18 14:27
19F:→ soyoso: 那接着来就是要剔除,举例好了变数a=1,变数b=2,变数c=3 03/18 14:27
20F:→ soyoso: 也就是1,2,3被归在一组了,那还没有被归在一组有4~10 03/18 14:27
21F:→ soyoso: 这里的4~10写入阵列,或是字串取代1,、2,、3,後再split到 03/18 14:27
22F:→ soyoso: 阵列内 03/18 14:27
23F:→ soyoso: 一样巢状回圈,但此时同学剩7位还没有被分配 03/18 14:27
24F:→ soyoso: for 变数d =1 to 5 03/18 14:27
25F:→ soyoso: for 变数e = 变数a+1 to 6 03/18 14:27
26F:→ soyoso: for 变数f = 变数b+1 to 7 03/18 14:27
27F:→ soyoso: nex 03/18 14:27
28F:→ soyoso: next 03/18 14:27
29F:→ soyoso: next 03/18 14:27
30F:→ soyoso: 又会有三个人被归在一组了。这里变数d,e,f都是来对应阵列 03/18 14:27
31F:→ soyoso: 内的值 03/18 14:27
32F:→ soyoso: 没有被被归在一组的就是最後4人 03/18 14:27
33F:→ soyoso: 有了这些归类後,接着就是设个二个变数(变数g[数值]、变数 03/18 14:27
34F:→ soyoso: h[文字]),变数g用於判断if回文所述的加总两两相减abs取正 03/18 14:27
35F:→ soyoso: 值的最小值)来做比较,当最小值小於变数g,then 变数h就写 03/18 14:27
36F:→ soyoso: 入同学(a栏)的资料;else if 当最小值等於变数g时 then 累 03/18 14:27
37F:→ soyoso: 加变数h = 变数 & ...资料。 03/18 14:27
38F:→ soyoso: 变数g不设初始值的话,可能为0,所以初始值方面要设个大点 03/18 14:27
39F:→ soyoso: 的数值 03/18 14:27
40F:→ soyoso: 变数h的资料会是(3人、3人、4人)一组,因此分隔符号要设一 03/18 14:27
41F:→ soyoso: 下,可用於split到储存格 03/18 14:27
42F:→ soyoso: 大概逻辑是这样,原po如果要二笔以上符合表列的话,可以试 03/18 14:27
43F:→ soyoso: 试看,有窒碍难行的地方,就提供档案,再来讨论 03/18 14:27
44F:→ l3112255: 好的 我在尝试看看 谢谢大大 03/18 15:34
46F:→ l3112255: 原本想说用规划求解 但速度真的太久了 变数比较多时 03/25 17:18
47F:→ l3112255: 大概要耗费半小时 03/25 17:18
48F:→ soyoso: 回圈大概就是原po这样的写法,变数D、E、F方面也可以用另 03/25 21:00
49F:→ soyoso: 一个程序sub或是函数function来,将变数A、b、c的数值以外 03/25 21:00
50F:→ soyoso: 的,如回圈执行到A=1,b=2,c=3,那4~10就是传值到另一个程 03/25 21:00
51F:→ soyoso: 序sub或是function内,目的就是4~10这些数值还有什麽可能 03/25 21:00
52F:→ soyoso: 是三位一组的 03/25 21:00
53F:→ soyoso: 回文的逻辑是第一个巢状回圈来回传不重覆三位一组的可能, 03/25 21:00
54F:→ soyoso: 第二个巢状回圈来回传排除第一个巢状的三位(剩七位内)的不 03/25 21:00
55F:→ soyoso: 重覆三位一组的可能,有了这些可能就可以去抓取所对的数量 03/25 21:00
56F:→ soyoso: ,来判断最佳解。 03/25 21:00
57F:→ soyoso: 另外宣告变数F方面,所写的位置和宣告的类型要调整一下, 03/25 21:00
58F:→ soyoso: 位置需在回圈变数的上方,类型也非字串 03/25 21:00
59F:→ l3112255: 後者抓取所对应数量来判断最佳解要如何撰写呢 03/26 14:48
60F:→ l3112255: 仅用IF ELSE 要怎麽秀出对应的值 好难 03/26 14:49
61F:→ l3112255: 宣告变数F 我打错了 应该是宣告H 看到头晕 03/26 14:50
62F:→ soyoso: 最佳解的判断,我是以回文3/17 12:29的方式,两两相减abs 03/26 17:10
63F:→ soyoso: 取正值的最小值组合;当然回圈执行下会有比前数还要更小的 03/26 17:11
64F:→ soyoso: 值出现,就可以设个变数,当小於前数时写入变数且记录是哪 03/26 17:12
65F:→ soyoso: 三组资料,那当等於最小值时,再以连接符号&来累加是哪三 03/26 17:13
66F:→ soyoso: 组,这样回圈结束後可以取得多组资料 03/26 17:14
67F:→ soyoso: 另外每当判断有比之前最小值的出现时,所记录是哪三组资料 03/26 17:15
68F:→ soyoso: 的变数就要清空,清空方式可写入空字串"" 03/26 17:15
69F:→ l3112255: 尝试了蛮久还是没试出来orz 04/13 11:43
70F:→ soyoso: 这要看原po写到目前方面巨集是如何写的了 04/13 18:17
72F:→ l3112255: 研究很久还是不知道要怎麽写QQ 04/15 10:12
※ 编辑: l3112255 (124.219.98.170 台湾), 04/15/2020 10:16:22
73F:→ l3112255: 可以给个范例吗 还是指导一下 麻烦了QQ 04/15 10:24
74F:→ soyoso: 连结来看无法提供什麽指导,因为判断当小於G,H=cells(2,F 04/16 13:00
75F:→ soyoso: ),变数G是什麽,之後又要有什麽作用,上面回圈都执行完了 04/16 13:00
76F:→ soyoso: ,在最後才判断目的是? 04/16 13:00
77F:→ soyoso: 像这方面的判断都会是在回圈内而非在回圈结束後才执行 04/16 13:00
78F:→ l3112255: 好吧 谢谢大大回覆 04/16 15:41
79F:→ soyoso: 这样说好了,原po知道为什麽要设二组巢状回圈吗? 04/16 18:33
80F:→ soyoso: (第一组) 04/16 18:33
81F:→ soyoso: for A=1 to 8 04/16 18:33
82F:→ soyoso: ... 04/16 18:33
83F:→ soyoso: next 04/16 18:33
84F:→ soyoso: (第二组) 04/16 18:33
85F:→ soyoso: for D=1 to 5 04/16 18:33
86F:→ soyoso: ... 04/16 18:33
87F:→ soyoso: next 04/16 18:33
88F:→ soyoso: 以下我就以一组、二组来称呼 04/16 18:33
89F:→ soyoso: 一组A=1,B=2,C=3时这个资讯就要跟二组说目前1,2,3的同学已 04/16 18:33
90F:→ soyoso: 经被占了 04/16 18:33
91F:→ soyoso: 那只能抓非1,2,3的名额 04/16 18:33
92F:→ soyoso: 二组虽然是D=1,E=2(这里原po的巨集也是写错的,不是变数A+ 04/16 18:33
93F:→ soyoso: 1,是变数D+1),F=3(错误亦同) 04/16 18:33
94F:→ soyoso: 这里1,2,3不是指同学1,2,3而是指非1,2,3後的同学4,5,6,7,8 04/16 18:33
95F:→ soyoso: ,9,10,这不是数值的想法,而是位址的想法 04/16 18:33
96F:→ soyoso: 所以原po第一步是要先让一组和二组回圈内是可以正确回传上 04/16 18:33
97F:→ soyoso: 述资料 04/16 18:33
98F:→ soyoso: 第二步才能用该资料所对应的数量来判断,不是直接 04/16 18:33
99F:→ soyoso: 拿变数A~F,因为A~F不就只是1~10的数值,以这个来判断并不 04/16 18:33
100F:→ soyoso: 正确 04/16 18:33
101F:→ soyoso: 另外虽然我03/25 21:00回文变数D、E、F方面用另一个程序 04/16 18:33
102F:→ soyoso: sub或是函数function来处理,而原po要以一个程序内来做也 04/16 18:33
103F:→ soyoso: 可以,就gosub return,设个变数,文字、数字或布林值都行 04/16 18:33
104F:→ soyoso: 执行二组回圈时先判断是否是一组回圈gosub来的;不设也行 04/16 18:33
105F:→ soyoso: ,就一组回圈执行完就exit sub就行 04/16 18:33