Excel 新数据类型

Excel new data type

例如,我有两个值,每个值都由平均值和标准差表示。现在第一个在单元格 A1 和 A2 中,第二个在单元格 A4 和 A5 中,代表每个单元格的平均值和标准差。 我将在 B 列和 C 列中分别使用 :

进行计算
=NORM.INV(RAND();$A;$A)
=NORM.INV(RAND();$A;$A)

现在,在 D 列中,我将对这两项进行一些运算,在 E1 中,我将获得 D 列中所有点的平均值,E2 中,我将获得 D 列中所有点的标准偏差。

我想使用 vba 封装所有内容,但我更喜欢使用 mean 和 stddev,它们是单个单元格中的两个双精度值。

我如何创建这种支持两个数字的数据类型 - 理想情况下我想像 (mean,stddev) 一样阅读它。

示例单元格 A1 是 (21.0,3.2),如何从以 A1 作为输入的函数中获取每个值?

您可以创建 class like this:

A class is created just like a module. By default it will create a module called 'Class1'. First job is to go to the properties tab and rename it to something sensible. The 'standard' naming convention is clsYourClassName, however I personally use c prefix rather than cls. This class module is your vba class constructor.

这个class有两个属性:

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

然后你需要实例化你的class并赋值。

我假设 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

最简单的方法是使用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 sheet:

中使用它
=NORM.INV(RAND();ToArray($A))