• ベストアンサー
  • 困ってます

ループで呼び出しながら、追加クエリでテーブルに追加

IDをループで呼び出しながら、追加クエリでテーブルに追加したいのですが、 値が入りません。 エラーなく動くのですが、テーブルに値が入っていないのです。 何がたりないのでしょうか? ――――――――――――― Public Sub CYUSYUTU_SEIKYUID2() Dim CYUSYUTU_SEIKYUID As String Dim recCount As Long recCount = DCount("*", "作業用請求先ID") Dim ID As String Dim DB As DAO.Database Dim RS As DAO.Recordset Dim i As Integer Dim strSQL As String Set DB = CurrentDb Set RS = DB.OpenRecordset("作業用請求先ID") RS.MoveFirst Do Until RS.EOF RS.Edit For i = 1 To recCount CYUSYUTU_SEIKYUID = RS.Fields("請求先ID(13)").Value DoCmd.RunSQL _ "INSERT INTO [作業用_▲入金DB] SELECT * FROM ▲入金 WHERE ▲入金.請求先ID='& CYUSYUTU_SEIKYUID &';" Next i RS.Update RS.MoveNext Loop RS.Close: Set RS = Nothing DB.Close: Set DB = Nothing End Sub

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数195
  • ありがとう数1

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

  • ベストアンサー
  • 回答No.1
  • oka_me
  • ベストアンサー率86% (26/30)

直接の原因はここかと↓ "INSERT INTO [作業用_▲入金DB] SELECT * FROM ▲入金 WHERE ▲入金.請求先ID='& CYUSYUTU_SEIKYUID &';" ↓↓↓ "INSERT INTO [作業用_▲入金DB] SELECT * FROM ▲入金 WHERE ▲入金.請求先ID='" & CYUSYUTU_SEIKYUID & "';" 変数は""の外に出してやらないと変数として機能しません。(""内の文字列と「&」で連結します) 後は余計なお世話かもですが・・・ ・Do~Loop(rs.MoveNext)で全レコード分ループさせるのでFor~Nextは不要です ・DAOで開いたレコードセット自体を更新しないのであれば、RS.EditとRS.Updateも不要です あとは、使用していない変数がいくつか宣言されているようですが・・・ (もしコードの提示を省略しているだけで実際は使用しているとかでしたらすみません) もし質問文内のコードが全てなのであれば、これだけで大丈夫かと思います。 Public Sub CYUSYUTU_SEIKYUID2() Dim CYUSYUTU_SEIKYUID As String Dim DB As DAO.Database Dim RS As DAO.Recordset Set DB = CurrentDb Set RS = DB.OpenRecordset("作業用請求先ID") RS.MoveFirst Do Until RS.EOF CYUSYUTU_SEIKYUID = RS.Fields("請求先ID(13)").Value DoCmd.RunSQL "INSERT INTO [作業用_▲入金DB] SELECT * FROM ▲入金 WHERE ▲入金.請求先ID='" & CYUSYUTU_SEIKYUID & "';" RS.MoveNext Loop RS.Close: Set RS = Nothing DB.Close: Set DB = Nothing End Sub

共感・感謝の気持ちを伝えよう!

質問者からのお礼

まだまだ勉強中の為、ウェブからコピーしたものを使って作っていたので、余分なものが入ってました。いらないことが分かって勉強になりました。ありがとうございます。これでやりたい作業ができました!また宜しくお願いします。

