• ベストアンサー

Access VBA 抽出したレコードをフィールドを増やして別テーブルに追加する方法

2つのクエリーで抽出したレコードを結合し、そのレコードにID番号をつけて別のテーブルに追加することはできないでしょうか? 1枚のガラスの値段表を作りたいと考えています。 使用するテーブルは、1つ目がサイズ表でサイズ番号と2つの辺の長さの3つのフィールドからできています。2つ目はガラスの種類表で種類番号と種類名の2つのフィールドでできています。3つ目は値段表で上の2つの表の5つのフィールドにID番号と値段の2つのフィールドがあり全部で7つのフィールドです。 いま、フォームにサイズ表と種類表のサブフォームをつくり、それぞれ結合したいレコードを表示させています。そこからフォームに値段を入力し登録ボタンをクリックすると値段表に新しいレコードを追加するような登録ボタンを作りたいです。 簡単な例でも構いません。 VBAがわかる方、教えてください。

noname#48319
noname#48319

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

  • ベストアンサー
noname#22222
noname#22222
回答No.1

ウーン!チクッと無駄で複雑な仕組みを作り上げようとしています。 例えば、 <Table1> ID  Data1 1   A 2   B <table2> ID  Table1_ID Table3_ID  Data1 1   1     1      XX 2   1     1      YY <Table3> ID  Price 1   \1,000 2   \2,000 という設計であれば、ノープログラミングで目的を達成できます。 <クエリ1> ID  Table1.Data1  Table2.Data1  Price 1   A        XX      \1,000 2   A        YY      \1,000 SELECT Table2.ID, Table1.Data1, Table2.Data1, Table3.Price FROM Table1 RIGHT JOIN (Table2 LEFT JOIN Table3 ON Table2.Table3_ID = Table3.ID) ON Table1.ID = Table2.Table1_ID; 正に、この<クエリ1>が「1枚のガラスの値段表」です。 **************************************************************** なお、質問に即答すれば、 Private Sub コマンド0_Click()   Dim strInsertSQL As String   strInsertSQL = "INSERT INTO Table3 (ID,Price) Values (3,3000)"   CnnExecute(strInsertSQL) End Sub と、SQLのINSERT文を作成し実行すれば可能です。 CnnExecute()については、要求があれば示します。

noname#48319
質問者

お礼

大変ありがとうございました。 回答を読んでコードの全体像がとてもシンプルになりました。 SQL文の結合は情報処理の勉強で、SELECT・・・From・・・Where A = B AND ・・・のようなものしかやりませんでしたが、これも勉強になりました。 CnnExecute()は某Webサイトで調べました。オートナンバーは自動的にふってくれるし、あとは何とかできそうです。 

その他の回答 (1)

noname#79209
noname#79209
回答No.2

> 3つ目は値段表で上の2つの表の5つのフィールドにID番号と値段の2つのフィールドがあり全部で7つのフィールドです。 この値段表テーブルの作り方がマズイです。 Accessに限らずリレーショナルデータベースでは、他のテーブルにあるデータを重複して持つことを極力避けます。 ご質問の例の値段表テーブルは、 1.商品ID(型番など、商品を一意に特定できる番号) 2.価格 3.サイズID(サイズ表テーブルのサイズ番号) 4.種類ID(種類表テーブルの種類番号) この4フィールドにすべきです。 値段表テーブルに他のテーブルのデータを書き込むテーブル構成にしてしまうと、種類やサイズに変更があったとき、種類テーブルやサイズテーブルだけでなく、値段表テーブル上にあるデータも訂正しなければならなくなります。 他のテーブルのデータを参照したいときは、これら別テーブルのIDでリンクさせたクエリーを使うのがセオリーです。 従って、ご質問のフォームでは、ザブフォームからは2つのサブフォームからそれぞれのIDだけを取り出し、値段表テーブルに追加すれば良いのです。 ただ、サブフォーム方式を採用することが良いかどうかは別の話です。 サイズテーブルや種類テーブルのレコード数が多い場合、絞り込みを行える様にするなど、エンドユーザーの負担を軽減させる工夫も必要です

noname#48319
質問者

お礼

ありがとうございました。 4つの主キーにしぼる話はNo1さんの回答を理解する助けにもなりました。番号の組合せと値段だけでは何のガラスかわからなくなってしまわないか不安はありましたが、必要に応じてリレーションシップからクエリなどで参照すればいいですよね。 値段表はフィールドを2つにするか4つするかまだ決めてませんが、フォームは新規のガラスを登録するときに既存のサイズと種類があるか確認しやすいものをつくりたいと考えています。

