2017-02-27 189 views
1

我试图编写一个自定义VBA代码,但我找不到任何解决方案,而且这个解决方案正在逼我疯狂。Excel VBA - 引用公式写入的单元格

我需要有一个公式是:

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

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

其实我能达到我想要做什么用以下工作表公式:

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 

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

它的伟大工程,如果我只写公式单元格直接:

It works when formula cells edited directly

但是,当我尝试修改与这个公式效应细胞的细胞,它试图引用单元格,我我目前修改

Not working when affecting cells are modified

因为我在功能使用ActiveCell,它自然尝试指的是活性的细胞。

我在网络上找到的所有解决方案都使用了ActiveCell方法,该方法在直接编辑单元时效果很好。但是当其中一个影响单元格被编辑时,它会失败。

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

回答

3

尝试使用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 
+1

或'Application.ThisCell'(非数组公式) –

+0

像魅力一样工作!谢谢。我也不知道应用程序。易挥发的功能,一个单独的谢谢:) – SercioSoydanov

+1

不客气,两次... – user3598756

相关问题