- ベストアンサー
ACCESS2007で新しいレコードをテーブルに追加する方法
- ACCESS2007を使用している場合、テーブルに新しいレコードを追加する方法を知りたいです。
- テーブルAとテーブルBの構造とデータを示し、テーブルBに特定のデータを追加する方法を教えてください。
- レコードセットやFor~Nextを使用してテーブルBに複数のレコードを追加する方法についてわかりません。質問文に詳細を記載しています。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
まだ分からない点があります。 最初の質問では、最小値10、最大値100の場合には 10 11 ・ 100 や 1 2 ・ 20 と+1の増分とされていますが 途中のところでは 10の倍数だけと述べられています。 これは 全てを10の倍数だけで考えてよいのか? あるいはある条件では+1の増分でそれ以外は10の倍数? どちらでしょうか。 前者の場合、1~20はどうしたらいいの? 後者の場合には+1増分と10の倍数のどちらを適用したらよいのかが不明。 規則性(判断の境界線)は? また 日付|名称|項目|MIN(数値)|MAX(数値)|回数(枚数)|チェック(Yes/No) ()括弧や予約語のMin、MAX Yes/No は誤作動の元です。 http://office.microsoft.com/ja-jp/access-help/HA010030643.aspx 大体下記のような感じになるでしょう(Acc2007は持ち合わせておりません) 条件分岐のところが未完成なので動きません。そちらで何とかしてください。 未検証です。他にも間違いがあるかもです。 私からは此処までです。 Sub test() '要!参照設定 Microsoft DAO 3.6 Object Library Dim db As DAO.Database Dim rsFrom As DAO.Recordset Dim rsTo As DAO.Recordset Dim i As Long, j As Long, k As Long '変数 k は並べ替え用の連番 Set db = Application.CurrentDb Set rsFrom = db.OpenRecordset("select * from テーブルA", dbOpenSnapshot) Set rsTo = db.OpenRecordset("select * from テーブルB", dbOpenDynaset) Do Until rsFrom.EOF For i = 1 To rs!回数 '回数の分だけ繰り返し 'ここから条件分岐のための規則が不明 if 条件 = ○× then '+1増分の場合 For j = rsFrom!最小値 To rsFrom!最大値 rsTo.AddNew rsTo!連番 = k rsTo!日付 = rsFrom!日付 rsTo!名称 = rsFrom!名称 rsTo!項目 = rsFrom!項目 rsTo!数値 = j rsTo.Update k = k + 1 Next j Else '10の倍数の場合 For j = rsFrom!最小値 To rsFrom!最大値 rsTo.AddNew rsTo!連番 = k rsTo!日付 = rsFrom!日付 rsTo!名称 = rsFrom!名称 rsTo!項目 = rsFrom!項目 rsTo!数値 = j rsTo.Update j = j * 10 - 1 k = k + 1 Next j End If Next i If rs!チェック = True Then rsTo.AddNew rsTo!連番 = k rsTo!日付 = rsFrom!日付 rsTo!名称 = rsFrom!名称 rsTo!項目 = rsFrom!項目 'rsTo!数値 = j '値を入れない(Null)が入る rsTo.Update k = k + 1 End If rsFrom.MoveNext Loop rsFrom.Close: Set rsFrom = Nothing rsTo.Close: Set rsTo = Nothing db.Close: Set db = Nothing End Sub
その他の回答 (6)
- layy
- ベストアンサー率23% (292/1222)
>レコードセットとFor~Nextなどを使えばできそうな気がするのですが、???です。 「???」ここに尽きますね。 何がどうわからないのか説明してもらわないと疑問の解決にもならないし 先へ進まない。 For~Nextの開始値、終了値、増分値に何をセットするのか、 いつその値を変えるのか?、 そんなところでしょうか?。 例えば、 テーブルAを先頭から読み込んでテーブルAAに新規に書き出す、 またテーブルAを先頭から読み込んでテーブルAAに追加で書き出す、 並べ替える。 これだけでも複製2レコード分になります。 これを1セットとして、 次は増分させてもう1セットやると10,10,100,100,とかの4レコード。 やり方汚くてもあとでスマートに工夫すればいいです。 どうなる、のが分かっているのだから それに当てはまるような繰り返しのあるフロー図でも作ってみるといいのでは?。 (本来は手順逆ですが・・・。)
お礼
回答ありがとうございます。 自分でも、頭の中がごちゃごちゃになってきました。 とりあえず、やり方を整理して、もう一度考え直してからどうしてもできない所だけ、お聞きしたいと思います。
- nicotinism
- ベストアンサー率70% (1019/1452)
あのう・・・ 情報を小出しにされると回答する立場からすれば 『くたびれます』 場合によっては全てご破算にして新たな切り口を考えねばならなくなります。 なので 私は、『チャリーン』←匙を投げる音 クエリで全てまかなえれば(一時テーブルを作成しなければ) ファイルの肥大化も防げますし良いかなと回答した次第です。 今回の場合 『回数』はまだしも『増分』も考えねばなりませんので 私にはクエリ一発で解決のスキルがありません。 最初に戻って、地道にレコードセットを回して一時テーブルに加えてゆくしか 無いように思えます。 他にまだ提示されていない情報はありませんか。 整理する意味で テーブルAのデザインと具体的データ 作成したいテーブルBのデザイン テーブルAからレコードをBに追加する時の規則性 辺りを再度示されては如何ですか。
お礼
小出しにするつもりはなかったのですが、ご指摘の通りですね。 申し訳ありません。 再度、質問を整理すると テーブルA 日付|名称|項目|MIN(数値)|MAX(数値)|回数(枚数)|チェック(Yes/No) テーブルB 日付|名称|項目|ナンバー(数値) このテーブルAに以下のようなデータが入っているとして 1/1 | あああ | いいい | 10 | 10000 | 2 |No 1/1 | あああ | ううう | 50 | 5000 | 2 |Yes テーブルBに以下のようにレコードを追加したいのです。 1/1 | あああ | いいい | 10 1/1 | あああ | いいい | 10 1/1 | あああ | いいい | 100 1/1 | あああ | いいい | 100 1/1 | あああ | いいい | 1000 1/1 | あああ | いいい | 1000 1/1 | あああ | いいい | 10000 1/1 | あああ | いいい | 10000 1/1 | あああ | ううう | 50 1/1 | あああ | ううう | 50 1/1 | あああ | ううう | 500 1/1 | あああ | ううう | 500 1/1 | あああ | ううう | 5000 1/1 | あああ | ううう | 5000 1/1 | あああ | ううう | blank とこういう風にしたいと思っています。 皆さんの情報をもとにがんばって作っていこうと思います。
- layy
- ベストアンサー率23% (292/1222)
「access レコードセット テーブル作成」 で探すとヒントになる事例はいくつかあります。 一例)http://www.accessclub.jp/dao/index.html また、 NO3のリンク先にある「枚数指定用の連番テーブル」が 前述回答のテーブルCのイメージです。 例えば、1件のレコードしかないテーブルから、100件作りだすとか クエリでもってできるので、部数印刷などには使える仕組みです。 今回は開始値、終了値、増分値とあるので、 FOR文が使えればそのまま適用かと思います。 なので、VBA(レコードセット)で考えてみるのが習得のためにも良いです。 クエリでできるレベルなのかVBAにするのか整理してみる。 1レコード分読み込む、 開始値、終了値、増分値が決まる、 FOR その分だけ繰り返し、新たなレコードを編集しつつ作成する(=Addnew) NEXT →1レコード分の繰り返しが終わったら次のレコードでまた処理する 入力テーブルがEOFになるまで繰り返す あとは、 ラベルを再印刷できるように、と思えば ラベル印刷用のテーブルを作るといいです。 実行する度に前回処理分のレコードは削除するとして。
お礼
何度もご回答いただき、誠にありがとうございます。 DAOの基本から学びなおさないといけませんね。
- nicotinism
- ベストアンサー率70% (1019/1452)
こちらが大いに参考になるのでは? YU-TANG さんの 宛名ラベルを個別に枚数を指定して印刷する方法 http://www.f3.dion.ne.jp/~element/msaccess/AcTipsRptHowToPrintRabelSpecificNumber.html (上から2/5位の所) ↑でクエリ1を作ってみてください。 チェックフィールドに関しては空白にしなくてはいけないので 別途それだけが抽出できるクエリ2を作ります で、さっきのクエリとこのクエリをユニオンクエリでつなげれば宜しいかと? クエリ1のSQL文 union all クエリ2のSQL文 VBAは必要が無いように思えます。
お礼
回答ありがとうございます。 参考にさせていただきます。 ただ、あとで考えればいいやと思って質問文には書かなかったのですが、MIN=10、MAX=100000の場合、抽出したい数値は、10の10倍数(10、100、1000、10000、100000)なのです。 また、MIN=50、MAX=50000となった場合は、50、500、5000、50000 を抽出したいのです。 この方法でこれが可能かどうか、ちょっと考えてみます。
- MRT1452
- ベストアンサー率42% (1391/3293)
最後のチェックは数値のブランク行の有無ということでしょうかね? 工夫も何も無いベタな考え方ですが(具体的なVBAの提示はできませんが)、 テーブルAの件数を取得(Selectクエリの発行) for i = 1 to テーブルAの件数 step 1 i件目のデータを取得(Selectクエリの発行) for j = min値 to max値 step 1 取得したデータをテーブルBに書き込む(ナンバーはjの値をセット) (Insertクエリの発行) next j if チェック=YES then 取得したデータをテーブルBに書き込む(ナンバーはブランク) (Insertクエリの発行) End if next i という感じかな。 テーブルの件数の取得はSQL文だと select count(*) from テーブルA で取得できます。(たぶんAccessでも使えるはず)
お礼
回答ありがとうございます。 クエリーの発行について、あまり詳しくないもので意味がいまいち理解できません。 もう少し、教えてもらえないでしょうか?
- layy
- ベストアンサー率23% (292/1222)
例えば、 テーブルCに1から100までの値だけ100件を作り、テーブルAとテーブルCで結合しないクエリをやると、「い」が100件と「う」で100件できます。 レコードセットで1件読み込み繰り返しながら出力、次の1件読み込みまた繰り返しながら出力 とか 追加クエリ、クエリ実行やSQL実行を繰り返しにする とか VBAまで考えるとサンプルもありそうですが。
お礼
回答ありがとうございます。 質問文に書き忘れてました。 テーブルAには「回数」というフィールドもあるんです。 例えば回数が2だと 1/1 | あああ | いいい | 1 1/1 | あああ | いいい | 1 1/1 | あああ | いいい | 2 1/1 | あああ | いいい | 2 ・ ・ ・ といったようにレコード追加したいのです。 できれば、VBAで処理したいのですが、サンプルをご示唆いただけませんでしょうか?
お礼
ご丁寧にコードまで書いていただいてありがとうございます。 参考にさせていただきます。 わけのわからん質問にお付き合いくださいまして、ありがとうございました。 本当に感謝しています。