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

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

工数の取得はまとめて取得し、かかった工数を台数で割ってクエリで抽出したいと考えています。
最大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...続きを読む

QAccess2013VBA 複数のテーブルからリストボックスの値集合ソースをVBAで取得する

質問です。

現在VBAでリストボックスの値集合ソースをテーブル【T_案件リスト】から取得しています。
しかし、テーブル【T_案件リスト】で顧客IDは取得出来るのですが顧客の名前が別のテーブル【T_顧客一覧】で管理している為取得できません。
クエリを利用すれば出来るのですが、他の事に影響ある為VBAでやりたいです。

現在のコードはこのようになっております。

'リストボックスノ値集合ソース更新
Me![Rst案件] = Null
Me![Rst案件].RowSource = "SELECT [T_案件リスト].[案件ID], [T_案件リスト].[顧客ID], [T_案件リスト].[件名], [T_案件リスト].[状況], [T_案件リスト].[優先度], [T_案件リスト].[希望納期], [T_案件リスト].[入金], [T_案件リスト].[見積書確認], [T_案件リスト].[レイアウト確認], [T_案件リスト].[コメント] " & _
"FROM T_案件リスト " & _
strWhere & " " & _
"ORDER BY [T_案件リスト].[状況]"


このコードはネットで調べてコピペし書き換えただけなので仕組みは正直よく理解できておりません。
これにテーブル【T_顧客一覧】のフィールド【名前】を加えたいです。

わかりやすい方法で教えて頂けたら幸いです。
詳しい方よろしくお願いします。

質問です。

現在VBAでリストボックスの値集合ソースをテーブル【T_案件リスト】から取得しています。
しかし、テーブル【T_案件リスト】で顧客IDは取得出来るのですが顧客の名前が別のテーブル【T_顧客一覧】で管理している為取得できません。
クエリを利用すれば出来るのですが、他の事に影響ある為VBAでやりたいです。

現在のコードはこのようになっております。

'リストボックスノ値集合ソース更新
Me![Rst案件] = Null
Me![Rst案件].RowSource = "SELECT [T_案件リスト].[案件ID], [T_案件リスト...続きを読む

Aベストアンサー

値集合ソースで指定しているのは「SQL」と呼ばれるものです。
その文字列により、データを取得しています。
そのSQLでは、単一テーブルからデータを取得するような記述になっています。
あなたがやりたいのは、複数テーブルから取得、なので、この場合はテーブルを結合する必要があります。
(ちなみに、値集合ソースの使い方は2つあり、今回のようにSQLを直接貼り付けるのと、そのSQLをクエリとして保存し、クエリ名を設定する方法とあります。)
今、スマホしか触れないので、参考サイトを載せます。
http://www.feedsoft.net/access/guide-query/guideq5.html
分かりやすいのが、これくらいでした。

顧客IDを使って、顧客一覧と内部結合Inner Joinすれば出来るはず。
SQLのキモなので、腰を据えて。

Qaccess入所退所日のデータから日数分データ追加

access初心者です。現在以下のようなテーブルがあります。
          入所日   退所日
宿泊者ID(A1) 2015/01/01 2015/01/10 

この場合新規テーブルに 
         滞在期間
宿泊者ID(A1) 2015/01/01
宿泊者ID(A1) 2015/01/02
宿泊者ID(A1) 2015/01/03
        :
宿泊者ID(A1) 2015/01/10
という具合に新規追加するには、どのような手法が考えられますでしょうか?
提示情報が足りないと思うのですが、その点のご教授もお願い申し上げま。

Aベストアンサー

【お知らせ】

      If M > 99 Then
        MsgBox "読込む行総数を100行に下方修正しました。(DBSelect)", _
            vbInformation, _
            " お知らせ"
        M = 99
      End If

DBSelect()に99行制限をかけていました。この6行はバッサリと消して下さい。500行や1000行では変数オーバーはしないので大丈夫です。

Q複数あるAccessのテーブルを一つに集約するVBA

上記方法を御教示ください。
画像ファイルで具体的に記載致しましたので、画像ファイルをご参照ください。
よろしくお願いします。

■ 前提条件
 (1) 複数フォルダの中に共通のAccessが入っている。
 (2) (1)のAccessの中には、共通のマスタがある。

■ 今回やりたい事
 (3) (2)のマスタのデータを、全て、複数フォルダの同階層にあるAccessへ集約したい。

■ 御教示頂きたい事
 上記実現するには、どのようなVBAを組めばよいかを御教示ください。
 (画像ファイルの例でご回答を頂けますと助かります)

Aベストアンサー

こんな感じで。

Option Compare Database
Option Explicit

Const strFile = "\作業.accdb"
Dim FSO As FileSystemObject
Dim Col As Collection

