access2007 VBA データの抽出SQLがわかりません。

このQ&Aのポイント
  • access2007のVBAでデータの抽出SQLを作成していますが、必要なデータが抽出できません。
  • 質問者はAテーブルからintSEQ前からintSEQ後に入力された数値のデータを抽出したいと考えています。
  • しかし、SQL文の条件部分が正しく動作しないようです。
回答を見る
  • ベストアンサー

access2007 VBA データの抽出SQLがわかりません。

access2007 VBA データの抽出SQLがわかりません。 下記のように記述しているのですが、Aテーブルから必要なデータが抽出できません。どなたかご教授いただけますか。 ※ 「Me.txtSEQ前.Value」「Me.txtSEQ後.Value」はテキストコントロールです。プロパティでの書式設定は何もしていません。 ========================================= Dim intSEQ前 As Long Dim intSEQ後 As Long 'テキストコントロールなので、数値型にする。 '分かりやすくするために、ここで定義しています。 intSEQ前 = CLng(Me.txtSEQ前.Value) intSEQ後 = CLng(Me.txtSEQ後.Value) 'データを抽出します 'intSEQ前からintSEQ後に入力された数値を抽出する。 strSQL = "SELECT " strSQL = strSQL & "* " strSQL = strSQL & "FROM Aテーブル " strSQL = strSQL & "WHERE 県コード=1 " strSQL = strSQL & "AND (SEQ >= intSEQ前 OR SEQ <= intSEQ後) " strSQL = strSQL & "ORDER BY SEQ " Set objRs = myDB.OpenRecordset(strSQL, dbOpenSnapshot) ※下記をコメントアウトするとデータは正しく抽出されているようです。 strSQL = strSQL & "AND (SEQ >= intSEQ前 OR SEQ <= intSEQ後) " 以上。よろしくお願い致します。

noname#117351
noname#117351

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

  • ベストアンサー
  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.2

パラメータクエリを使うのが正攻法ですが、それが難しかったら変数の値をSQL文に記述してもOKです。 strSQL = strSQL & "AND (SEQ >= intSEQ前 OR SEQ <= intSEQ後) " ↓ strSQL = strSQL & "AND (SEQ >= " & intSEQ前 & " OR SEQ <= " & intSEQ後 & ") "

noname#117351
質問者

お礼

教えていただいたもので抽出できました。ありがとうございました。 (しかし、ORではなくANDでした・・・。)

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

SQL文中にVBA変数名を直書きできると考えたのが、敗因。 パラメータクエリを使ってみては。 http://www.google.co.jp/search?hl=ja&lr=lang_ja&tbs=lr%3Alang_1ja&q=%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%AF%E3%82%A8%E3%83%AA+Access+ADO&aq=f&aqi=&aql=&oq=&gs_rfai=

noname#117351
質問者

お礼

パラメータクエリを使った事がなく、存在すら知りませんでした。次回、是非使ってみたいです!ありがとうございます!

