0

我正在尝试使用 vba,但收效甚微。我想实现一个简单的函数,它根据年初到今天对一系列单元格的内容求和。不幸的是,当我调用该函数时,我得到了一个“循环引用”错误,我就是不明白为什么。任何帮助将不胜感激。

Public Function til2day(r As Integer) As Long ''supposed to receive cell("row") as parameter  
  Dim c As Integer  
  Dim c1 As Integer  
  Dim c_here As Integer  

  Application.Volatile True

  c_here = ActiveCell.Column
  c = 0
  c1 = 34 ''column contains 1/1/2013 date

  Range("AH4:OM4").Activate ''contains a timeline
  Do While ActiveCell.Offset(0, c).Value <> Date
    c = c + 1
  Loop
  If ActiveCell.Offset(0, c).Value = Date Then
      c = ActiveCell.Offset(0, c).Column
  End If

  til2day = Application.WorksheetFunction.Sum(Range(Cells(r, c1).Address, Cells(r, c).Address))
  Range(Cells(r, c_here).Address).Activate
End Function
4

1 回答 1

1

在函数中使用“激活”是一个非常糟糕的主意。我无法确切解释为什么会这样,除非您在计算期间更改了单元格的选择。在以下情况下,这将导致问题:

multiple cells are being calculated with this function, and 
you use `Application.Volatile`, and 
you refer to the active cell inside your function, and 
you allow multi-threaded calculation, 

事情不会按照您期望的顺序发生,并且在某些时候活动单元格将与您想象的不同。函数最终引用它所在的单元格,并且您有一个循环引用。当您运行调试器时不会发生这种情况,因为它根据定义作为单个线程运行 - 这就是为什么您找不到问题的原因......

这是您的函数的建议重写 - 它不会激活任何单元格,但会尝试保持相同的功能:

Public Function til2day(r As Integer) As Long ''supposed to receive cell("row") as parameter  
  Dim c As Integer  
  Dim c1 As Integer  
  Dim dateRange as Range
  Dime dateCell as Range

  Application.Volatile True

  c = 0
  c1 = 34 ''column contains 1/1/2013 date

  set dateRange = Range("AH4:OM4")

  For Each dateCell in dateRange
    If dateCell.Value = Date Then Exit For
  Next dateCell

  c = dateCell.Column

  til2day = Application.WorksheetFunction.Sum(Range(Cells(r, c1).Address, Cells(r, c).Address))

End Function

注意:我试图重现您的函数的功能 - 但没有您正在使用的工作表的良好示例以及您期望返回的值,很难测试。请尝试在您的工作表上运行它 - 如果事情没有按您的预期工作,请告诉我。

另请注意,该SUMIF功能可以使用效果很好:

=SUMIF(range, criteria, sum_range)

在你的情况下,使用

=SUMIF($AH$4:$OM$4, "<=" & NOW(), $AH18:$OM18)

$4其中“18”是您需要的任何行(并且当您将公式拖到不同的行时,由于绝对引用,它将继续引用日期行,但由于中的相对行引用$AH18:$OM18

此函数的使用示例(简化范围...)

在此处输入图像描述

如您所见,自从我在 6 月 15 日执行此操作后,该函数才对列 C 到 F 求和。

于 2013-06-15T19:36:17.163 回答