Accessのテーブルデータを一気にVBAで追加したい・・

Accessに一時商品登録データというテーブルがあり、
問題なければ商品登録データにデータを流し込みたいと思っています

テーブルのデータ構造は全く同じです

VBAで一時商品登録のテーブルから一件ずつデータを読み取って
商品登録データに追加することは出来るのですが
一気にデータを追加する方法があれば教えていただけないでしょうか?

よろしくお願いいたいます

このQ&Aに関連する最新のQ&A

A 回答 (3件)

本当にいろいろな方法があります。



一番簡単なのは、
あらかじめ「追加クエリ」を作成しておき

 Docmd.OpenQuery "追加クエリ名"

あるいは DAO で

 Set dbs = CurrentDB
 dbs.Excute "追加クエリ名"

追加クエリを使用しない場合は
追加クエリの SQL文 に相当するSQL を 実行。

 strSQL="INSERT INTO 商品登録データ SELECT 一時商品登録データ.* FROM 一時商品登録データ"

 Docmd.RunSQL strSQL

あるいは DAO で

 Set dbs = CurrentDB
 dbs.Excute strSQL

とか。

直書き、間違いがあったら御免。
    • good
    • 0
この回答へのお礼

まさに、自分が知りたかったSQL構文でした

追加クエリーを作成するとはいいアイデアですね

活用させてもらいます

ありがとうございました

お礼日時:2010/09/14 17:57

Do Until rs2.EOF



の前に

rs2.MoveFirst

を追加して、

rs2.MoveFirst
Do Until rs2.EOF

としてください。
    • good
    • 0

方法はいろいろですが、以下のような方法があります。



テーブルのフィールド名を商品名、価格とします。
DAOを使っているのでコード表のツール、参照設定
からDAOの一番高いバージョンを選択してください。


Private Sub コマンド0_Click()
Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset

If MsgBox("データを転送していいですか?", vbYesNo) = vbYes Then

Set db = CurrentDb
Set rs1 = db.OpenRecordset("商品登録データ", dbOpenDynaset)
Set rs2 = db.OpenRecordset("一時商品登録データ", dbOpenDynaset)

Do Until rs2.EOF
rs1.AddNew
rs1!商品名 = rs2!商品名
rs1!価格 = rs2!価格
rs1.Update
rs2.MoveNext
Loop
rs1.Close: Set rs1 = Nothing
rs2.Close: Set rs2 = Nothing
db.Close: Set db = Nothing
End If
End Sub



なお、フィールド名が増加する場合は、
rs1.AddNew
rs1!商品名 = rs2!商品名
rs!価格 = rs2!価格
rs1.Update
のところに、フィールド名を追加してください。
    • good
    • 0
この回答へのお礼

ありがとうございました

参考にさせてもらいます

お礼日時:2010/09/14 18:00

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QACCESS ACCESS VBA テーブル テーブル変換 番号 個数 変換

私はプログラム初心者です。
業務の中でACCESSを使っております。
ACCESSでテーブルの変換についてのプログラムが分からなかったので
質問させて頂きました。


以下のようなテーブル(テーブル1)があります。
管理番号|NO|名前
1|NO.1|スプーン
2|NO.2|スプーン
3|NO.3|スプーン
4|NO.1|フォーク
5|NO.2|フォーク
6|""|ナイフ
7|NO.1|お鍋
以上のテーブルを新たにテーブル(テーブル2)を作成し、次のようなにしたいです。
管理番号|台数|名前
1|3|スプーン
4|2|フォーク
6|1|ナイフ
7|1|お鍋

テーブル変換の機能
・名前が同じ物の個数を表示する
・名前が同じ物の管理番号は若い番号にする

よろしくお願いいたします。

Aベストアンサー

Access2003でのクエリ作成手順になります。(他バージョンでもほぼ同じでしょう)

・「デザインビューでクエリを作成する」から対象のテーブルを表示させます。

・クエリデザインツールバーにある「Σ」をクリックします。
 (デザインの欄に「集計」が追加されます)

 もしくは、クエリの種類を1度「クロス集計」にし、「選択」に戻しても同じ状態になります。

・テーブル内の「管理番号」をダブルクリックします。
 フィールドに「管理番号」、テーブルに対象テーブル名、集計に「グループ化」が表示されます。
 集計のところを「最小」に変更します。
 並べ替えのところを「昇順」に変更します。

・テーブル内の「NO」をダブルクリックします。
 フィールドに「NO」、テーブルに対象テーブル名、集計に「グループ化」が表示されます。
 集計のところを「カウント」に変更します。

・テーブル内の「名前」をダブルクリックします。
 フィールドに「名前」、テーブルに対象テーブル名、集計に「グループ化」が表示されます。