関連するQ&A

  • Access VBAでのデータ抽出の仕方

    Access VBAでのデータ抽出の仕方 Access VBAでデータを抽出して、テキストボックスにデータを配置したいと思います。 Formにtxt1~txt10までのテキストボックスが10個あります。 テーブルからデータを引っ張ってきてレコードセットにいれます。 Dim objADOCON As ADODB.Connection Dim objADORS As ADODB.Recordset Dim strSQL As String Dim SQL As string SQL = "Select * from Table1" Set objADOCON = Application.CurrentProject.Connection Set objADORS = objADOCON.Execute(SQL) これでレコードセットを取得しました。このレコードセットは「ID」列があり、プライマリーキーを設定しています。またZAIKOという列もあります。 ID=001の時、在庫は100 ID=002の時、在庫は200 といったように条件を絞って、テキストボックスに値を入れたいと思います。 objADORS.Filter = "[ID] = '001'" txt1.value = objADORS!ZAIKO objADORS.Filter = "[ID] = '002'" txt2.value = objADORS!ZAIKO ..... を10回繰り返せば条件毎に値がセットするのはわかります。 ただし、あまりスマートなやり方ではなく、もっといい方法があるんじゃないかと思うのですが考えつきません。 何か良い方法、手段がありましたらお教え下さい。 よろしくお願いします。

  • VBA 抽出条件でデータ型が一致しません

    Access 2003について教えて下さい。環境はWin XPです。 Table1 ID(メモ型),日付(日付/時刻型 書式 日付(S)) 001,2012/08/10 002,2012/08/10 Form1 フォームにはテキストボックス、 txt_Dateがあります。 書式は日付(S)です。 ここには、yyyy/mm/ddの形式で値を打ち込む、またはカレンダーから選択します。 同じくボタン、btn_exeがあります。 これをクリックすると処理がはじまります。 Dim getDate As Date Dim strSQL As String Dim objADOCON As ADODB.Connection Dim objADORS As ADODB.Recordset getDate = txt_Date.Value strSQL = "select * from Table1 where 日付 = '" & getDate & "'" objADORS.Open strSQL, objADOCON, adOpenKeyset, adLockOptimistic 質問1. where 日付 = '" & getDate & "'" でやると下記のメッセージが表示されます。 抽出条件でデータ型が一致しません where 日付 = " & getDate でやると、エラーメッセージは起こりません。 何故このようなメッセージが表示されるのでしょうか? 質問2. Table1には2012/08/10というデータが日付フィールドに存在します。 where 日付 = " & getDate ではエラーメッセージが出ないので、 次のレコードセット取得時、レコード取得件数が0件です。 条件文が上手くいっていないような気がします。なぜでしょうか? ちなみに、 strSQL = "select * from Table1 では問題なくレコードセットを取得できています。 宜しくお願いします。

  • ACCESS VBA 2つのテーブルから抽出

    ACCESS VBA初心者です 見よう見まねで作成してみたのですが、デバックになってしまい先に進めません どなたか、どこがどう違うのか教えてください テーブル1とテーブル2の15項目ほどをぶつけて 一致しないレコードを抽出し、その抽出したレコードを既存のテーブル3にコピーをしたいのですが、その方法がわかりません Sub QQ() Dim DB As DAO.Database Set DB = CurrentDb() DB.Execute "DELETE * FROM テーブル3;" Dim strSQL As String strSQL = "INSERT INTO テーブル3 ( AAA, BBB, CCC, DDD, EEE, FFF, GGG, HHH, III, JJJ ) " strSQL = strSQL & " SELECT テーブル1.AAA, テーブル1.BBB, テーブル1.CCC, テーブル1.DDD, テーブル1.EEE, テーブル1.FFF, テーブル1.GGG, テーブル1.HHH, テーブル1.III, テーブル1.JJJ, FROM AAA;" DB.Execute strSQL Dim TB_テーブル2 As DAO.Recordset Dim TB_テーブル3 As DAO.Recordset Set TB_テーブル2 = DB.OpenRecordset("Select * from テーブル2;") While TB_テーブル2.EOF = False Debug.Print TB_テーブル2![AAA] Debug.Print TB_テーブル2![BBB] Debug.Print TB_テーブル2![CCC] Debug.Print TB_テーブル2![DDD] Debug.Print TB_テーブル2![EEE] Debug.Print TB_テーブル2![FFF] Debug.Print TB_テーブル2![GGG] Debug.Print TB_テーブル2![HHH] Debug.Print TB_テーブル2![III] Debug.Print TB_テーブル2![JJJ] strSQL = "SELECT テープ3.* FROM テーブル3 " strSQL = strSQL & "WHERE (((テーブル3.AAA)='" & TB_テーブル2![AAA] & "') " ←デバックヵ所 strSQL = strSQL & " AND ((テーブル3.BBB)='" & TB_テーブル2![BBB] & "') " strSQL = strSQL & " AND ((テーブル3.CCC)='" & TB_テーブル2![CCC] & "') " strSQL = strSQL & " AND ((テーブル3.DDD)='" & TB_テーブル2![DDD] & "') " strSQL = strSQL & " AND ((テーブル3.EEE)='" & TB_テーブル2![EEE] & "') " strSQL = strSQL & " AND ((テーブル3.FFF)='" & TB_テーブル2![FFF] & "') " strSQL = strSQL & " AND ((テーブル3.GGG)='" & TB_テーブル2![GGG] & "') " strSQL = strSQL & " AND ((テーブル3.HHH)='" & TB_テーブル2![HHH] & "') " strSQL = strSQL & " AND ((テーブル3.III)='" & TB_テーブル2![III] & "') " strSQL = strSQL & " AND ((テーブル3.JJJ)=" & TB_テーブル2![JJJ] & "));" Set TB_テーブル3 = DB.OpenRecordset(strSQL) Debug.Print "COUNT=" & TB_テーブル3.RecordCount If TB_CCC.RecordCount > 0 Then Debug.Print "削除" TB_テーブル3.Delete Else Debug.Print "追加" TB_テーブル3.AddNew TB_テーブル3![AAA] = TB_テーブル2![AAA] TB_テーブル3![BBB] = TB_テーブル2![BBB] TB_テーブル3.Update End If TB_テーブル3.Close TB_テーブル2.MoveNext Wend TB_テーブル2.Close DB.Close End Sub

  • VBAのデータ型に関する質問です。 以下のような宣言と処理をしました。

    VBAのデータ型に関する質問です。 以下のような宣言と処理をしました。 Dim 数値1 As Integer Dim 数値2 As Integer Dim 数値3 As Long 数値1=Range("b5").Value 数値2=Range("c5").Value 数値3=数値1*数値2 この式では、数値3がLongの型ではなくIntegerになってしまいオーバーフローのエラーになってしまいます。(10000×5の場合等)Long型のまま代入する方法がありましたら教えてください。よろしくお願いいたします。

  • Access VBA SQL文で教えてください

    strSQL = "SELECT 日付,ブロック_cd,時刻 FROM テーブルA" strSQL = strSQL & " WHERE 日付 = " & Me.売上日 & "" strSQL = strSQL & " AND ブロック_cd = & Me.cmb_ブロック & " strSQL = strSQL & " AND 時刻 = & Me.時刻 & " WHERE句以下を削除するとレコードを読み込んできます。 よって、WHERE句がおかしいようです。 テーブルA: 日付:日付/時刻型(yyyy/mm/dd) ブロック_cd:数値型 時刻:日付/時刻型(hh:nn) me.売上日:日付形式(yyyy/mm/dd) me.cmb_ブロック:コンボボックスの値(数値) me.時刻:時刻形式(hh:nn) おそらく、me.のくくり方がおかしいとは思うのですが どのように修正すればよろしいでしょうか? よろしくお願いします。

  • access一部のフィールドを他のテーブルへVBA

    先日 https://okwave.jp/qa/q10245651.html において > table2の新しいデータとして > table1のデータをコピーしたい、 単に追加で ということであれば、という 御回答: Sub Test() Dim StrSQL As String StrSQL = "INSERT INTO table2 SELECT table1.* FROM table1;" DoCmd.SetWarnings False DoCmd.RunSQL StrSQL DoCmd.SetWarnings True End Sub ---------------------- 上記の 回答をいただき うまく稼働しました 部分的にフィールドを別テーブルに 移動するとき ここでは table1のフィールド名 IDに table2のフィールド名 bに 入っている数値 にい 1を加えた数値を 移動したいのですが Public Function Test() Dim tb1 As Table Dim tb2 As Table tb1 = table1 tb2 = table2 Dim strSQL As String strSQL = "INSERT INTO table2![ID]SELECT"("[b]"FROM tablel)+1" (table1のフィールド[b]の数値に1を加えた数値を table2のフィールド[ID]に移行する、というつもりです) DoCmd.SetWarnings False DoCmd.RunSQL strSQL DoCmd.SetWarnings True End Function 稼働しません すみません 宜しくお願い致します (ついでながら ここで でてくるb というのは テーブル table3 の IDの総和 すなわち SELECT Count(table3.ID) AS b FROM table3; 要は table3の最後のレコードの次のレコードの 番号の数値を table2のIDに移動したい というわけであります) (いずれのIDや bについても 数値型 長整数型 重複あり です)

  • SQLとDAOで取得するレコード件数が違う?

    Access2007でSQLで実行した結果と、レコードセットで取得した件数が一致せずに困っています。 いろいろ調べてはみたのですが、なぜかわかりません。 よろしくお願いします。 ○TableA 型 Code1 数値型(主キー) Text テキスト型 Code2 数値型 ○TableA データ Code1 Text Code2 111 AAA 10 112 BBB 15 113 CCC 20 114 DDD 20 ○VBAコード Dim strSQL As String Dim db As DAO.Database Dim rstFind As DAO.Recordset strSQL = "SELECT * FROM TableA Where Code2 = 20" Set db = CurrentDb() Set rstFind = db.OpenRecordset(strSQL, dbOpenSnapshot) MsgBox rstFind.RecordCount この状態でSQLビューから実行すると2件が抽出され、上記VBAを実行するとMsgBoxには「1」と表示されます。

  • Access2000のVBAについて

    下記のプログラムだと挿入が可能になります。 Private Sub 削除_コマンド_Click() If IsNull(Me.社員コード) Then MsgBox ("社員コードが入力されていません") Else Dim strSQL As String strSQL = "INSERT INTO 社員情報テーブル(社員コード,作成日) " _ & " VALUES ('" & Me.社員コード & "', now());" DoCmd.RunSQL strSQL End If End Sub しかし、下記のプログラムだとinsert文の『Me.社員コード』で エラーが発生します。 エラーメッセージは 『メソッドまたはデータメンバが見つかりません』 と表示されます。 上と下とどう違うのでしょうか。 Private Sub 削除_コマンド_Click() If IsNull(Me.社員コード) Then MsgBox ("社員コードが入力されていません") Else Dim strSQL As String strSQL = "INSERT INTO 社員情報テーブル(社員コード,氏名(氏),作成日) " _ & " VALUES ('" & Me.社員コード & "','" & Me.氏名(氏) & "', now());" DoCmd.RunSQL strSQL End If End Sub

  • Access2007 データ型エラーについて

    お世話になっております。 下記のVBAでコードを数値型からテキスト型に変更したところ、「抽出条件でデータ型が一致しません。」というエラーが出ました。 デバッグをクリックすると、dbs.Execute strSQLの部分が黄色に反転しています。 VBAはあまり詳しくありませんので、エラーが出なくなる方法を教えていただければ助かります。 よろしくお願いいたします。 Private Sub 在庫差引_Click() Dim dbs As Database Dim rst As Recordset Dim strSQL As String Set dbs = CurrentDb Set rst = Me!サブフォーム.Form.RecordsetClone With rst .MoveFirst Do Until .EOF strSQL = "UPDATE マスター " & _ "SET 在庫数 = NZ(在庫数) - " & Nz(!数量, 0) & " " & _ "WHERE コード = " & !コード dbs.Execute strSQL .MoveNext Loop .Close End With End Sub

  • Access2000 VBA - 変更の履歴が取れません

    下記コードで、If Nz(Ctr.OldValue, "") <> Nz(Ctr.Value, "") Thenの行で「指定した式には値がありません」というエラーが出てしまいます。 他のQ&Aで見つけた成功例のほぼコピペなのですが・・・・ どこが悪いのか、ご教示頂けないでしょうか? よろしくお願い致します。 __________________________________________________________________________________________ Private Sub Form_BeforeUpdate(Cancel As Integer) Dim Ctr As Control Dim strSQL As String For Each Ctr In Me.Controls If Nz(Ctr.OldValue, "") <> Nz(Ctr.Value, "") Then strSQL = "insert into 履歴 values('currentuser'," & Ctr.Value & _ ",'" & Ctr.Name & "','" & Ctr.OldValue & "',#" & Now() & "#)" DoCmd.SetWarnings False DoCmd.RunSQL strSQL DoCmd.SetWarnings True End If Next Ctr End Sub