发布网友 发布时间:2022-05-16 02:11
共5个回答
热心网友 时间:2023-10-09 02:27
本问题用公式是可实现的,但要用到循环引用,所以要启用迭代计算,具体方法如下:
文件选项——公式,勾选“启用迭代计算”后确定。
在C2中输入公式:
=IF(ROW()>B$2+1,"",ROW()-1)
下拉到若干单元格,如C50(以B2中可能的最大数值来决定,行数略大于可能的最大数即可)。
D2中输入公式:
=IF(B$2="","",IF(C2="","",IF(OR(D2="",SUM(D:D)<>A$2),RANDBETWEEN(1,A$2/B$2*2),D2)))
下拉到与C列一样的行数。
现在删除B2中的数据,填入新的数据,C列得到每个数的序号,D列得到对应的数据。
如图,E2中用求和公式验证:
E2=SUM(D:D)
PS:随机数按最大取A2按B2平均分后的2倍来考虑的,可自己修改最值的范围。但经测试,如果最大值就取A2,循环计算很难得到结果。
追问非常感谢 就你的方法会用 比较简单追答在选项中把循环次数设大些,最大:32767,B2填写新的数字后,如果E2中的和不等于A2,就按F9,多次按F9后,一般能够得到最后稳定的D列数据,且E2等于A2。如果多次按F9一直不能固定D列,就修改公式中randbetween中的取值范围,改到上限和下限距均值比较接近的数值。如B2中填写20,10000/20=500,那么上限在1000,下限在1,或上限在800,下限在300。总之范围越大,特别是上限与下限与均值的差相差太大时,就越难得到稳定的结果。
热心网友 时间:2023-10-09 02:28
假定笔数50以内,D2中输入:=A2-SUM(D3:D50)
D3中输入:=IF(ROW(1:1)>$B$2-1,"",INT(RAND()*$A$2/($B$2-1)*1.65)),然后下拉填充到你的最大笔数。
D2有负数出现时,F9刷新取值。
热心网友 时间:2023-10-09 02:28
新建一个宏,命名为M,可以设个快捷键,这样以后只要在表格中按快捷键就能直接生成随机数了,也不需要另放一个按钮,编辑宏,写入以下代码:
Sub M()
'Ctrl + m
Dim sum, n As Integer
Dim tmp As Integer
sum = Cells(2, 1)
n = Cells(2, 2)
For i = 1 To n
Cells(i + 1, 3) = i
Next i
For i = 1 To n - 1
tmp = Int((sum / (n - i) * Rnd))
sum = sum - tmp
Cells(i + 1, 4) = tmp
Next i
Cells(n + 1, 4) = sum
End Sub
热心网友 时间:2023-10-09 02:29
你说的那必须用代码来实现。热心网友 时间:2023-10-09 02:29
vba可以完成。。。