2017-02-27 238 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

相關問題