web-dev-qa-db-ja.com

文字列を数式のように評価するExcel関数?

セルに"11+5"または"=11+5"のようなテキスト文字列が格納されているとします。その文字列を数式のように実際に評価できるExcelの関数はありますか?

これは、Excelで「動的」な数式を記述できるようにする別のプロジェクトに役立ちます。

29
drapkin11

EVALUATEは、現在のすべてのバージョンのVBAで使用できます

VBAコードに含めることも、単純なUDFにラップしてワークシート関数として使用できるようにすることもできます。

Function ev(r As Range) As Variant
    ev = Evaluate(r.Value)
End Function

これは基本的に、渡されたパラメーターの値を、セルに入力された場合と同じようにExcelの数式として扱います

"11+5"および"=11+5"は同じ結果になります

26
chris neilsen
=evaluate(put_reference[s]_here)

これは半機能です。NameManagerでonlyを使用できます。

これを使用する方法は次のとおりです。

  • セルをポイントしてName Managerを開きます([フォーミュラ]タブから、またはCTRL + F3をクリックして)

    Evaluate Example

  • =evaluate(と入力して、目的のセルをクリックします(相対参照を維持するのに最適です)。

  • 数式を)で終了します
  • 名前を付けますこの例ではevaと呼びます)。
  • ---([〜#〜] ok [〜#〜]をクリックします。

ここで、B1を選択し、これらすべてをA1を参照するようにしたとします。 A1では、1 + 1"およびB1で=evaと記述します-Enterキーを押すと、B1の値は2になります。NameManagerでの参照は相対的であったため、=evaを使用して必要な場所から1セル残ったセルの評価(たとえば、B2では、=evaはセルA2の結果を返します)

19

@karelと@Laurentiu Miricaからのすばらしい回答には重要な警告があります:参照されたセルが変更されない限り、評価関数は再計算されません。たとえば、セルC1にはテキスト_"A1+B1"_が含まれ、D1には関数_=eval_が含まれます。 A1またはB1の値が変更された場合、セルD1は再計算されません

Demonstration of eval problem

これは、文字列または評価セルに揮発性関数を導入することで修正できます。これにより、ワークシートが再計算されるたびに再計算が強制されます。たとえば、セルC1は=if(today(),"A1+B1",)に置き換えることができます。または、D1を=if(today(),eval,)に置き換えることもできます。揮発性関数はすべて実行する必要があります。

3番目の、おそらく最も簡単な解決策は、ネームマネージャの半関数を=if(today(),evaluate(c1),)に変更することです。

7
jlear
=indirect()

これをセルで(連結と一緒に)使用すると、非常に便利です。

たとえば、次の数式は別のワークシートのセルB5の値を表示します(その名前はこのワークシートのセルA2に格納されています)。

=INDIRECT(CONCATENATE(A2,"!B5"))

INDIRECTを機能させるには、外部ワークシートを開いておく必要があります。

5
user206351

文字列を数式のように実行する拡張機能。上記のev()関数から拡張された関数。

新しい関数名:EvaluateEx()

  • 関数をExcel VBAモジュールに貼り付けます。
  • 関数名をワークシートのセルに配置します。

呼び出し構文の例:* = EvaluateEx( "= 11 + 5")* = EvaluateEx( "= g1 + g2")+ evaluateEX( "2 + 3")* = EvaluateEX( "定義名")

機能テスト済み:

  • 構造化テーブル参照
  • テキストを参照する定義名、
    filter()関数など.

    Function evaluateEx(r As Variant) As Variant
    'Note: Renaming function requires same change after the ExitFunction label.
    'User Function to evaluate string as formula.
     Dim ev As Variant
    
       Select Case TypeName(r)
    
           Case "Range"
                If r.Value <> vbNullString And Trim(r.Value) <> "=" Then
                   ev = Evaluate(r.Value)
                Else
                   ev = r.Value
                End If
    
           Case "String"
                If r <> vbNullString And Trim(r) <> "=" Then
                   ev = Evaluate(r)
                 Else
                   ev = r
                 End If
    
           Case "Variant()"
                 ev = r
    
           Case "Double"
                 ev = r
    
           Case "Error"
                 ev = "Defined Name not found in list of Defined Names. Cannot Evaluate"
    
           Case Else
                 ev = "Unknown parmeter type. Cannot Evaluate"
        End Select
    
        On Error GoTo ExitFunction 'Handle possible type mismatch
        If ev = CVErr(2029) Then
                 'ev = "The parameter passed to the EV function results in a value (i.e. " & r & ") that cannot be evaluated by the EV function."
                  ev = r
        End If
    
    ExitFunction:
    
        evaluateEx = ev
    
    End Function
    
1
Gary Rosner