本问题用公式是可实现的,但要用到循环引用,所以要启用迭代计算,具体方法如下:
文件选项——公式,勾选“启用迭代计算”后确定。
在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,循环计算很难得到结果。
假定笔数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刷新取值。
新建一个宏,命名为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
你说的那必须用代码来实现。
vba可以完成。。。