使用Excel 2010时,出现以下问题:
我有一列整数(来自二项分布),我将称之为“n”。在第二张表中,我有另一列值(来自成本分析)。现在我想让 Excel 从第 2 张表中随机选取 n 个单元格(n = 给定整数)并将它们相加。
例如
第 1 页,A 列
4
6
7
8
3
4
10
等。
第 2 页;A 列
3452211011223455 12 ... 复制 代码
我现在想创建一个列,其中 excel 随机取 4 个(对于第一行)第二张表的不同值(例如 221、455、12 和 223)并自动对它们求和,因此相应的结果应该是 911。对于下一个单元格,Excel 应该对 6 个随机值求和,等等。
这可能吗?
使用 INDEX 函数,我设法告诉 Excel 从工作表 2 中挑选一个随机单元格,或者挑选 5 次相同的单元格(但不是 n 个单元格)并将它们相加。
答案1
考虑以下用户定义函数:
Public Function ransum(HowMany As Long, Population As Range) As Long
Dim i As Long, N As Long, aray(), r As Range
N = Population.Count
ReDim aray(1 To N)
i = 1
For Each r In Population
aray(i) = r.Value
i = i + 1
Next r
Call Shuffle(aray)
ransum = 0
For i = 1 To HowMany
ransum = ransum + aray(i)
Next i
End Function
Public Sub Shuffle(InOut() As Variant)
Dim i As Long, J As Long
Dim tempF As Double, Temp As Variant
Hi = UBound(InOut)
Low = LBound(InOut)
ReDim Helper(Low To Hi) As Double
Randomize
For i = Low To Hi
Helper(i) = Rnd
Next i
J = (Hi - Low + 1) \ 2
Do While J > 0
For i = Low To Hi - J
If Helper(i) > Helper(i + J) Then
tempF = Helper(i)
Helper(i) = Helper(i + J)
Helper(i + J) = tempF
Temp = InOut(i)
InOut(i) = InOut(i + J)
InOut(i + J) = Temp
End If
Next i
For i = Hi - J To Low Step -1
If Helper(i) > Helper(i + J) Then
tempF = Helper(i)
Helper(i) = Helper(i + J)
Helper(i + J) = tempF
Temp = InOut(i)
InOut(i) = InOut(i + J)
InOut(i + J) = Temp
End If
Next i
J = J \ 2
Loop
End Sub
因此工作表1细胞B1我们进入:
=ransum(A1,Sheet2!A$1:A$100)
并抄下来:
假设要采样的数据在单元格中A1通过A100第二张纸。
用户定义函数 (UDF) 非常容易安装和使用:
- ALT-F11 打开 VBE 窗口
- ALT-I ALT-M 打开新模块
- 粘贴内容并关闭 VBE 窗口
如果您保存工作簿,UDF 将随之保存。如果您使用的是 2003 之后的 Excel 版本,则必须将文件保存为 .xlsm 而不是 .xlsx
要删除 UDF:
- 调出如上所示的 VBE 窗口
- 清除代码
- 关闭 VBE 窗口
要从 Excel 使用 UDF:
=我的函数(A1)
要了解有关宏的更多信息,请参阅:
http://www.mvps.org/dmcritchie/excel/getstarted.htm
和
http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx
有关 UDF 的详细信息,请参阅:
http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx
必须启用宏才能使其工作!