我正在学习Excel VBA,并且正在尝试创建一个简单的函数。
我的想法是,我会使用一个单元格作为输入,并且该函数会告诉您在该单元格周围放置的12个值的标准偏差。
所以如果我输入getstd(A1),它会得到A1,A3,A5,A7,C1,C3,C5,C7和E1,E3,E5和E7的标准偏差。
如果我输入getstd(X23),它会得到12个其他值的标准位置放在X23周围的相同偏移处。
我现在最大的问题是弄清楚如何使用细胞作为输入。
例如,在尝试抵消时:
Function getstd(rng as Range)
Range(rng).Offset(1,1) = "hello world"
End Function
它总是给我一个#Value错误。
我觉得如果能让它发挥作用,那么创建我的功能应该很容易。
谢谢!
迈克尔
答案 0 :(得分:0)
您可以将单元格(Union
)分组到一个多区域范围内,并使用内置stdev
函数:
Function getstd(ByVal target As Range)
Dim r As Range
For i = 0 To 6 Step 2
For j = 0 To 4 Step 2
If r Is Nothing Then Set r = target.Offset(i, j) Else Set r = Union(r, target.Offset(i, j))
Next
Next
getstd = Application.StDev(r)
End Function
答案 1 :(得分:0)
另一种方法:
Public Function STD_DEV() As Variant
Dim rDataSet As Range
Dim rCell As Range
Dim aValues(1 To 8) As Double
Dim x As Long
Application.Volatile
With Application.ThisCell
'Check we're not trying to reference off the sheet.
If .Row > 1 And .Column > 1 And _
.Row < Rows.Count And .Column < Columns.Count Then
'Get a reference to all cells around target cell.
'This includes the target cell in its reference.
Set rDataSet = .Offset(-1, -1).Resize(3, 3)
'Step through each cell in the range and add
'value to an array.
x = 1
For Each rCell In rDataSet
If rCell.Address <> .Address Then
aValues(x) = rCell.Value
x = x + 1
End If
Next rCell
'Calculate the Standard Deviation.
STD_DEV = WorksheetFunction.StDev(aValues)
Else
STD_DEV = CVErr(xlErrRef)
End If
End With
End Function
请注意WITH
关键字 - WITH
和END WITH
之间以.
开头的任何内容均指Application.ThisCell
。因此.Row
与Application.ThisCell.Row
编辑:已更新该函数,以便在尝试引用该表时返回#REF!
错误。