• ベストアンサー

accessでテーブルに数式を保存し、クエリで演算

ID,a,b,sikiという4つのフィールドを持つテーブルを元に 下記のような結果となるクエリを作りたいのです。 数式を簡単に変更できるようにテーブルに保存しようと考えています。 テーブル ID  a  b  siki 1   1  2  [a]*100+[b] 2   2  2  [b]-3 3   2  4  [a]-700 クエリ実行結果 ID  kekka 1   102 2    -1 3    -698

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

補足:自作関数を利用しない方法! 式1: DLookUp(Replace(Replace([siki],"[A]",[A]),"[B]",[B]),"テーブル名") クエリのフィールドに直接に上記の式を書く。 PS、AccessのDLookup()はDBLookup()より3倍程処理時間がかかります。それだけの差です。

akashi-man
質問者

お礼

ありがとうございます。 いけそうです。 50件ほどのテーブルで使う予定ですので速度はそれほど問題にならないと思います。 replaceって使ったことないんですけど調べてみます。 ほんと助かりました。 ありがとうございました。

その他の回答 (5)

noname#212067
noname#212067
回答No.5

よく出来ました、パチパチパチ(拍手)

回答No.4

>関数を作ったことがない・・・。 Public Function DoKeisan(ByVal X As Double, ByVal Y As Double, ByVal Siki As String) As Double   Siki = Replace(Siki, "[A]", X)   Siki = Replace(Siki, "[B]", Y)   DoKeisan = DBLookup("SELECT " & Siki) End Function 先の DBLookup()を標準モジュールに登録すれば DoKeisan()は僅かに3行ですよ。

akashi-man
質問者

お礼

ありがとうございます。 「標準モジュールに登録」ってとこらへんから勉強してみます。 初質問に回答してもらえてうれしかったです。

回答No.3

補足:DoKeisan()の処理内容に関して。 それは、添付図を見れば一目瞭然です。 式の[A]と[B]とを実際の値に置換。 その後、それをSQL文として実行して結果を求めているだけです。 ただし、そこ場合にDLookup()は使用できませんので下に紹介する代替関数DBLookup()を使用します。 これで、DoKeisan()は僅か3行ほどで完成できる筈です。 Public Function DBLookup(ByVal strQuerySQL As String, _              Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup   Dim DataValue   Dim rst     As ADODB.Recordset   Set rst = New ADODB.Recordset   With rst     .Open strQuerySQL, _        CurrentProject.Connection, _        adOpenStatic, _        adLockReadOnly     If Not .BOF Then       .MoveFirst       DataValue = .Fields(0)     End If   End With Exit_DBLookup: On Error Resume Next   rst.Close   Set rst = Nothing   DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)   Exit Function Err_DBLookup:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBLookup End Function

akashi-man
質問者

お礼

回答ありがとうございます。 関数を作るというのはやったことがないので、すぐに実現するのは無理っぽいですので 強引にでも何か方法考えてみます。 一旦エクセルに渡して、答えをアクセスに戻す。 みたいな感じでいけるでしょうか。

noname#212067
noname#212067
回答No.2

関数化するとこまでは誰でも考え付きそうだが 関数に渡した式をどうやって計算するかってとこだな? 変数に入った式は計算出来ないが 変数に入った式と引数で計算結果を出力するクエリを作成 (テーブルを使用しないクエリ)し クエリの値を返す関数を作れば出来そうだな しかし、データが増えると遅くなりそうだが。。。。。

回答No.1

Q、下記のような結果となるクエリを作りたい。 A、祈、奮闘と成功! ? DoKeisan(1, 2, "[a]*100+[b]") 102 ? DoKeisan(2, 2, "[b]-3") -1 私だったら、DoKeisan() みたいな関数を考えるかな。