関連するQ&A

  • Access アクセス VBA レコード追加

    Access フォームからのレコードの追加方法を教えてください。 テーブル1 ・ID(主キー) ・窓口 ・コストセンター ---------- テーブル2 ・コストセンター(主キー) ・目的 ---------- リレーションシップ テーブル1のコストセンターとテーブル2のコストセンターを一対多 ---------- メインのフォームに”ID”を入力したときにテーブル1に一致するレコードがない場合、新規登録用のフォームが表示されるようになっています。 新規登録用のフォームにレコードを入力してもテーブルに反映されません。 新規登録用のフォームは下記のように作成しています。 また、フォームに”コストセンター”を入力したときに入力したレコードがテーブル2にあっても自動で”目的”が表示されません。 メインフォームにはサブフォームで各テーブルが表示されています。 フォーム ・ID(初期値•••メインで入力したID) ・窓口 ・コストセンター ・目的 ・コストセンター(非表示) 上から順に ・テーブル1 ・テーブル1 ・テーブル2 ・テーブル2 ・テーブル1

  • Accessでの新規レコードの追加の方法

    Windows XP上でMicrosoft Access 2000を使用しています。 オートナンバー型フィールド1つのみを含むテーブルに新規レコードを追加したいのですが、クエリやそれを基にしたフォームを介した方法はもちろんのこと、テーブルをデータシートビューで表示した状態でも追加することができません。 例えばレコードセレクタからレコード追加を選んでレコード保存を選んでも追加されません。 このテーブルに別のフィールドを追加してデータを入れるとレコードの追加が可能なのですが、オートナンバー型フィールド1つのみではうまくいきません。 どなたかオートナンバー型フィールド1つのみを含むテーブルに新規レコードを追加する方法を御存知でしたら御教示下さいませ。

  • Accessのテーブルのレコード追加について

    お世話になります。 テーブルのレコードをコピーして、別のテーブルに 「編集」の中の「追加貼り付け」でテーブルのレコードを 追加しました。 しかし、データ型をオートナンバーにしているフィールド があったのですが、追加したレコードの部分のナンバーが 連番になりません。 どの様にしたら、追加した分も連番になりますでしょうか。 お教え下さいます様、宜しくお願い致します。

  • Access2007 「レコードを追加できません」

    Access2007で困っております。 フォーム上からテキスト型のデータを入力しようとしても 「レコードを追加できません、テーブル’T_アルバム’の結合キーがレコードセットにありません。」 と表示されうまく入りません。 【テーブル構成】 ★が主キー (1)T_アルバム ★アルバムID テキスト型 アルバム名 テキスト型 ジャンルID テキスト型 ソースID テキスト型 アーティストID テキスト型 (2)T_曲目 ★曲ID テキスト型 曲名 テキスト型 トラックNo テキスト型 アルバムID テキスト型 (3)MT_アーティスト ★アーティストID テキスト型 アーティスト名 テキスト型 (4)MT_ジャンル ★ジャンルID テキスト型 ジャンル名 テキスト型 (5)MT_ソース ★ソースID テキスト型 ソース名 テキスト型 【リレーション】 ※いずれも参照整合性付き (1)T_アルバム アルバムID --- (2)T_曲目 アルバムID (1)T_アルバム アーティストID --- (3)MT_アーティスト アーティストID (1)T_アルバム ジャンルID --- (4)MT_ジャンル ジャンルID (1)T_アルバム ソースID --- (5)MT_ソース ソースID フォーム作成のために「Q_アルバム情報入力」をつくりました。 アルバムID T_アルバム アルバム名 T_アルバム アーティストID MT_アーティスト アーティスト名 MT_アーティスト ジャンルID MT_ジャンル ジャンル名 MT_ジャンル ソースID MT_ソース ソース名 MT_ソース この「Q_アルバム情報入力」を使って、フォームウィザードからフォームを作成し、 アルバムIDやアルバム名を入力しようとすると 「レコードを追加できません、テーブル’T_アルバム’の結合キーがレコードセットにありません。」 と表示されます。 他のフィールドは値が入力できますが、これら2つのフィールドのみ入力できません。 なお、各テーブルのフィールドには予めデータが入っている状態です。 宜しくお願い致します。

  • Access2013 vbaサブフォームのレコード

    [Access2013 vba] ■したいこと サブフォームのレコードの中から、一レコードだけをチェックボックスなどで選択したいのですが、どのようにしたら出来ますでしょうか。 複数行選択は出来ないようにしたいです。 選択したのち、メインフォームの選択ボタンを押すと、そのレコードのID番号を取得して、呼出元のフォームのIDフィールドに代入したいです。 ■画面の流れ・・・ Aフォーム → 帳票型Bフォームで、レコードを選び「開く」ボタンを押す→ B 'メインフォームとCサブフォーム)が開く Cサブフォームのレコードをチェックボックスにチェックを入れて選択する B ' メインフォームの「選択」ボタンを押すと B ' メインフォームと、その前のBフォームが閉じて Aフォームに戻り、AフォームのIDフィールドに選択したIDが格納される。 よろしくお願いします。

  • アクセス VBAでレコードが追加できない

    お世話になります。 フォームのボタン(コマンド1)をクリックして テーブルにレコードを追加したいのですが、うまくいきません。 SQLの引数value('intNumber')を実数(例えば'3')とかにすると うまく1レコード追加されるのですが、新規レコードとして 連番で追加させたいので困っています。 宜しくお願いします。 Private Sub コマンド1_Click() Dim dbDao As DAO.Database Dim stSql As String Dim intNumber As Integer intNumber = DMax("[管理ID]", "[テーブル名]") + 1 Set dbDao = CurrentDb stSql = "insert into テーブル名 (管理ID,管理2,管理3) values ('intNumber','99999','99999');" dbDao.Execute stSql dbDao.Close: Set dbDao = Nothing End Sub

  • Accessでフィールドを追加したい

    Accessであるシステムを作成しているのですが、いくつか不明な点があるのでアドバイスをお願いします。 「社員情報」をいうテーブルがあり、初期の状態で「社員番号」「氏名」「入社年月日」「年齢」とフィールドがあります。 このテーブルを基にフォーム「社員情報入力」も作ってあります。 ここで新たに、社員情報テーブルに「生年月日」「連絡先」など、フィールドを追加したいのですが・・・以下のような条件があるので、どうしていいのかわからず困っています。 【条件】 ・フィールド追加用のフォーム(新規フィールド名を入力させる)を作り、そこからフィールドを追加させる。(直接テーブルはいじらせないため) ・追加したフィールドを社員情報入力フォームに反映(表示)させたい ・追加したフィールドをレポートにも反映(表示)させたい このような条件でフィールドの追加は無理なのでしょうか? アドバイスや参考になるページを教えてください。 よろしくお願いします。

  • 別のテーブルのフィールドを抽出項目にするには?

    別のテーブルのフィールドを抽出項目にするには? Access初心者です。 申し訳ありませんが、急ぎ回答いただきたく思います。 どうか宜しくお願いいたします。 お伺いしたい内容は、 データが多く、抽出条件も多いので、 別のテーブルのフィールドに入っている単語を使い、 抽出したい元データのレコードをあいまい検索して非表示にしたいです。 データの内容は下記になります。 --------------------------------------- 元データ(テーブル1とテーブル2から結合したクエリ(名前は元データ) フィールド1 フィールド2 ID-1     りんご ID-2     バナナ ・       ・ ・       ・ ・       ・ ID-2000    チェリー --------------------------------------- --------------------------------------- 除外リスト(テーブル3。名前は除外リスト) フィールド1 りんご チェリー ・ ・ ・ --------------------------------------- 元データのフィールド2に Not Like "*りんご*" And Not Like "*チェリー*" と記述すれば、フィールド2にりんご、チェリーを含むレコード以外のものが表示され、 欲しい情報が手に入るのですが、(上記例だとバナナのみ表示される) 実際にはりんご、チェリーなどあいまい検索し、非表示にしたいキーワードが100個あります。 なので、除外リストというテーブルをつくり、 そのフィールド内に書かれたキーワードを使い Not Like "*りんご*" And Not Like "*チェリー*" と同じような表示結果になるようにしたいのですが、 やり方が調べてもどうしてもわかりません。 どうか皆様のお力を貸してください。 宜しくお願いいたします。

  • Access2000 別のレコードをテーブルに追加するには?

    既存のAというテーブルに新しく別のところからインポートしてきたBというデータを追加したいのですが、「...46件のレコードで入力規則違反が発生したため、レコードを追加できませんでした。」とエラーメッセージが出ます。無視して実行すると、Bの一部のデータがAに追加されません。 IDが一部重複しているのですが、これが原因?でもAccess95では、Bのデータにすべて新しいIDがついて追加されましたよね?

  • テーブル内のレコードを別のテーブルに移す良い方法を教えてください

    SQLサーバー7.0(ADO)とAccess97のVBAでアプリケーションの開発を行っております。SQLサーバー7.0(サーバー側)にあるテーブルの中身(レコード全件)をAccess97(ローカル)にあるテーブル(テーブル名とその中のフィールド名は全く同じだが中身はからっぽ)にまとめて移しかえる良い方法があれば教えてください。いま私はフォームオープンイベントでフィールドとレコードをループでまわして移しかえているのですが、テーブル数も多いため記述も長くなりますし、何よりもパフォーマンスが良くありません。テーブル単位で中身を別のテーブルに移す方法などがあれば是非教えてください。 (例) SQLサーバー(ホスト側)---テーブル名「T_社員マスター」フィールド数100項目、レコード数500件 ↓ ↓ フォームオープン時にそのまま移しかえたい ↓ ↓ Access97(端末側)-------テーブル名「T_社員マスター」フィールド数100項目、レコード数0件 よろしくお願いします。