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))
例如,我有两个值,每个值都由平均值和标准差表示。现在第一个在单元格 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))