関連するQ&A

  • アクセス テーブル、クエリーについて

     アクセスでソフト作成中です。そこで教えてほしいことがあります。 たとえば下記のように2つのテーブルがあります。 テーブル1   テーブル2   フィールドA    フィールドB  a1       10  b1       20  c1       30          テーブル1の数値は固定します。そこで下記のようなクエリーを作成したいのです。 クエリー1 フィールドA フィールドB a1 10 b1 20 c1 30 テーブル2に数字を入れていくと テーブル1   テーブル2   フィールドA    フィールドB  a1       10  b1       20  c1       30           40 クエリー1 フィールドA フィールドB a1 40 b1 20 c1 30 このように数字が上書きされていくようなクエリーは作成できないでしょうか。(あくまでテーブル1の数値は固定、フィールドAとフィールドBにリレーションシップは設定されていない。) よろしくおねがいします。

  • 数値計算結果で更新するUPDATE文の書き方

    下記のようなテーブルに対して、KEKKAフィールドにSIKIの計算結果を入れたいと思っています。 --- 【TABLE_A】 SIKI VARCHAR(16) KEKKA NUMBER(5,2) SIKIには「1+(2*3)-4」といった数値計算式が入っています。 普通にselect 1+(2*3)-4 from dual とすれば返ってくる値をKEKKAに入れたいと思っています。また、SIKIフィールドには同じ値を持つレコードは存在しません。 いい方法があれば、ご教授ねがいます。

  • ACCESSのクエリ計算

    Access2003でクエリで特定条件に一致するIDを出して 今度はそのそれぞれのIDから+100(IDが2なら2~102の範囲でというように)の元のテーブルの 値の中からフィールド1が5以上の条件に一致するものの最小のIDをもとめたいと思ってます。 始めたばかりの初心者です DMINでできるのかなと思って下記式にしてみたのですが パラメーターエラーでうまくいかなくて、、 DMin("[テーブル1].ID","[テーブル1]","[テーブル1].ID>=[クエリ1].ID&[ID]<[クエリ1].ID+100&[テーブル1]フィールド2>5")

  • ACCESSのクエリで表示されるデータについて

    クエリで表示されるデータの範囲について教えてください。 <状況例> 例えばなのですが、取引先会社の管理データベースとして「テーブルA」と「テーブルB」があったとします。 「テーブルA]のフィールドは「会社ID」、「会社名」、「住所」とします。 「テーブルB]のフィールドは「連絡先ID」、「会社ID」、「担当者名」とします。 そして、「会社ID」をリレーションシップで繋いで、クエリで「テーブルA」「テーブルB」の全てのフィールドを表示したとします。 この時、「テーブルA」にデータが5つあり、「テーブルB」にはデータが2つしかなく、結果リレーションシップを通じて対をなすデータが2つしかない場合には、クエリでは2つしかデータが表示されないと思います。 <質問> クエリではリレーションシップで対をなさないデータは無効となるようですが、対をなさないデータも全てクエリで表示する方法はないのでしょうか。 上記例でいうと、「テーブルA」のデータ5件全てについて表示させたいのですが。もちろん、「テーブルA」のデータ中対をなしていないものについては、「テーブルB」のフィールド内容については「空白」での表示となりますが。

  • Access のクエリの一時保存

    Access でテーブルから様々な処理をしてクエリを作成しているのですけれども、 クエリが終了するまで時間がかかってしまいます。 普段、そのクエリに対して、データの取得等をすることが多いので、 毎回、クエリが実行されるのは非効率です。 もともとテーブル自体、それほど更新するわけではないので、 クエリを行った結果をどこかに保存しておいて、テーブルが変更されたときのみ、 クエリが実行されるというようなことは、Access ではできないのでしょうか? また、ほかの DB では、そのような機能があるものなのでしょうか? あまりデータベースに対して詳しくないので、教えていただければと存じます。

  • Microsoft Accessでどうしても上手くいきません。

    (1)テーブル作成クエリ クエリA で テーブルB を作ります。 (2)テーブルB にフィールドを一つ追加して、変更を保存 (3)テーブルB のレコードを削除 (4)クエリA を 追加クエリ に変更 で追加クエリAを実行すると、入力規則違反でレコードの追加ができません。 追加するフィールドは、オートナンバー型です。 以前は同様の作業で成功したんですけど・・・ すみません助けてください

  • ACCESSで複数テーブルのクエリ抽出

    ACCESSで複数テーブルのクエリ抽出 初めて投稿させてもらいます。 テーブル1・・・社員ID(主キー)、氏名 テーブル2・・・社員ID(重複キー有)、顧客ID テーブル3・・・社員ID(重複キー有)、得意先ID テーブル4・・・顧客ID、顧客氏名 テーブル5・・・得意先ID、得意先 上記のテーブル内容を1つのクエリで全部抽出するとき、 テーブル1の社員ID[a]とテーブル2の社員ID[a] と テーブル1の社員ID[a]とテーブル3の社員ID[a] を分けて抽出する方法ってありますか? クエリの結合プロパティで テーブル2の全レコードとテーブル1の同じ結合フィールドと テーブル3の全レコードとテーブル1の同じ結合フィールドにすると 「あいまいな外部接続が含まれているのでSQLを実行出来ません」とエラーになり、 テーブル1の全レコードとテーブル2の同じ結合フィールドと テーブル1の全レコードとテーブル3の同じ結合フィールドにすると 社員ID[a]、顧客ID[1]、得意先ID[α]、顧客氏名[吉田]、得意先[○○商事] 社員ID[a]、顧客ID[1]、得意先ID[β]、顧客氏名[吉田]、得意先[△△金融] みたいになってしまうのです。 やりたい結果は 社員ID[a]、顧客ID[1]、得意先ID["空欄"]、顧客氏名[吉田]、得意先["空欄"] 社員ID[a]、顧客ID["空欄"]、得意先ID[β]、顧客氏名["空欄"]、得意先[△△金融] 説明下手ですいませんが、ご教授の程よろしくお願いします。

  • 【Access】2つのクエリを1つにまとめる方法

    下記のT_Subテーブルでmain_idフィールド毎のdayフィールドの最大値のレコードを取得し、 取得したレコードの中でT_Mainのidフィールドに存在するもののみを表示したいと思い、 下記のQ_T_Sub_SelectクエリとQ_Ansクエリを作成し、 Q_Ansクエリを実行する事で意図した動作になったと思います。 その後、この2つのクエリを1つのクエリにまとめようと思ったのですが、 どのように記述すれば良いか分からなかった為、アドバイスいただける方がいらっしゃいましたら、 ご教示の程よろしくお願いします。 【Q_T_Sub_Selectクエリ】 SELECT T_Sub.* FROM T_Sub WHERE (((T_Sub.id)=(SELECT TOP 1 id FROM T_Sub Q WHERE Q.main_id = T_Sub.main_id ORDER BY day DESC, id DESC ))); 【Q_Ansクエリ】 SELECT T_Main.id, T_Main.field1, Q_T_Sub_Select.id, Q_T_Sub_Select.day, Q_T_Sub_Select.field2 FROM T_Main LEFT JOIN Q_T_Sub_Select ON T_Main.id = Q_T_Sub_Select.main_id; 【Q_Ansクエリの実行結果】 T_Main.id|field1|Q_T_Sub_Select.id|day|field2 1|A|2|     |2000 3|C|6|2011/03/10|200 【テーブル(T_Main)】 id|field1 1|A 3|C 【テーブル(T_Sub)】 id|main_id|day|field2 1|1|     |100 2|1|     |2000 3|2|2011/03/04|400 4|2|2011/03/03|500 5|3|2011/03/10|300 6|3|2011/03/10|200 なお、1つのクエリにまとめたい理由ですが、最終的にはクエリではなく、 Visual Basic上に記述を移植したいと思っているためです。 ちなみに、1つのクエリをVisual Basic上に移植して SQLの実行結果を利用するイメージは何となく分かるため、 2つのクエリを1つにまとめる方法を希望しましたが、 2つのSQL文があってもクエリなどを使用せず、 Visual Basic上への記述のみで動作する方法があれば、そのような方法でも大丈夫です。 以上、よろしくお願いします。

  • アクセスの追加クエリについて

    二つのテーブル間(AとB)を追加クエリを使い AからレコードをBに追加することは出来たんですが、 逆にBからAにレコードを追加しようと選択クエリを追加クエリに変更しようとしたんですが、ウィザードの追加先テーブル名にAのテーブル名が表れないですがその理由が全く分からないので分かる方教えていただけませんか? AとBのレコード内のフィールドは同じです。 AからBにレコードを移行する処理としてマクロを使いアクションとして ・クエリを開く(これは追加クエリです) ・SQLの実行(上と同じクエリを削除クエリに変更し、そのSQL文をSOLステートメントに貼り付けました) 上の処理は問題なく出来たので逆のBからAへレコード移行処理のマクロを作ろうとしたのですが、追加クエリの追加先テーブルにテーブルAの名前が出てこないので困っています。こういったAからB。BからAという処理は追加クエリで出来ないのでしょうか?

  • Accessのクエリ実行について

    すみません。ご存知でしたら、教えてください。 まず一点、基本(?)を確認させてください。 下記のように数個のテーブルとそれらを使用した数個のクエリがあったとします。 下記の場合に、もしどれかのテーブルを更新したとします。 その場合、アクセスを立ち上げて、クエリ3を実行するだけで、結果には反映されているのでしょうか?それとも、アクセスを立ち上げて、 クエリ1を実行し閉じ、クエリ2を実行し閉じ、最後にクエリ3を実行しないと、反映されていないのでしょうか? --------------------------------------------------------- テーブルリンクA 、テーブルリンクB、テーブルリンクC、テーブルリンクD ↓↓ テーブルAとテーブルBでクエリ1(マッチング)を作成 テーブルCとテーブルDでクエリ2(マッチング)を作成 ↓↓ クエリ1とクエリ2でクエリ3(マッチング)を作成 ------------------------------------------------- 続いて、もし上記でいちいち途中のクエリを実行しないと、 最後のクエリに反映されない場合、すべてをACCESSを立ち上げたと同時に自動実行し、自動で最後のクエリ(この場合、クエリ3)をエクスポートしたいと考えています。可能でしょうか? 素人な質問ですみません。 何卒よろしくお願いいたします。

専門家に質問してみよう