Excel評価関数は、間接使用時に#REFを返します

私は特定のセルの値に応じて、テキストとして数式を返す検索を持っています。

返される式(テキスト)は次のようになります。

SUM(INDIRECT("AF"&row()),INDIRECT("AG"&row()))

次に、式を評価するために EVALUATE()関数を使用しますが、 INDIRECT()を使用するため#REFエラーが発生します。

This Microsoft Support Page was the only reference that I could find to this particular problem, and it doesn't seem to offer an appropriate workaround.

a)間接の使用を避けるために数式を再構成するか、b)素敵な演奏のために EVALUATE()を取得するにはどうすればよいですか?

編集

ルックアップテーブルは次のようになります。

Type A                    SUM(INDIRECT("AF"&row()),INDIRECT("AG"&row()))
Type B                    SUM(INDIRECT("AF"&row()),INDIRECT("AG"&row()), INDIRECT("AH"&Row()))

別のシートでは、セルB1:200の内容はタイプAまたはタイプBのいずれかです。ルックアップはセルの値に基づいて数式文字列を返し、Bxに配置します。私は結果を与えるために文字列を評価します。

0
XLMマクロの一部として、またはワークシートのセルでevaluate()を使用していますか?
追加された 著者 Tim Williams,
ルックアップを表示できますか? row()のコンテキストが何であるかははっきりしない。私は間接的で評価が必要なのかどうかは分かりませんが、どちらも同じような目的に役立ちます...
追加された 著者 Tim Williams,
= EVALUATE(SUM(INDIRECT( "A"&ROW())、INDIRECT( "B"&ROW()))))の参照名で定義された名前を使用すると私にとって問題なく動作します。
追加された 著者 Charles Williams,
可能であれば、 ROW はその引数に基づいて配列を返します。つまり、 ROW()は、現在選択されている行番号を持つ1要素配列を返します。 ROW(a42:q99)は{42; 43; ...; 99}、など私はExcelを持っていないのでちょうどコメントこれを混乱させる...
追加された 著者 jtolle,
私は実際に名前付きの範囲でそれを使用しています。次にそれをセルから呼び出します。
追加された 著者 Andy F,
@Tim、ルックアップテーブルで私の編集を見てください。 INDIRECTは式を評価せず、テキストのみをセル参照として解釈します。だからこそ私は両方が必要です。
追加された 著者 Andy F,
@チャールズ、確か。セルC1にテキスト「typeA」を配置します。値1と2をそれぞれセルA1とB1に配置します。あなたが提案した数式で "typeA"と呼ばれる新しい名前付き範囲を追加してください。さて、セルD1に数式=間接(C1)を配置します。 #REFエラーが表示されます。さて、もし私が "typeB"、 "typeC"などのような名前を持つ複数の名前付き範囲を持っていて、それぞれが異なるSUM式を持っているとしたら、 C1に入力した値に応じて、セルD1にSUMを表示できるようにします。
追加された 著者 Andy F,

4 答え

OK 3回目の回答:

例のおかげで:これは、あなたが名前付き数式を評価するためにINDIRECTを使用しようとしており、INDIRECTが数式ではなく参照のみを処理しようとしているために失敗します。

You need to use EVALUATE instead, but there is no built-in EVALUATE worksheet function (the EVALUATE you are using in the defined name is an ancient XLM Macro function).
I suggest you use my EVAL VBA UDF instead

Public Function EVAL(theInput As Variant) As Variant
'
' if UDF evaluate the input string as though it was on this sheet
' else evaluate for activesheet
'
Dim vEval As Variant
Application.Volatile
On Error GoTo funcfail
If not IsEmpty(theInput) then
If TypeOf Application.Caller.Parent Is Worksheet Then
vEval = Application.Caller.Parent.Evaluate(Cstr(theInput))
Else
vEval = Application.Evaluate(cstr(theInput))
End If
If IsError(vEval) Then
EVAL = CVErr(xlErrValue)
Else
EVAL = vEval
End If
End If
Exit Function
funcfail:
EVAL = CVErr(xlErrNA)
End Function

typeA = SUM(Sheet3!RC1、Sheet3RC2)のような相対参照で定義された名前を使用します。

There are some "quirks" of EVALUATE that you should be aware of: see
http://www.decisionmodels.com/calcsecretsh.htm

2
追加された
これは、私が手に入れようとしていたものに最も近い結果であるようです。あなたの助けと忍耐力に感謝します。
追加された 著者 Andy F,

Charlesの答えを拡張するには:この関数は検索を行い、行番号を評価します。私は数式(あなたの例では)最終的な結果を返すセルと同じ行から特定の値を合計することを意図していると仮定しています。

私のルックアップテーブルは次のようになります:

TypeA   SUM(B ,D) 
TypeB   SUM(C,D)

UDF:

Public Function GetAndRunCalc(CalcType As String)
Application.Volatile
    Dim ac As Object, rw, f

    On Error GoTo haveError

    If TypeOf Application.Caller.Parent Is Worksheet Then
        Set ac = Application.Caller
        rw = ac.Parent.Range(ac.Address).Row
        'adjust for your lookup table...
        f = Application.VLookup(CalcType, Sheet1.Range("B4:C5"), 2, False)
        If Not IsError(f) Then
            f = Replace(f, "", rw)
            GetAndRunCalc = ac.Parent.Evaluate(f)
        Else
            GetAndRunCalc = "Type??"
        End If
    Else
        GetAndRunCalc = "Must be called from worksheet cell"
    End If

    Exit Function

haveError:
    GetAndRunCalc = CVErr(xlErrValue)

End Function 
0
追加された

If I understand what you are trying to do correctly, why not get the resukt directly from the cell ..
I don't think you need indirect because you just need the text of the formula
(altho I am not sure what the ROW() is supposed to be doing)
SUM("AF"&row(),"AG"&row())

0
追加された
Charles、row()は現在の行への参照を取得します。残念ながら、そのようなSUMを構築することは、あなたのテキストをセルとして解釈するために間接的に必要となるため、機能しません。これは、= SUM( "AF2"、 "AG2")とは動作しない= SUM(AF2、AG2)の違いです。
追加された 著者 Andy F,

If you just want to use a Defined Name to add column AF and AG on the current row then just use relative references (easier to define in R1C1 mode, then switch back to A1) Defined Name AndySum has Refersto formula of =SUM(RC32,RC33)
Then wherever you use AndySum in a formula it will add the contents of columns AF and AG on that row.

0
追加された
では、IFまたはCHOOSEでLookup式を使用して、定義済みの名前のさまざまな味の中から選択してみましょう
追加された 著者 Charles Williams,
13- 13- 13- following-装置装置following- following----装置---following-- 13-装置-装置---following following-- following装置--装置--装置following装置following装置--following 13 following-- 13 13 following装置--13 following- 13-- 13---装置following following 13 following following- 13 following 13 following--- 13装置13- following following following装置following following 13-装置-following following- following following-- 13 following 13 following following- 13- following-装置13-- 13--装置--装置--following- following--装置--following--装置装置-following----装置13- following 13-装置-following-- following-- following---装置--装置following- following following following-装置-following-- 13装置装置装置following following following following following following装置following following- following装置13装置装置following 13装置following-装置following装置following following following 13装置装置装置装置装置装置装置装置装置装置13装置following following--- 13--お待ち頂きまして、ありがとうございます。
追加された 著者 Andy F,
ルックアップテーブルに数百のタイプがあり、数百の定義された名前とスーパーの長いIFの式につながります...
追加された 著者 Andy F,