関連するQ&A

  • 空き番検索でオーバーフロー

    同じような現象がなかったので、初心者ではありますが 質問させていただきます http://okwave.jp/qa447885.html こちらの質問にあった ryuu001さん回答の  ◎テーブル名 = テーブル1  ◎連番のフィールド名 = ID とし  ◎連番は後から入力した数値が   先に入力した数値より   小さくなることは無い。   (dmaxを使用しているので大丈夫かと思いますが) Sub test() Dim Db As Database Dim Rs As DAO.Recordset Dim Temp As String Dim I As Integer Set Db = CurrentDb() Set Rs = Db.OpenRecordset("テーブル1") Rs.MoveFirst I = 1 Temp = "" Do Until Rs.EOF = True Do While I < Rs!ID Temp = Temp & " " & I I = I + 1   *1 Loop Rs.MoveNext I = I + 1 Loop Rs.Close Set Rs = Nothing Db.Close Set Db = Nothing MsgBox "次の数字が抜けています。" & vblf & Temp End Sub VBAを利用させていただきました。 ですが「オーバーフローしました」とエラーが出てしまい デバッグすると*1の場所で止まっているようでした これはやはりLoopしているのが原因なんでしょうか ずっと+1を繰り返している・・・?

  • Access VBA 添付型フィールド

    Access VBAで添付型フィールドからファイル名を取りだしたいのですが、どのようにすればいいでしょうか? Private Sub Sample() Dim DB As DAO.Database Dim RS As DAO.Recordset Dim SQL As String   Set DB = CurrentDb SQL_1 = "SELECT * FROM ボランティア情報 ORDER BY 分野 & 団体名読み;" Set RS = DB.OpenRecordset(SQL_1, dbOpenDynaset) With RS   Do While Not .EOF   MsgBox (!写真.FileName)  ←ここでエラーが出ます。 .   MoveNext   Loop End With RS.Close Set RS = Nothing Set MDB = Nothing End Sub

  • テーブルのレコードが0件時にmsg表示(アクセス)

    とてつもない初歩的な質問で すみません! フォーム1をメニュー画面として、 フォーム1にある「ボタン」を押すと テーブルにレコードが追加され、処理が走る・・・という仕様を作っています。 ですが、 このテーブルにレコードが追加されなかった=0件 の場合の回避策を どうしたら良いのかが わかりません。 ちなみに、 Private Sub ボタン_Click() On Error GoTo errmsg DoCmd.SetWarnings False Dim DB As DAO.Database Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Dim i As Long Set DB = CurrentDb Set rs1 = DB.OpenRecordset("テーブル1") Set rs2 = DB.OpenRecordset("テーブル2", dbOpenDynaset) rs1.MoveFirst Do Until rs1.EOF If rs1!フィールドA1 = rs1!フィールドA2 Then rs2.AddNew rs2!ID = rs1!ID rs2!フィールドA = rs1!フィールドA1 rs2!B = rs1!フィールドB rs2!C = rs1!フィールドC rs2.Update End If If rs1!フィールドA1 < rs1!フィールドA2 Then For i = rs1!フィールドA1 To rs1!フィールドA2 Step 1 rs2.AddNew rs2!ID = rs1!ID rs2!フィールドA = i rs2!フィールドB = rs1!フィールドB rs2!フィールドC = rs1!フィールドC rs2.Update Next i End If rs1.MoveNext Loop rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing DB.Close: Set DB = Nothing Call 次処理 errmsg: MsgBox "元データが未投入です。" End Sub としたのですが、 これでは データが投入され、処理が成功=完了した場合にも エラーメッセージが出てしまいました。 ご教示いただけますと幸いです。 お手数をおかけしますが、よろしくお願い致します。

その他の回答 (1)

  • 回答No.2

