UDF在不同的表单上调用eachother返回错误2015年

我有2张3 UDF的在第一和2在第二。

  • 工作表1是一个每月一列的matrix,每天有一列人们把时间放在下面的行上。 在3个特定的行上,有UDF将上面的列中的数据合并起来,将行作为参数引用。 我做了如下的函数调用,以避免使UDF变得不稳定(如果我这样做会大大延长计算时间),所以当列R中的任何内容发生变化时,UDF的结果都会更新:

    calculateOvertime(R:R) 
  • 在表2中,月份的日子是行(不是列),如果他们加class,可以详细说明他们的日子。 这由表1中的一个UDF检测到,所以这里的2个UDF需要由表1中的UDF计算的数据

我有这个设置一些奇怪的问题:

  • 出于某种原因,当我切换选项卡时,所有包含这些函数的单元格都显示为#VALUE !. 我必须添加“Application.CalculateFull”到一个事件处理程序,每当激活选项卡时触发:

     Private Sub Worksheet_activate() Application.CalculateFull End Sub 
  • 在其他选项卡上引用包含另一个UDF的单元格的UDF将始终得到“2015!”。 作为一个值,指的是错误2015(一个值错误,因为该单元格包含#VALUE!当工作表不活跃)

很明显,这两个问题是相互关联的,因为当我转换工作表时,UDF计算出的非活动表中的值不知何故就丢失了。

我从单元格获取值的方法如下。 我想通过使用Find()函数找出列A中标签的哪一行

 Dim compensationRowIndex As Integer compensationRowIndex = CInt(othersheet.Range("A1:A250").Find("COMPENSATION").Row) 

然后我得到的价值,并把它投给单

 Dim compensation As Single compensation = CSng(othersheet.Cells(compensationRowIndex , columnIndex).Value) 

variables“补偿”始终保持值2015。

有没有办法解决? 另外,当我想打印表单时,所有包含UDF的单元格都填充了#VALUE !. 我的猜测是:如果我可以让问题1走开,那么问题2。

任何帮助,这是非常赞赏。 我一直在解决这个问题几乎一整天,并没有find一个解决schemegoogling症状。

问题解决了!

UDF中的“ActiveSheet”并不意味着“包含UDF的单元格在工作表上”它的字面意思是“工作表是活动的”。

当在一张纸上引用一个UDF时,事情会变得非常糟糕。 这完全是用一个在If语句中设置的variablesreplaceActiveSheet的问题,该语句决定了UDF的调用方式。 在我的情况下,第二张纸上总是有“信息”一词。 当在那张纸上时,你应该去一张纸到左边:

 Dim ws As Worksheet If InStr(ActiveSheet.Name, "Info") = 0 Then Set ws = ActiveSheet Else Set ws = Worksheets(ActiveSheet.Index - 1) End If 

不是100%的防水解决scheme(例如,如果有人重新订购床单),但为了我的目的,它足够接近。

下面的代码片段(在UDF中使用)应该做你想要的:

 Dim ws As Worksheet If TypeOf Application.Caller Is Range Then Set ws = Application.Caller.Parent End If 

Application对象的Caller属性指向覆盖从中调用UDF的单元格的Rangews将指向包含工作表。
If TypeOf函数被UDF以外的其他项调用(例如,另一个VBA过程),其中的Caller可能不指向Range对象,则If TypeOf子句将避免错误。 在这种情况下, ws仍然未分配( Nothing )。