よろしくお願いいたします。
テーブルAに、データ型が「短いテキスト」のフィールドAがあります。
そのフィールドは、ユーザーが入力した計算式があります。(例)W04 × 1.5 + W03 × 2+5000
テーブルBにW04、W03の具体的な数値を格納してあります。
ID | 単価 |
---|---|
W01 | 1000 |
W02 | 2000 |
W03 | 3000 |
W04 | 4000 |
W05 | 5000 |
具体的な数値を当てはめて計算結果を出したいと思っています。
例でいえば、4000 × 1.5 + 3000 × 2 + 5000 = 17000
クエリにて自作関数等で計算結果を出したいのですが、どのようなコードを記述してよいかアドバイスをいただければと思います。
よろしくお願いいたします。
Eval 関数が使えるかもしれません
ただし、入力した文字列がVBAの計算式として認識できる場合なら計算結果を求めることができるというものになるので、当然ながら全角の「
×
÷
」等はそのままでは使えませんIDを数値に変えるのはDLookup 関数でテーブルを参照すればいいでしょう
ただし、入力した文字列の中のどの部分がIDに相当するか?を判断する必要があります
IDの大文字小文字、全角半角が正しく扱えるか?はデータベースの設定に依存する場合があります。数字も数値として認識できるか?は細かな調整が必要になるでしょう
1.入力された文字列を計算式としての「項」と「演算子」に分解する
2.「項」がそのまま使える数値なのか、IDを参照する文字列なのか判定し、必要に応じてテーブルから数値を拾い出し置き換える
3.「演算子」をACCESS(VBA)で認識できる文字に置き換える
4.Eval関数で計算する
「()」(演算の優先順位指定)や「cos()」(よく使われる数学関数)等を考慮していません
「ユーザーが入力した計算式」にどこまでの自由度を設けるかで内容の複雑さが変わります。想定されるパターンの洗い出しが必要になるでしょう
hiroton様
ご回答ありがとうございます。
質問で、計算式の例で、「×」を用いましたが、サイトでの表示に問題があったため、アスタリスクをあえて「×」に書き換えました。本来はアスタリスクです。
また、ユーザーの式自体は、+、-、×、÷と()でのくくりくらいの単純な計算式となります。
もともと、業務用ソフトでユーザーが式を作成・使用され、認識されていた式です。式データをエクスポートしたかたちです。
計算式として認識できない場合は、空欄としようと思っています。
テーブルBに関しては、レコードが8個固定となります。
単価のみ書き換わることがあるくらいです。
Eval関数使って、やってみます。あと、Dlookupも。
また、やってみた結果をお伝えさせていただきますね。
単純な式にしかならないのであれば、手入力の問題をどの程度補正するかもありますが、
テーブルBをレコードセットで取得して全レコードループさせて、IDを数値に置き換える
Replace(計算式, rs!ID, rs!単価)
なんて方法でもいいかもしれません
計算式が正しいとしてもID部分だけ取り出すのは結構面倒だと思うので、8個くらいの変換なら、存在をチェックせずそのまますべて変換するという楽をしてもいいと思います
処理を何度も繰り返すような場合は、テーブルBを何度もレコードセットにとる(テーブルのOpen、Closeが繰り返される)ようなことがないように気を付ける必要があるかもしれません
hiroton様
お返事遅くなり、すみません。
結局、hiroton様の Replace(計算式, rs!ID, rs!単価)をループさせるやり方を行ないました。
そして、Eval関数。
おかげ様で、無事、計算結果が算出されました。
ありがとうございました。