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