Excel新数据类型

时间:2015-01-15 13:32:48

标签: excel vba types

例如,我有两个值,每个值由平均值和标准差表示。现在第一个是在单元格A1和A2中,第二个在单元格A4和A5中,表示每个单元格的平均值和stddev。 我将使用以下方法在B和C列中计算:

=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作为输入的函数中获取每个值?

2 个答案:

答案 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))