使用自定义函数设置单元格值时需要Excel VBA对象
我遇到错误“424”:当我尝试运行以下子例程时需要对象:使用自定义函数设置单元格值时需要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
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