#630 テーブルに保存された式によって計算を行う方法 クエリ、VBA

テーブルのあるフィールドに「式」(Excelのセルの計算式のようなイメージのもの)をあらかじめ登録しておき、その式によってレコードごとに異なる計算、あるいはフィールドの値に応じて計算を行う例です。


まず、例として下図のようなテーブルを用意します。


ここでは、「Data1」(数値型)、「Data2」(数値型)、「Data3」(テキスト型)の各フィールドに任意の値が保存されています。

そして、「計算式」フィールドには上記3つのフィールド名を使った式が文字列として保存されています。

ここでは、「Data1」〜「Data3」にはユーザーがいろいろな値を入力することを想定していますが、「計算式」はあらかじめ固定的なものでかつ隠しフィールド的なものを想定します。


次に、このテーブルを元に次のようなクエリを作成します。


ここでは、『計算結果: CalcVal([計算式],[Data1],[Data2],[Data3])』という演算フィールドを作っています。テーブルにある4つのフィールド名を引数として指定して、ユーザー定義関数(Functionプロシージャ)である『CalcVal』を呼び出しています。


そして、そのプロシージャが次のようなものです。

Public Function CalcVal(strFormula As String, lngData1 As Long, lngData2 As Long, strData3 As String)

  Dim strCalcFormula As String

  '計算式に引数の値を埋め込む
  strCalcFormula = strFormula
  strCalcFormula = Replace(strCalcFormula, "[Data1]", lngData1)
  strCalcFormula = Replace(strCalcFormula, "[Data2]", lngData2)
  strCalcFormula = Replace(strCalcFormula, "[Data3]", """" & strData3 & """")

  '計算を実行して返り値に設定
  CalcVal = Eval(strCalcFormula)

End Function


ここでは、まず「計算式(strFormula引数)」の文字列内にある各フィールド名をこのプロシージャの引数値に置き換えています。

たとえば、計算式が「IIf([Data2] = 1, [Data1], [Data3])」で、3つの引数が「2」・「0」・「E」である場合、次のような置換が行われます。
  • 置換前 → 「IIf([Data2] = 1, [Data1], [Data3])」

  • 置換後 → 「IIf(0 = 1, 2, "E")」

そして、この置換後の値はまだ単なる文字列に過ぎませんので、それを「Eval」関数に掛けることで”式として評価”させ、その結果をプロシージャの返り値として返しています。


実行結果:
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved