2016-08-15 10 views
0

私のExcelで2枚のワークシートがあり、最初のシートではドロップダウンリストから計算方法を選択して計算用の変数を入力できます(青色の列は緑色のセルいくつかの一定数)。結果のエントリは、2番目のワークシート(データベース)から対応する計算式を検索し、シートに式を貼り付ける1、データベースのセルの代わりにシート1のセルを使用して計算する式が必要です。相対セルで返す式をExcelに変換する

enter image description here enter image description here

現在私は、以下のように評価呼び出されるユーザ定義関数を作成した:私は計算式からの細胞を使用する結果を取得するVLOOKUP :=Eval(VLOOKUP(A3,Database!A2:E10,5,FALSE))と評価を組み合わせることによって

Function Eval(ref As String) 
    Eval = Application.Evaluate(ref) 
End Function 

私のデータベースでは、計算中に計算式がシート1のセルを取る結果をどのように得ることができますか?

答えて

2

1つの簡単な方法は、このような1 CHOOSE内のすべての数式を使用することです:

Public Function eval(ref As String) 
    eval = Application.Caller.Parent.Evaluate(ref) 
End Function 

これは保証します:別のようApplication.Callerを使用することです

=IFERROR(CHOOSE(SUMPRODUCT(MATCH(A2,"Calculation "&ROW($1:$9),0)),B2*C2*D2,B2*C2-D2,B2+C2-D2,B2^2-C2+D2,B2*D2-C2^2,B2+C2*D2,B2*C2-C2*D2,B2-D2-C2*D2,C2-D2*B2),"") 

主参照者として使用する発信者の親(eval()の式を持つシート)の使用。

編集
「行」は数式では静的であることに注意してください。 「計算4」は5行目を使用します(最初のシートの数式の行は使用しません)。すべての行番号が##(または一意の識別子何でもあなたが好き)に変更する必要がありますが

=Eval(SUBSTITUTE(VLOOKUP(A3,Database!A2:E10,5,FALSE),"##",ROW())) 

:このためには、のようなものを使用することができます。そして、「計算1」は次のようになります。あなたはまだ、ちょうど:)

+0

こんにちはディルクを尋ねる、ご質問があるどうもありがとうございました場合は=B##*C##*D##

、私は投稿の質問は唯一の簡易版です。私は50以上の方程式を考慮する必要があります。その場合、選択式は非常に長くなります。しかし、2番目のケースでは、UDFを自分のモジュールに直接コピーすると何らかの理由で、以前のEval関数と同じように動作します。あなたは私にそのUDFに関するいくつかの追加のヘルプを提供していただけますか? –

+0

@LiuRoye 'Evaluate'関数はシートから実行され、アプリケーションからは実行されません。 'Sheets(" Sheet1 ")。Evaluate(...)のように使用すると、常に" Sheet1 "が使用されます。 'Application.Evaluate(...)'として直接使用すると、 'ActiveSheet'を使用します。複数のシートを使用すると、 'Application.Evaluate(...)'が極端に失敗する可能性があります。 Sheet2 A1 'A2'とA2 2で実行します。Sheet1 A2で '1'を入力します。 Sheet1で 'Sheet2!A1'を使用すると、' 1'が表示されます。しかし、シート2に行って「A1」を再入力してからシート1に戻った場合、数式に「2」が表示されます(私のコードはまだ1になるはずです) –

+0

@LiuRoyeこの問題を回避する最も良い方法は、 'Sheet1!B2 * Sheet1!C2 * Sheet1!D2'のような完全な参照。この方法で、あなたはそれが何であっても望むようにする必要があります;) –

関連する問題