=NORM.INV(RAND();$A$1;$A$2)
=NORM.INV(RAND();$A$4;$A$5)
现在在D栏中,我将对两个术语进行一些操作,在E1中,我将得到D列中所有点的平均值,E2得到D列中所有点的stddev。
我想用vba封装所有内容,但我更喜欢使用mean和stddev,它们是单个单元格中的两个双精度数。
如何创建支持两个数字的数据类型 - 理想情况下我想像(mean,stddev)一样阅读它。
示例单元格A1是(21.0,3.2),如何从具有A1作为输入的函数中获取每个值?
答案 0 :(得分:3)
您可以创建课程like this:
创建一个类就像一个模块。默认情况下,它会创建一个 名为' Class1'的模块。第一项工作是转到属性选项卡和 将其重命名为合理的东西。标准'命名约定是 clsYourClassName,但我个人使用c前缀而不是cls。 这个类模块是你的vba类构造函数。
这个类有两个属性:
Option Explicit
Private dMean As Double
Private dStddev As Double
Public Property Get Mean() As Double
Mean = dMean
End Property
Public Property Let Mean(p As Double)
dMean = p
End Property
Public Property Get Stddev() As Double
Stddev = dStddev
End Property
Public Property Let Stddev(p As Double)
dStddev = p
End Property
Public Sub Assign(a As Double, b As Double)
Mean = a
Stddev = b
End Sub
然后你需要实例化你的类并分配一个值。
我认为Cells(1, 1).Value
的值类似于(21.0,3.2)
:
Option Explicit
Sub test()
Dim mc As cMyClass
Set mc = New cMyClass()
mc.Assign(Cells(1, 1).Value)
' do things
Set mc = Nothing
End Sub
[编辑]
正如我所写,我假设Cells(1,1).Value的值类似于(21.0,3.2)。如果没有,并且只返回一个字符串,我们需要解析它,例如:
Public Sub Assign(str As String)
Dim ar() As String = Split(str, ",")
If UBound(ar) = 2 Then
Mean = CDbl(ar(0))
Stddev = CDbl(ar(1))
End If
End Sub
答案 1 :(得分:0)
最简单的方法是使用Split函数
Function ToArray(ByVal rng As Range, Optional ByVal sDelimit As String = ",") As Double()
Dim sNumbers() As String
Dim dNumbers() As Double, i As Integer
sNumbers = Split(rng, sDelimit)
ReDim Preserve dNumbers(UBound(sNumbers))
For i = LBound(sNumbers()) To UBound(sNumbers())
dNumbers(i) = CDbl(sNumbers(i))
Next
ToArray = dNumbers
End Function
您可以在Excel工作表中使用它:
=NORM.INV(RAND();ToArray($A$1))