excel # Value!error using Range.Find in a function

ao218c7q  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(100)

我正在计算过去一个月的数据。

Function Monthly_volume_given_velocity() As Double
Dim velocity As Double
Dim ind_vit As Integer
Dim ind_today As Integer
velocity= ActiveCell.Offset(0, -1).Value

With Sheets("2022")
    ind_vel = .Range("A5:A13").Find(What:=velocity).Row
    Dim rng As Range
    rng = .Rows("1").Find(What:=Date, LookIn:=xlFormulas)
    If Not rng Is Nothing Then ind_today = rng.Column: Debug.Print ind_today 
        Monthly_volume_given_velocity = Application.WorksheetFunction.Sum(.Range(.Cells(ind_vel , ind_today - 30), .Cells(ind_vel , ind_today )))
    End With
End Function

我得到了一个#值!错误,尽管在调试模式下我得到了正确的Monthly_volume_given_velocity值。
ind_today替换为它的期望值不会产生错误,所以我猜它来自Range.Find过程。我从不同的线程得到了If Not rng...,但它并没有解决这个问题。

rta7y2nd

rta7y2nd1#

当UDF在任何错误上运行时,它将返回一个错误,在工作表中显示为#VALUE
现在很难判断函数中到底什么地方失败了,但我看到了一些问题:

  • UDF不应该依赖于ActiveCell(或ActiveSheet)。Excel会处理重新计算,如果包含公式的单元格未处于活动状态,则会触发重新计算。将单元格作为参数传递。
  • 日期的Find可能很棘手,请参阅Range.Find on a Date That is a Formula。我建议你手动搜索日期。
  • 在分配第二次查找的结果时,您遗漏了一个Set
  • 你检查rng是否不是Nothing(所以Find返回了一些东西)。但是,如果它没有找到任何东西,int_today将为0,并且下面的Sum将获得一个无效的范围作为参数。

我修改了你的功能。当然,Debug.Print-语句可以在函数工作后删除。如前所述,您必须将单元格作为公式中的参数传递,例如=Monthly_volume_given_velocity(B1)

Function Monthly_volume_given_velocity(cell As Range) As Double
    Dim velocity As Double
    Dim ind_vel As Long
    Dim ind_today As Long
    velocity = cell.Offset(0, -1).Value
    Debug.Print "Vel: " & velocity
        
    With Sheets("2022")
        ' Find Velocity Row
        On Error Resume Next
        ind_vel = .Range("A5:A13").Find(What:=velocity).row
        On Error GoTo 0
        If ind_vel = 0 Then Exit Function
        Debug.Print "ind_vel: " & ind_vel
        
        ' Find Date column
        Dim dates As Variant, lastCol As Long
        lastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        Debug.Print "lastcol: " & lastCol
        dates = .Cells(1, 1).Resize(1, lastCol)
        For ind_today = 1 To lastCol
            Debug.Print ind_today, dates(1, ind_today)
            If dates(1, ind_today) = Date Then Exit For
        Next
        If ind_today > lastCol Then
            Debug.Print "today not found"
            Exit Function ' date not found
        End If
        Debug.Print ind_today
        
        ' Calculate value
        Dim rng As Range
        Set rng = Range(.Cells(ind_vel, ind_today - 5), .Cells(ind_vel, ind_today))
        Debug.Print rng.Address
        Monthly_volume_given_velocity = Application.WorksheetFunction.Sum(rng)
    End With
End Function
sg24os4d

sg24os4d2#

范围是一个对象,因此必须使用Set定义,因此必须

Set rng = [...]

如果你不知道的话,再加上一句关于.Find方法的注解:args(LookIn、LookAt等)是静态的,即如果在新调用中没有另外定义,则从最后一个调用中记住它们。这还包括使用用户界面中的“查找”对话框。为了安全起见,每次调用都应该提供所有参数。

相关问题