Sub Sample()
  Dim strSQL As String
  Dim dbs As DAO.Database
  Dim C As Variant

  Set FSO = New FileSystemObject
  Set Col = New Collection

  'フォルダ取得
  GetFolders FSO.GetFolder("C:\サンプルデータ\test")

  '追加クエリ
  Set dbs = CurrentDb

  For Each C In Col
    strSQL = "INSERT INTO 集約後作業tbl " & _
         "SELECT * FROM マスタtbl IN '" & C & strFile & "'"
    dbs.Execute strSQL
  Next

  Set dbs = Nothing
  Set Col = Nothing
  Set FSO = Nothing
End Sub

Sub GetFolders(Fol As Folder)
  Dim Subf As Folder

  If FSO.FileExists(Fol.Path & strFile) Then
    Col.Add Fol.Path
  End If

  'サブフォルダ検索
  For Each Subf In Fol.SubFolders
    GetFolders Subf
  Next
End Sub

Microsoft Scripting Runtime の参照設定が必要です。
エラー処理とか入ってない、あくまでもサンプルです。
集約後作業tbl は作成済みであること。

こんな感じで。

Option Compare Database
Option Explicit

Const strFile = "\作業.accdb"
Dim FSO As FileSystemObject
Dim Col As Collection

Sub Sample()
  Dim strSQL As String
  Dim dbs As DAO.Database
  Dim C As Variant

  Set FSO = New FileSystemObject
  Set Col = New Collection

  'フォルダ取得
  GetFolders FSO.GetFolder("C:\サンプルデータ\test")

  '追加クエリ
  Set dbs = CurrentDb

  For Each C In Col
    strSQL = "INSERT I...続きを読む

QAccessのクロス集計クエリから、追加クエリをvbaで記述したいが記述が分からない。

Windows7のAccess2007を使っています。
Accessのクロス集計クエリから、追加クエリをvbaで記述したいが記述
が分からない。

vbaを使わなければ、データベースウインドウで最初にクロス集計のク
エリを作って、そのクエリを使って追加クエリを作れば終わりですが。
これと同じ事をvbaで記述をしたいのですが。

出来るのでしょうか。

例として、収穫テーブルとサイズテーブルのクロス集計を作ると仮定し
て下記の構造で作る物とします。
収穫テーブルは下記の構造です。
1. idと言う名前でオートナンバーの型
2. サイズと言う名前で数値の型

サイズテーブルは下記の構造とします。
1. idと言う名前でオートナンバーの型
2. 名前と言うフィールドの名前でテキストの型

収穫のテーブルは下記のデータが入っています。
ID サイズ
1 1
2 2
3 2
4 2
5 1
6 2
7 3

サイズのテーブルは下記のデータが入っています。
ID 名前
1 大
2 中
3 小

リレーションシップは、一側のテーブルがサイズのテーブルで、idを主
キーとします。多側のテーブルは、収穫のテーブルで多側のキーはサイ
ズです。

ここで、クエリ1の名前で
TRANSFORM Count(収穫.ID) AS IDのカウント
SELECT 収穫.ID
FROM サイズ INNER JOIN 収穫 ON サイズ.ID = 収穫.サイズ
GROUP BY 収穫.ID
PIVOT サイズ.名前;

を実行すると、下記が得られます。
ID 小 大 中
1 1
2 1
3 1
4 1
5 1
6 1
7 1

ここで、クエリ1を使って下記のクエリ2を作ります。
INSERT INTO table1
SELECT クエリ1.*
FROM クエリ1;

上記の操作でクエリ1のクロス集計クエリを使って
クエリ2の追加クエリと言う二つの手段で
クロス集計からデータを作る事が出来ます。

この操作をvbaの手法で作る方法は無いのでしょうか。
この例でのコードの記述を宜しくお願いします。

Windows7のAccess2007を使っています。
Accessのクロス集計クエリから、追加クエリをvbaで記述したいが記述
が分からない。

vbaを使わなければ、データベースウインドウで最初にクロス集計のク
エリを作って、そのクエリを使って追加クエリを作れば終わりですが。
これと同じ事をvbaで記述をしたいのですが。

出来るのでしょうか。

例として、収穫テーブルとサイズテーブルのクロス集計を作ると仮定し
て下記の構造で作る物とします。
収穫テーブルは下記の構造です。
1. idと言う名前でオートナ...続きを読む

Aベストアンサー

こちらが参考になるでしょう。
http://www.accessclub.jp/bbs6/0008/das1904.html


おまけ、上記を参考にした
一応動作するコード。

Dim strSQL As String
strSQL = "INSERT INTO table1 " & _
   "SELECT Q.* " & _
   "FROM [" & _
   "TRANSFORM Count(収穫.ID) AS IDのカウント " & _
   "SELECT 収穫.ID " & _
   "FROM サイズ INNER JOIN 収穫 ON サイズ.ID=収穫.サイズ " & _
   "GROUP BY 収穫.ID " & _
   "PIVOT サイズ.名前 " & _
   "IN ('大','中','小')" & _
   "]. As Q"
Debug.Print strSQL
CurrentDb.Execute strSQL


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

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

おすすめ情報