・ここで、表示を「データシートビュー」に切り替えます。(注1)
 管理番号の最小、NOのカウント、名前 の表が表示されます。
 名前「ナイフ」部分のカウントが得たいものではなく「0」になっています。
 これは、NULLのデータはカウント対象外となっているためです。

・表示を「SQLビュー」に切り替えます。
 1行目中ほどに 「 Count(テーブル名.[NO]) AS NOのカウント, 」があります。
 NOに限定した個数を求めるのでなく、単にレコード数を得たいので
 これを 「 Count(*) AS 台数, 」に書き換えます。
 XXXXX AS YYYY は、XXXXXをYYYY名で、という意味合いになるので、
 同様に「管理番号の最小」->「管理番号」に修正します。

・表示を「データシートビュー」に切り替えます。

これで求めたいクエリは作成することができました。
このクエリをそのまま使うのではなく、結果をテーブルに書き出すには続いて以下を行います。

・表示を「クエリ デザイン」に切り替えます。

・メニューの「クエリ」->「テーブル作成」をクリックします。
 テーブル名を入力し、「OK」

 クエリデザイン上変化はありませんが、以上で終了です。

確認)
表示を「SQLビュー」に切り替えます。
1行目最後あたりに、「 INTO テーブル名 」が追加されています。
これが結果をテーブルに書き出す命令部分になります。


(注1)
「'*'で選択したフィールドはグループ化できません。」というメッセージが出たら、クエリ作成をいったんあきらめます。
(クエリデザインの画面を閉じます)
メニューの「ツール」->「オプション」の「テーブル/クエリ」タブの「クエリ デザイン」部分の「全てのフィールドを表示する」チェックを外し「OK」します。
クエリ作成を初めからやり直します。

(注2)
(注1)の変更は、以降も変更されたままとなるので、今回だけ回避するには、
表示を「SQLビュー」にし、1行目最後の「 テーブル名.名前, * 」の「 , * 」を削除します。


書く練習がてら、初心者向けに書いてみましたがいかがでしたでしょうか。

Access2003でのクエリ作成手順になります。(他バージョンでもほぼ同じでしょう)

・「デザインビューでクエリを作成する」から対象のテーブルを表示させます。

・クエリデザインツールバーにある「Σ」をクリックします。
 (デザインの欄に「集計」が追加されます)

 もしくは、クエリの種類を1度「クロス集計」にし、「選択」に戻しても同じ状態になります。

・テーブル内の「管理番号」をダブルクリックします。
 フィールドに「管理番号」、テーブルに対象テーブル名、集計に「グループ化」...続きを読む

QACCESSでVBA等を用いて既存テーブルにフィールドを追加する

タイトルどおりです。

ACCESS97以降で、VBA等を用いた「既存テーブルにフィールドを追加する」方法を調べています。

業務で、デザインビューを使用せずにテーブルフィールドの追加が発生したので、その対応のためです

Aベストアンサー

[ACC2003] プログラムを使用してオートナンバー型フィールドを作成し、その "新規レコードの値" プロパティを "ランダム" に設定する方法
http://support.microsoft.com/default.aspx?scid=kb;ja;304418

こちらが参考になると思います。
(DAOが使ってあるので、たぶん、Acc97でも大丈夫です。)

参考URL:http://support.microsoft.com/default.aspx?scid=kb;ja;304418

QCSVデータ→ACCESSに変換。また新しいCSVデータをACCESSに追加できない?

ACCESSでCSV形式のデータを取り込みします。
※このCSVのデータを[a.txt]とします。

[a.txt]を一度取りこみ。
この段階で[a.txt]の中を空にします。
しばらくしてから
[a.txt]にデータたまりだして、
再度ACCESSで取り込みしようとした場合、
先ほど取り込んだACCESSに追加ってできないものなんでしょうか?

よろしくお願いします

Aベストアンサー

>ワークテーブルへインポート・・・の意味が

最終的に追加したいテーブルと同じカラムを持つ、空のテーブルを用意し、
それにインポートして、問題なければ、最終的に追加したいテーブルへインサート。
問題があるならば、インポート先のテーブルをTRUNCATEして再処理。
最終的に作業が完了したら、空のテーブルをTRUNCATEしておく。

QACCESS 入力フォームでテーブルへデータを複数追加したい

ACCESS 入力フォームでテーブルへデータを複数追加したいと考えているのですが、
自力で解決出来ないので、アドバイスお願いします。

現在、工数取得の為の入力フォームを作成しています。

工数の取得はまとめて取得し、かかった工数を台数で割ってクエリで抽出したいと考えています。
最大5台分までで、作業によっては1台や2台でもデータを保存できるように1つのテーブルに入れたいのですが、1台入力すると4台分が空白で保存されてしまいます。
また、保存した後に、次のレコードに進んで新規で入力したいのですが、保存したレコードが表示されたままで、次のレコードに進む事が出来ません。

