Excel VBA – 引用公式写入的单元格

我有一个自定义VBA代码,我试图编码这个简单的问题,但我找不到任何解决scheme,它是要逼我疯了。

我需要有一个公式:

  • 如果当前行为5或更低OR,则获取同一列中两行的单元格的值
  • 如果当前行为6或更大,则获取顶部相邻单元格的值

用简单的英文,如果公式写在单元格E5中; 它应该得到E3的价值。 如果公式写入单元格E6,那么它应该得到E5的值。 然后,我将使用该值作为其他公式的input,或根据情况将其用作结果。

其实我可以用下面的工作表公式来达到我想要的:

IF(ROW()>5; INDIRECT(ADDRESS(ROW()-1; COLUMN())); INDIRECT(ADDRESS(ROW()-2; COLUMN()))) 

如果这是单独使用的,那么可以,但是这将成为更大的嵌套IF块的一部分。 如果你有兴趣,工作表的公式看起来有点像这样:

 =IF(LEFT($C5;2) = "RT"; IF(ROW()>5; INDIRECT(ADDRESS(ROW()-1;COLUMN())); INDIRECT(ADDRESS(ROW()-2; COLUMN())))-$F5; IF(LEFT($C5;2)="DP"; IF(ROW()>5; INDIRECT(ADDRESS(ROW()-1;COLUMN())); INDIRECT(ADDRESS(ROW()-2; COLUMN())))+$F5; IF(VE($E5=P$4; LEFT($C5;2)="FR"); IF(ROW()>5; INDIRECT(ADDRESS(ROW()-1; COLUMN())); INDIRECT(ADDRESS(ROW()-2; COLUMN())))-$F5; IF(VE($E5=P$4; LEFT($C5; 2)="RV"); IF(ROW()>5; INDIRECT(ADDRESS(ROW()-1; COLUMN())); INDIRECT(ADDRESS(ROW()-2; COLUMN())))+$F5; IF(ROW()>5; INDIRECT(ADDRESS(ROW()-1; COLUMN())); INDIRECT(ADDRESS(ROW()-2; COLUMN()))))))) 

正如你所看到的,我正在寻找一个完整的维修噩梦。 即使看一看,也让我头晕目眩。 所以,我决定把提到的位移到一个VBA公式上,我认为可以这样写:

 Function GETTOP() If (ActiveCell.Row < 6) Then GETTOP = CLng(ActiveCell.Offset(-2, 0).Value) Else GETTOP = CLng(ActiveCell.Offset(-1, 0).Value) End If End Function 

我知道如果引用单元格的值不是数字,会引发错误,但是稍后我会处理它。

如果我直接写公式给单元格,效果很好:

它直接编辑公式单元格时可以使用

但是当我尝试修改影响这个公式的单元格的单元格时,它试图引用我当前正在修改的单元格

影响单元格修改时不工作

因为我在函数中使用ActiveCell ,它自然会尝试引用活动的单元格。

我在networking上find的所有解决scheme都是使用ActiveCell方法,这在单元格直接编辑时效果很好。 但是当其中一个影响单元格被编辑时,它会失败。

那么,怎样才能引用公式写入的实际单元呢?

尝试使用Application.Caller

 Function GETTOP() Application.Volatile With Application.Caller If (.Row < 6) Then GETTOP = CLng(.Offset(-2, 0).Value) Else GETTOP = CLng(.Offset(-1, 0).Value) End If End With End Function 

或者,以更简洁的风格(如果你喜欢的话):

 Function GETTOP() Application.Volatile With Application.Caller GETTOP = CLng(.Offset(IIf(.Row < 6, -2, -1)).Value) End With End Function