ループするのは必須でしょうか 追加クエリ1つでできそうですけど Dim sSql As String sSql = "INSERT INTO [作業用_▲入金DB] " _    & "SELECT * FROM ▲入金 WHERE ▲入金.請求先ID IN " _    & "(SELECT [請求先ID(13)] FROM 作業用請求先ID);" CurrentDb.Execute sSql ※ メモ帳に書いただけなので、綴りとか動作未検証

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • テーブルの左端に通し番号を付ける

    教えてください! 下記のモジュールで走らせると、 「ユーザ定義型は定義されていません」 と表示が出て止まってしまいます。 要は、左端の「No.」という列に 通し番号を入れたいのですが・・・。 Option Compare Database Sub setNumber(tblname As String, fldname As String) Dim db As DAO.Database Dim rs As DAO.Recordset Dim ssql As String Dim dblCnt As Double Dim strCnt As String dblCnt = 0 Set db = CurrentDb() ssql = "SELECT * FROM " & tblname Set rs = db.OpenRecordset(ssql) rs.MoveFirst Do While Not rs.EOF dblCnt = dblCnt + 1 strCnt = Format$(dblCnt, "00000000") rs.Edit rs.Fields(fldname).Value = strCnt Debug.Print strCnt rs.Update DoEvents rs.MoveNext Loop End Sub Sub Execute() Call setNumber("◎テーブル1", "No.") End Sub

  • VB テーブルのデータを出荷先ごとにcsv出力

    お世話になります。 VBは素人で、自分なりにネットでいろいろ調べて、下記の物を作ってみたのですが、 うまくいかず、とても悩んでおります。 知ってる方、どなたか教えて頂けませんか? よろしくお願いいたします。m(_ _)m ------------------------------------------------------------------ 目的: (1)テーブルのフィルド名を、各CSVの一行目に出力したい。 (2)テーブルのフィルドは30項目ぐらいあるため、下記のように個別出力ではなく、   一括で出力できるようにしたいです。 (3)すべての項目には、” ”で囲み、カンマで区切りをしたいです。 ------------------------------------------------------------------ Option Compare Database Option Explicit Private objDB As DAO.Database Private objExcel As Object 'EXCELオブジェクト Private objWorkBook As Object 'WORKBOOKオブジェクト Private objSheet As Object 'SHEETオブジェクト Public Sub CSVsyuturyoku() Dim db As DAO.Database Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Dim flag As Boolean Set db = CurrentDb Set rs1 = db.OpenRecordset("SELECT DISTINCT 氏名 FROM 出荷データ") Do Until rs1.EOF Set rs2 = db.OpenRecordset("SELECT * FROM 出荷データ" _ & " WHERE Nz(氏名) = '" & rs1!氏名 & "'") flag = True Open CurrentProject.Path & "\ファイル" & rs1!氏名 & ".csv" _ For Output As #1 Do Until rs2.EOF 'Print #1, Nz(rs2!商品名) Print #1, rs2!商品コード & "," & rs2!商品名 & "," & rs2!単価 ' ↑フィルド項目数が多すぎたため、全部書ききらず。。。 rs2.MoveNext Loop Close #1 rs1.MoveNext Loop rs1.Close: Set rs1 = Nothing If flag Then rs2.Close: Set rs2 = Nothing db.Close: Set db = Nothing ' 終了の表示 MsgBox "ファイル出力が完了しました。" End Sub

  • ODBC--リンクテーブル'XXXX'での更新に失敗しました

    同じ現象がなさそうでしたので質問させていただきます。 インポートしたテーブルであれば問題なくレコードの更新が出来るのですが 実際のODBCで繋いだDBでは「ODBC--リンクテーブル'XXXX'での更新に失敗しました」となってしまいます。 DAOとADO両方試してみました。以下のものになります こちらは教えていただいたものです。 Private Sub Sample3() Dim rs As New ADODB.Recordset Dim i As Integer Const フィールド名 As String = "連番" ' ☆1 Const テーブル名 As String = "元テーブル" ' ☆1 Const 抽出 As String = "登録番号" ' ☆1 Const 並び替え As String = "登録番号" ' ☆1 i = 1 rs.Source = "SELECT " & フィールド名 & " FROM " & テーブル名 & _ " WHERE " & 抽出 & " LIKE 'ZZZZ%' ORDER BY " & 並び替え & ";" rs.Open , CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic While (Not rs.EOF) rs(フィールド名) = "ZZZZ" & Format(i, "0000") rs.Update rs.MoveNext i = i + 1 Wend rs.Close End Sub ADOだからダメなのかと思い こちらは教えて頂いたものをDAOにしてみました。 Private Sub Sample3() Dim Db As DAO.Database Dim rs As DAO.Recordset Dim i As Integer Const フィールド名 As String = "連番" ' ☆1 Const テーブル名 As String = "元テーブル" ' ☆1 Const 抽出 As String = "登録番号" ' ☆1 Const 並び替え As String = "登録番号" ' ☆1 i = 1 Set Db = CurrentDb() Set rs = Db.OpenRecordset("SELECT " & フィールド名 & " FROM " & テーブル名 & " WHERE " & 抽出 & " LIKE 'ZZZZ*' ORDER BY " & 並び替え & ";") While (Not rs.EOF) rs.Edit rs(フィールド名) = "ZZZZ" & Format(i, "0000") rs.Update rs.MoveNext i = i + 1 Wend rs.Close End Sub 両方とも「ODBC--リンクテーブル'XXXX'での更新に失敗しました」 となってしまいます。 どうすれば更新に失敗せずにできるのでしょうか?

  • adoのループについて カレントレコードについて

    adoのFor i = 1 To rs.RecordCountについて質問があります。 Sub test() Dim i As Long Dim MyFileName As String Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset MyFileName = CurrentProject.FullName cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & "Data Source= " & MyFileName rs.Open "Tテーブル", cn, adOpenKeyset, adLockOptimistic For i = 1 To rs.RecordCount Debug.Print rs.Fields(0).Value rs.MoveNext Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub これを実行した時に、テーブルには、1,2,3・・・という値が入っていて、 イミディエイドウインドウにも1,2,3・・・と順番に取得されるのですが、 For i = 1 To rs.RecordCountを実行した時は、強制的にrs.MoveFirstされるのでしょうか? For i = 1 To rs.RecordCount rs.MoveFirst Debug.Print rs.Fields(0).Value rs.MoveNext Next これと同じ意味なのでしょうか? RecordCount プロパティ (ADO) のヘルプを見ましたが、この件に関する記述は探せませんでした。 ご回答よろしくお願いします。

  • DAOでデータベースを二つ開くには?

    環境 Windows2000 VB6 DAOで同じデータベースを開くためのやり方がわかりません。 下記のようにマスタのキーを使用して他のテーブルの 内容を更新したいのですが よろしくお願いします。m(__)m Dim ws As Workspace Dim db As Database Dim qd As QueryDef Dim rs As Recordset Dim STRSQL As String dim strsql2 as string Set ws = DBEngine.Workspaces(0) Set db = ws.Databases(0) STRSQL = "SELECT KEY FROM マスタ" Set qd = db.CreateQueryDef("", STRSQL) Set rs = qd.OpenRecordset() Do While Not rs.EOF strsql2 = "Update data from マスタ where key = " & rs!key ???? rs.MoveNext Loop rs.Close qd.Close db.Close

  • 同じテーブルのフィールドを使ったUPDATEしたい

    こんにちは。 いつも参考にさせていただいています。 本日は投稿側です。 やりたいことは「T_ALL」テーブルの加工した「受付番号」フィールドを 「お客様番号」フィールドに書き込むことです。 ACCESS VBAで以下のコードを書き、実行すると[受付番号]のとこで 「定義されていない」とエラーになります。 思考錯誤しましたが解決できず困っています。 ご教示ください。 よろしくお願いします。 ************************************************************************* Dim db As ADODB.Connection Dim rs As ADODB.Recordset Dim mypath, we As String Dim mysql As String Set db = New ADODB.Connection Set rs = New ADODB.Recordset db.Open "Provider=OraOLEDB.Oracle;Data Source=kcwf;User Id=kcwf;Password=kcwf;" rs.Open "SELECT * FROM T_ALL", db, adOpenDynamic, adLockOptimistic, adCmdText '***** 項目を更新 mysql = "UPDATE T_ALL SET お客様番号= 'B" & Mid([受付番号], 5, 9) & "'" db.Execute mysql 'Close rs.Close Set rs = Nothing db.Close Set db = Nothing *************************************************************************

  • Access VBA(データを横並べで追加)について

    いつもお世話なっております。なかなか解決できなくて、ヘルプ求めにきました。  OS- XP SP2 ACCESS2003 T1(テープル) ID    店名 連番 ----------------------- 1 A 1 2 A 2 3 A 3 4 B 4 5 B 5 6 B 6 7 C 7 8 C 8 9 C 9 ---------------------------- T2(空) ID(オート)店名1  店名2 ----------------------------- T1の店名をT2へ横並べて追加したいので、↓のようににソースを書きました。 希望結果↓ ID(オート)店名1 店名2 ----------------------- 1 A A 2 A B 3 B B 4 C C 5 C Private Sub コマンド0_Click() Dim db As DAO.Database Dim RS1 As Recordset Dim RS2 As Recordset Dim fld As Field Dim A As Integer Set db = CurrentDb() Set RS1 = db.OpenRecordset("T1", dbOpenTable) Set RS2 = db.OpenRecordset("T2", dbOpenTable) RS1.MoveFirst For A = 1 To RS1.RecordCount If RS1![連番] Mod 2 <> 0 Then RS2.AddNew RS2![店名1] = RS1![店名] ElseIf RS1![連番] Mod 2 = 0 Then RS2![店名2] = RS1![店名] RS2.Update End If RS1.MoveNext Next MsgBox "終わり", vbExclamation RS1.Close RS2.Close End Sub 質問1-自分のこの書き方でデータ店名のCが一つ消えてしまいます。原因を教えてください。 質問2-後、店名が変わる時、店1からスタートさせたいですが、どうすれば、いいんでしょうか。 希望結果↓ T2 ID    店名1   店名2 ----------------------------- 1 A A 2 A 3 B B 4 B 5 C C 6 C

  • DAO エクセルvbaからアクセスのレコードの件数

    DAOで、エクセルvbaからアクセスのレコードの件数を取得したいのですが Dim ac As Object Dim db As DAO.Database Dim rs As DAO.Recordset Set ac = CreateObject("Access.Application") Set db = ac.DBEngine.OpenDatabase("D:\あああ.accdb", False, True) Set rs = db.OpenRecordset("SELECT * FROM Tマスタ WHERE masterkey like '*四*';") i = rs.RecordCount Debug.Print rs("masterkey") rs.Close: Set rs = Nothing db.Close: Set db = Nothing ac.Quit: Set ac = Nothing をすると、抽出するレコードが1000件でも、必ず1が返ります。 masterkeyフィールドは文字列型です。 なぜ実際はたくさんのレコードがあるのに、1が返るのでしょうか?

  • グループ毎にある列の最大値のレコードを取得する方法

    Accessで下記のようなテーブルでkeyフィールド毎のdayフィールドの最大値のレコードを取得したいと思ったのですが、keyフィールドとdayフィールドのみを表示する分には下記の記述で大丈夫かと思ったのですが、これにidフィールドとfieldフィールドもあわせて表示したい場合、どのように記述すれば良いか分からなかった為、アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。 なお、出来れば同じkey,同じdayが複数あった場合、一番大きいid(主キー)のレコードを取得したいと思っています。 【テーブル(T_TBL)】 id|key|day|field ------------------ 1|1|     |100 2|2|2011/03/04|400 3|2|2011/03/03|500 4|3|2011/03/10|300 5|3|2011/03/10|200 【下記ソース実行時のメッセージボックスの表示結果】 1 : 2 : 2011/03/04 3 : 2011/03/10 【希望する表示結果】 1 : 1 : : 100 2 : 2 : 2011/03/04 : 400 5 : 3 : 2011/03/10 : 200 【ソース】 Option Compare Database Option Explicit Private Sub Form_Load() Dim db As DAO.Database Dim rs As DAO.Recordset Dim SQL As String Dim strMsg As String Set db = CurrentDb() SQL = "" SQL = SQL & "SELECT key, Max(day) AS max_day" SQL = SQL & " FROM T_TBL" SQL = SQL & " GROUP BY key" Set rs = db.OpenRecordset(SQL) Do Until rs.EOF strMsg = strMsg & vbNewLine & rs!Key & " : " & rs!max_day rs.MoveNext Loop MsgBox vbNewLine & strMsg rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Sub 以上、よろしくお願いします。

  • Access 2000 の VB での テーブル作成について質問です。

    下記のようにAccess 2000のVBからDAOを使ってテーブルを作っておりますが、 作るフィールドに規定値の設定もVBからできないのでしょうか?DAOだと無理なのでしょぅか? 教えてください Dim db As DAO.Database Dim tbdef As DAO.TableDef Dim flID As DAO.Field Set db = CurrentDb Set tbdef = db.CreateTableDef("テーブル") Set flID = tbdef.CreateField("ID", dbInteger)   tbdef.Fields.Append flID   db.TableDefs.Append tbdef db.Close: Set db = Nothing