使用自定义函数设置单元格值时需要Excel VBA对象

使用自定义函数设置单元格值时需要Excel VBA对象,vba,excel,office-2010,Vba,Excel,Office 2010,我遇到错误“424”:当我尝试运行以下子例程时需要对象: Sub MySub() 'Iterate through column, setting corresponding values For Each cell In Range("Table5[Name]") cell.Offset(, 2).Value = Avg("Table2[time]", cell.Value, "Table2[name]") cell.Offset(, 3).Va

我遇到错误“424”:当我尝试运行以下子例程时需要对象:

Sub MySub()
    'Iterate through column, setting corresponding values
    For Each cell In Range("Table5[Name]")
        cell.Offset(, 2).Value = Avg("Table2[time]", cell.Value, "Table2[name]")
        cell.Offset(, 3).Value = StDev("Table2[time]", cell.Value, "Table2[name]", cell.Offset(, 2).Value)
    Next
End Sub
当我按下debug时,它高亮显示For循环中的第二行。Avg和StDev都是我编写的函数,其工作原理与AVERAGEIF类似,但都是在一个非常特定的场景中

Avg功能完全按照预期工作,StDev几乎完全相同。它有一个额外的If语句,并且数学几乎相同。两个函数都返回一个变量

我不明白它为什么这样做。到目前为止,我已经尝试在麻烦的行前面添加Set,我知道它不起作用,但无论如何我必须尝试,并且我已经确保两个函数都是安全的,即它们不被零除,并且它们总是返回一个值

以下是修改的StDev函数,以保护工作机密性,但存在相同的问题:

Function StDev(rng As Range, Criteria1 As Variant, Criteria_Rng1 As String, Optional avg As Variant) As Variant
    'Call like this
    '  StDev2Ifs(Range to StDev, Match this, Range to find Criteria1, [average])

    If IsMissing(avg) Then
        avg = Avg(rng, Critera1, Criteria_Rng1)
    End If

    If avg <> "NO DATA" Then
         'Convert Strings to Ranges
        Dim c_rng, c_rng1 As Range
        Set c_rng = Application.Range(rng)
        Set c_rng1 = Application.Range(Criteria_Rng1)

        'Get Column Indices
        Dim r, r1As Long
        r = c_rng.Columns(c_rng.Columns.Count).Column
        r1 = c_rng1.Columns(c_rng1.Columns.Count).Column

        'Calculate column offsets from range to stdev
        Dim off1 As Long
        off1 = r1 - r

        'x will be used to sum the elements
        Dim x As Double
        x = 0
        'ct will be used to count number of elements
        Dim ct As Double
        ct = 0
        For Each cell In Range(rng)
            If cell.Offset(, off1).Value = Criteria1 Then
                x = x + Square(cell.Value - avg)
                ct = ct + 1
            End If
        Next

        'Divide by count
        If ct <> 0 Then
            StDev = x / ct
        Else
            StDev = "NO DATA"
        End If

        'Square Root
        If ct <> 0 Then
            StDev = StDev ^ (1 / 2)
        End If
    Else
        StDev = "NO DATA"
    End If
End Function
有人有什么想法吗

cell.Offset(, 3).Value = StDev("Table2[time]", cell.Value, "Table2[name]", cell.Offset(, 2).Value)
在第一个代码块中应该是

cell.Offset(, 3).Value = StDev(Range("Table2[time]"), cell.Value, "Table2[name]", cell.Offset(, 2).Value)
如果要按函数的预期传递范围。您将运行到一个错误,因为在您的函数中,StDev似乎是为将其作为字符串传递而构建的,所以我建议您从

Function StDev(rng As Range, Criteria1 As Variant, Criteria_Rng1 As String, Optional avg As Variant) As Variant


快速检查,请小心,我可能遗漏了一些内容。

您正在传递一个字符串,函数需要一个字符串range@chrisneilsen是的,复制/粘贴错误。谢谢你为我注意到这一点!谢谢最后,我只是将StDev函数的第一个参数更改为字符串,这样它的工作方式将与Avg相同,但我非常确定这也会起作用!
Function StDev(rng As String, Criteria1 As Variant, Criteria_Rng1 As String, Optional avg As Variant) As Variant