Excel VBA使用范围作为输入

时间:2015-12-29 19:43:44

标签: excel vba input

我正在学习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错误。

我觉得如果能让它发挥作用,那么创建我的功能应该很容易。

谢谢!

迈克尔

2 个答案:

答案 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关键字 - WITHEND WITH之间以.开头的任何内容均指Application.ThisCell。因此.RowApplication.ThisCell.Row

相同

编辑:已更新该函数,以便在尝试引用该表时返回#REF!错误。