当方、アクセス勉強して間もないので知識や定義を理解していない部分があるのですが、アドバイスお願いします。

例)
☆ 入力フォーム
________________________________________________________
本体シリアル [0001] [0002] [0003] [0004] [0005]
作業者 [山田太郎]
開始時間 [9:00]
終了時間 [9:30]
台数 [5]

[ 保存 ]
_______________________________________________________________


☆ テーブルデータ
_______________________________________________________________
山田太郎 0001 9:00 9:30
山田太郎 0002 9:00 9:30
山田太郎 0003 9:00 9:30
山田太郎 0004 9:00 9:30
山田太郎 0005 9:00 9:30
_______________________________________________________________

コード

Dim rs As DAO.RecordSet
Set rs = CurrentDB.OpenRecordset("テーブル名")
For i = 1 to 5
rs.AddNew
rs!シリアル = Me("シリアル" & i).Value
rs!開始時間 = Me("開始時間").Value
rs!終了時間 = Me("終了時間").Value
rs!台数 = Me("台数").Value

If Me("シリアル" & i).Value = "" Then Exit For

rs.Update
Next
rs.Close
Set rs = Nothing
Me.Refresh

DoCmd.RunCommand acCmdSaveRecord
DoCmd.GoToRecord acDataForm, "工数フォーム", acNext

ACCESS 入力フォームでテーブルへデータを複数追加したいと考えているのですが、
自力で解決出来ないので、アドバイスお願いします。

現在、工数取得の為の入力フォームを作成しています。

工数の取得はまとめて取得し、かかった工数を台数で割ってクエリで抽出したいと考えています。
最大5台分までで、作業によっては1台や2台でもデータを保存できるように1つのテーブルに入れたいのですが、1台入力すると4台分が空白で保存されてしまいます。
また、保存した後に、次のレコードに進んで新規で入力...続きを読む

Aベストアンサー

シリアル欄が空白かどうかを判断する方法が間違っています。
Access のテキストボックスの場合、未入力だと値は Null になります。
場合によっては "" (空の文字列) の場合もあります。
従いまして以下のように Nz 関数を使って Null を空の文字列に変換してから判断してみてください。
If Nz(Me("シリアル" & i).Value, "") = "" Then Exit For

そして、この判断を行う場所は For の直後 (AddNew する前) でいいと思います。
For i = 1 To 5
 If Nz(Me("シリアル" & i).Value, "") = "" Then Exit For
 rs.AddNew
 ・・・
 rs.Update
Next

ただし質問文のコードでは
[シリアル001] ← 入力した
[シリアル002] ← 空欄
[シリアル003] ← 入力した
という入力パターンがあった場合 [シリアル002] 以降は保存されません。
もしこのように歯抜け入力もあるのであれば、

For i = 1 To 5
 If Not(Nz(Me("シリアル" & i).Value, "") = "") Then
  rs.AddNew
  ・・・
  rs.Update
 End If
Next

というようにすると良いかと。

シリアル欄が空白かどうかを判断する方法が間違っています。
Access のテキストボックスの場合、未入力だと値は Null になります。
場合によっては "" (空の文字列) の場合もあります。
従いまして以下のように Nz 関数を使って Null を空の文字列に変換してから判断してみてください。
If Nz(Me("シリアル" & i).Value, "") = "" Then Exit For

そして、この判断を行う場所は For の直後 (AddNew する前) でいいと思います。
For i = 1 To 5
 If Nz(Me("シリアル" & i).Value, "") = "" Then Exit For
 rs.Add...続きを読む

Q別のACCESSデータベースのテーブルのレコードを追加したいのです

別のACCESSデータベースのテーブルのレコードを追加したいのです

同じ内容のデータベースが二つあります
データベース1とデータベース2を其々別の人がデータを入力しています
データベース1にデータベース2のテーブルで T_データT_データ明細の二つのレコードを追加したいのですがどの様にすればよいでしょうか

ご指導をお願いいたします。

Aベストアンサー

レコードカウントで採番する場合は、

rsInMain.AddNew
rsInMain!番号 = rsInNUM!番号 + 1
rsInMain!項目1 = rsOutMain!項目1
rsInMain!項目2 = rsOutMain!項目2
j = rsInMain!番号
rsInMain.Update

のところで、

rsInMain!番号 = rsInNUM!番号 + 1



rsInMain!番号 = rsInMain.RecordCount + 1

に置き換えればいいです。

それと、

'T_番号の更新
rsInNUM.Edit
rsInNUM!番号 = rsInNUM!番号 + 1
rsInNUM.Update

の部分はコメントアウトするか削除します。


こちらの環境では、レコードソースを
クエリ、テーブル、SQLどれも問題はないのですが。
一応、簡単にT_テーブルでオートフォームでフォームを
つくり、あとボタンをくっつけた簡単な
フォームでやっています。


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング

おすすめ情報