Microsoft Access 掲示板

ユーザーが入力した計算式で結果を算出するには

4 コメント
views
4 フォロー

よろしくお願いいたします。

テーブルAに、データ型が「短いテキスト」のフィールドAがあります。
そのフィールドは、ユーザーが入力した計算式があります。(例)W04 × 1.5 + W03 × 2+5000

テーブルBにW04、W03の具体的な数値を格納してあります。

ID単価
W011000
W022000
W033000
W044000
W055000

具体的な数値を当てはめて計算結果を出したいと思っています。
例でいえば、4000 × 1.5 + 3000 × 2 + 5000 = 17000

クエリにて自作関数等で計算結果を出したいのですが、どのようなコードを記述してよいかアドバイスをいただければと思います。
よろしくお願いいたします。

あん
作成: 2024/10/11 (金) 13:32:36
最終更新: 2024/10/11 (金) 13:34:16
通報 ...
1
hiroton 2024/10/11 (金) 15:42:13 83175@f966d

Eval 関数が使えるかもしれません

ただし、入力した文字列がVBAの計算式として認識できる場合なら計算結果を求めることができるというものになるので、当然ながら全角の「×÷」等はそのままでは使えません

IDを数値に変えるのはDLookup 関数でテーブルを参照すればいいでしょう

ただし、入力した文字列の中のどの部分がIDに相当するか?を判断する必要があります

IDの大文字小文字、全角半角が正しく扱えるか?はデータベースの設定に依存する場合があります。数字も数値として認識できるか?は細かな調整が必要になるでしょう

1.入力された文字列を計算式としての「項」と「演算子」に分解する
2.「項」がそのまま使える数値なのか、IDを参照する文字列なのか判定し、必要に応じてテーブルから数値を拾い出し置き換える
3.「演算子」をACCESS(VBA)で認識できる文字に置き換える
4.Eval関数で計算する

「()」(演算の優先順位指定)や「cos()」(よく使われる数学関数)等を考慮していません
「ユーザーが入力した計算式」にどこまでの自由度を設けるかで内容の複雑さが変わります。想定されるパターンの洗い出しが必要になるでしょう

2
あん 2024/10/11 (金) 16:12:17 b41ab@3e84a

hiroton様
ご回答ありがとうございます。

質問で、計算式の例で、「×」を用いましたが、サイトでの表示に問題があったため、アスタリスクをあえて「×」に書き換えました。本来はアスタリスクです。

また、ユーザーの式自体は、+、-、×、÷と()でのくくりくらいの単純な計算式となります。
もともと、業務用ソフトでユーザーが式を作成・使用され、認識されていた式です。式データをエクスポートしたかたちです。
計算式として認識できない場合は、空欄としようと思っています。

テーブルBに関しては、レコードが8個固定となります。
単価のみ書き換わることがあるくらいです。

Eval関数使って、やってみます。あと、Dlookupも。

また、やってみた結果をお伝えさせていただきますね。

3
hiroton 2024/10/11 (金) 17:32:41 b198c@04b3a

単純な式にしかならないのであれば、手入力の問題をどの程度補正するかもありますが、

テーブルBをレコードセットで取得して全レコードループさせて、IDを数値に置き換えるReplace(計算式, rs!ID, rs!単価)

なんて方法でもいいかもしれません
計算式が正しいとしてもID部分だけ取り出すのは結構面倒だと思うので、8個くらいの変換なら、存在をチェックせずそのまますべて変換するという楽をしてもいいと思います

処理を何度も繰り返すような場合は、テーブルBを何度もレコードセットにとる(テーブルのOpen、Closeが繰り返される)ようなことがないように気を付ける必要があるかもしれません

4
あん 2024/10/28 (月) 14:27:57 b41ab@331d4

hiroton様

お返事遅くなり、すみません。

結局、hiroton様の Replace(計算式, rs!ID, rs!単価)をループさせるやり方を行ないました。
そして、Eval関数。

おかげ様で、無事、計算結果が算出されました。
ありがとうございました。