- 締切済み
アクセスでの計算式について
建築設計事務所で積算の仕事にExcelを使ってましたが、データ量が多くなるにつれて使い勝手が悪くなったためアクセスに移行しようと思い格闘中です。 簡単にできると思っていた計算式の扱いが分からずに困っています。 積算では建物の構成部材の個数、長さ、面積、体積を部位別に計算して累計するのですが、18.5*11.8-1.2*1.5 などの計算式をそのままレコードとして格納し、かつその答え(この場合は216.5)に複数の部材(下地と仕上げなど)を関連付けるにはどのようにしたら良いのでしょうか? 宜しくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
>計算式をそのままレコードとして格納し の意味が良くわかりません。 既出回答も2つに分かれているようです。質問の書き方がテーブルなりに即していない書き方で、わかりにくいのでは無いですか。 各レコード(テーブルの1行1行)ごとに、計算式の型(引数の数、引数の内容、演算の型など)が一定ではないのですか? それならEvaluate的な発想での解決となる。 同じ型なら、フィールド名を、変数名とかエクセルのセル番地みたいな考えで出来る。クエリの計算式かSQLの計算式にタイプは組み込まれ 反映される(する) 問題はエクセルより相当使える関数の素ウが少ないこと、名前は同じで別の内容の処理をするものが少数あることを注意すればよい。
- Dxak
- ベストアンサー率34% (510/1465)
要望している内容から・・・ Eval 関数 - Microsoft Office Online http://office.microsoft.com/ja-jp/access/HA012289421041.aspx を使用することになるかと思います しかし、この関数は、クエリ上に直接使用不可のため、ユーザ関数化して、使用してください これで、答えを使用する部分は判ると思いますが・・・ 関連付けるのは、その先のテーブル構造で、 数量テーブル 構成部材コード 数量(計算式) 歩掛テーブル 構成部材コード 歩掛 単価 の組み合わせで、数量×歩掛で計算、使用材数量を算出、単価と掛け合わせて、計を出すと言うのを、クエリ上で作成して行く事になります で、大体、想像可能?
お礼
早速の回答ありがとうござます。 Eval関数で解決できるような気がします。 頑張ってみます。
tab1: テーブル [ID]__[A__]_[B___]_[C__]_[D__] __1___18.5___11.8___1.2___1.5 __2___19.5___12.8___2.2___1.5 __3___20.5___13.8___3.2___1.5 クエリ1: クエリ [ID]__[A__]_[B___]_[C__]_[D__]_[積算] __1___18.5___11.8___1.2___1.5___216.49 __2___19.5___12.8___2.2___1.5___248.28 __3___20.5___13.8___3.2___1.5___278.07 上のような計算データが登録されている場合、次のように計算させます。 SELECT *, Rounds(CCur([A])*CCur([B])-CCur([C])*CCur([D]),0,2) AS 積算 FROM tab1; Rounds(数字, 端数処理の指示, 端数処理後の桁数) 端数処理の指示=0・・・四捨五入 端数処理の指示=1・・・切り捨て 端数処理の指示=2・・・切り上げ もちろん、次のように書くことも可能です。 SELECT 積算式1([A],[B],[C],[D]) AS 積算, * FROM tab1; この場合、積算式1()という関数に値を渡すだけです。 このように関数は、式という計算手続きを予め定義しブラックボックスにします。 Public Function 積算式1(ByVal A As Double, _ ByVal B As Double, _ ByVal C As Double, _ ByVal D As Double) As Double 積算式1 = Rounds(CCur(A) * CCur(B) - CCur(C) * CCur(D), 0, 2) End Function これは標準モジュールに登録します。 Public Function Rounds(ByVal M As Currency, _ ByVal A As Integer, _ Optional D As Integer = 0) As Variant Rounds = Sgn(M) * Fix(Abs(M) * 10 ^ D + Abs((A = 0) * 0.5@ + (A = 2) * (Int(M * 10 ^ D) <> (M * 10 ^ D)))) / 10 ^ D End Function なお、Access には RoundDown()、RoundUp()がありません。 ですから、こういう関数を自作して用意する必要があります。
お礼
早速の回答ありがとうございました。
- lensent
- ベストアンサー率20% (5/24)
こんにちは、 ちょっと理解しづらいのですが、 18.5*11.8-1.2*1.5の計算があるようですので、 構成部材の個数、長さ、面積、体積、それぞれのテーブルと 組み合わせのテーブルを用意し 組み合わせのテーブルに 18.5、11.8、1.2、1.5の項目が関連付けされているようにすれば できそうな気がしますが。
お礼
早速の回答ありがとうございました。
お礼
早速の回答ありがとうございます。 質問の書き方が悪くてすみません。 計算式をそのままレコードとして格納 というのは計算式の確認が頻繁に必要になるため答えだけでなく式そのものを残したいという意味です。積算の場合質問にあげた計算式は1例でそのつど違ってきます。 (例:床の面積 15*12 壁1面の面積 15*2.4-1.9*2) No3の回答者さんからもEval関数を教えていただきましたのでもう一度勉強しなおしてみます。 他にヒントになることがありましたら再度教えていただけたらと思います。