セルに"11+5"
または"=11+5"
のようなテキスト文字列が格納されているとします。その文字列を数式のように実際に評価できるExcelの関数はありますか?
これは、Excelで「動的」な数式を記述できるようにする別のプロジェクトに役立ちます。
EVALUATE
は、現在のすべてのバージョンのVBAで使用できます
VBAコードに含めることも、単純なUDFにラップしてワークシート関数として使用できるようにすることもできます。
Function ev(r As Range) As Variant
ev = Evaluate(r.Value)
End Function
これは基本的に、渡されたパラメーターの値を、セルに入力された場合と同じようにExcelの数式として扱います
"11+5"
および"=11+5"
は同じ結果になります
=evaluate(put_reference[s]_here)
これは半機能です。NameManagerでonlyを使用できます。
これを使用する方法は次のとおりです。
セルをポイントしてName Managerを開きます([フォーミュラ]タブから、またはCTRL + F3をクリックして)
=evaluate(
と入力して、目的のセルをクリックします(相対参照を維持するのに最適です)。
)
で終了しますeva
と呼びます)。ここで、B1を選択し、これらすべてをA1を参照するようにしたとします。 A1では、1 + 1"およびB1で=eva
と記述します-Enterキーを押すと、B1の値は2
になります。NameManagerでの参照は相対的であったため、=eva
を使用して必要な場所から1セル残ったセルの評価(たとえば、B2では、=eva
はセルA2の結果を返します)
@karelと@Laurentiu Miricaからのすばらしい回答には重要な警告があります:参照されたセルが変更されない限り、評価関数は再計算されません。たとえば、セルC1にはテキスト_"A1+B1"
_が含まれ、D1には関数_=eval
_が含まれます。 A1またはB1の値が変更された場合、セルD1は再計算されません。
これは、文字列または評価セルに揮発性関数を導入することで修正できます。これにより、ワークシートが再計算されるたびに再計算が強制されます。たとえば、セルC1は=if(today(),"A1+B1",)
に置き換えることができます。または、D1を=if(today(),eval,)
に置き換えることもできます。揮発性関数はすべて実行する必要があります。
3番目の、おそらく最も簡単な解決策は、ネームマネージャの半関数を=if(today(),evaluate(c1),)
に変更することです。
=indirect()
これをセルで(連結と一緒に)使用すると、非常に便利です。
たとえば、次の数式は別のワークシートのセルB5の値を表示します(その名前はこのワークシートのセルA2に格納されています)。
=INDIRECT(CONCATENATE(A2,"!B5"))
INDIRECTを機能させるには、外部ワークシートを開いておく必要があります。
文字列を数式のように実行する拡張機能。上記のev()関数から拡張された関数。
新しい関数名:EvaluateEx()
呼び出し構文の例:* = 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