2017-02-27 8 views
1

私はこのVBAコードを作成しようとしていますが、解決策を見つけることができませんでした。現在の行が5以下OR Excel VBA - 数式が書かれているセルを参照します。

  • ある上部隣接の値を取得した場合、

    • が同じ列に2列までのセルの値を取得します:

      Iは、式を有する必要がありますセル、現在の行が6以上の場合

    数式がセルE5に書き込まれている場合は、 E3の値を取得する必要があります。数式がセルE6に書き込まれる場合は、E5の値を取得する必要があります。次に、その値を状況に応じて他の数式の入力として使用するか、結果として使用します。

    実は私はワークシートの数式を次のように私が望むものを達成することができる午前:

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

    これは単独で使用するとしたら、それはOKだったが、これは大きな、入れ子の一部になるだろう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

    しかし、私はこの式を用いて細胞に影響を与える細胞を変更しようとすると、それは私のセルを参照しようと私は、関数内でActiveCellを使用しておりますので、現在

    Not working when affecting cells are modified

    を修正しています、それは自然にアクティブであるセルを参照しようとします。

    ウェブで見つかったすべての解決策は、ActiveCellアプローチを使用しています。これは、セルを直接編集すると効果的です。しかし、影響を受けるセルの1つが編集されると失敗します。

    したがって、実際のセルに数式が書き込まれていることをどのように参照できますか?

  • 答えて

    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

    チャームのように働いた!ありがとう。私はまた、アプリケーションについて知りませんでした。揮発性関数、その1つの別のおかげで:) – SercioSoydanov

    +1

    あなたは歓迎です、2回... – user3598756

    関連する問題