• ベストアンサー

データベースから複数の条件を指定して抽出するには

VB初心者です。よろしくお願いします。 今、座席予約システムを作っています。その際、複数の条件を指定して、その条件に合うIDを抽出しようとしていますが、うまくいきません。具体的には、テーブル:[T-映画]の中にある、フィールド:[映画名]とフィールド:[時間帯]がそれぞれ一致したときに、同じテーブルにあるフィールド[映画ID]のデータを抽出するという処理です。 コードは次の通りです。 Private Sub Command1_Click() Dim db As ADODB.Connection Dim rst3 As ADODB.Recordset Set db = New ADODB.Connection db.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source =データベースへのパス\zaseki.mdb" db.Open Set rst3 = New ADODB.Recordset rst3.Open "[T_映画]", db, adOpenKeyset, adLockReadOnly With rst3 .Filter = "映画名= ' " & Module1.mojiB & " ' " ☆☆ If .RecordCount = 0 Then MsgBox "その映画は登録されていません" Else rst3.Filter = "時間帯 =' " & Module1.mojiC & " ' " If rst3.RecordCount = 0 Then MsgBox "その映画は登録されていません" Else Module1.eigaID = rst3.Fields("映画ID") End If End If End With rst3.Close db.Close Set db = Nothing Set rst3 = Nothing End Sub ☆☆の部分で映画名があるにも関わらずカウントしてくれません。 変数Module1.mojiB には、String型の映画名が Module1.mojiC には、String型の時間帯がそれぞれ入っています。 フィールド[映画名]、[時間帯]の型はテキスト型です。 よろしくお願いします。

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

  • ベストアンサー
noname#22222
noname#22222
回答No.2

ID   映画名    時間帯 1   ローマの休日  10-12 2   ローマの休日  13-15 3   エデンの東   10-12 4   エデンの東   13-15 ? DBLookup("ID", "[T-映画]", "映画名='ローマの休日' AND 時間帯='13-15'") 2 Private Sub コマンド4_Click()   Dim lngID As Long      lngID = DBLookup("ID", "[T-映画]", "映画名='ローマの休日' AND 時間帯='13-15'")   If lngID > 0 Then     MsgBox "ID=" & ID   Else     MsgBox "Not found!"   End If End Sub SELECT文を用いれば簡単かと思います。 バグの検証は、他の回答者の方に任せます。 Public Function DBLookup(ByVal strField As String, _              ByVal strTable As String, _              Optional ByVal strWhere As String = "", _              Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup    Dim DataValue    Dim strQuerySQL As String    Dim rst     As ADODB.Recordset    Set rst = New ADODB.Recordset    strQuerySQL = "SELECT " & strField & " FROM " & strTable    If Len(strWhere) > 0 Then      strQuerySQL = strQuerySQL & " WHERE " & strWhere    End If    With rst      .Open strQuerySQL, _         CurrentProject.Connection, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then        .MoveFirst        DataValue = .Fields(0)      End If    End With Exit_DBLookup: On Error Resume Next    rst.Close    Set rst = Nothing    DBLookup = Nz(DataValue, ReturnValue)    Exit Function Err_DBLookup:    MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"    Resume Exit_DBLookup End Function

HAtSu569
質問者

お礼

回答ありがとうございます。 コードまで書いていただきありがとうございます。 VB初心者なので、しっかりとコードの意味が理解できずにいます。 自作関数DBLookupをFunctionで定義し、それをコマンド4_Click() で実行しているというところまではわかるのですが、Function内でのコードがよく理解できません。実際にコードをコピーし実行したところ DBLookup = Nz(DataValue, ReturnValue)の Nz の部分でコンパイルエラーが出てしまいます。(内容はSubまたはFunctionが定義されていません とのことです。) 回答していただいたうえで恐縮ですが、質問のコードを基に(SQLを使わずに)開発を進めていきたいと思っています。 その上で何かアドバイスがありましたら、回答よろしくお願いします。

その他の回答 (2)

noname#60992
noname#60992
回答No.3

余計なおせっかいかもしれませんが、 実際にこのようなものを作ろうと考えておられるなら、 1、映画名を検索し、 2、該当映画タイトルを選び、 3、上映時間をリストなどに表示させ 4、該当時間を選ぶ としたほうが便利ですし、作るのも楽なような気がします。

HAtSu569
質問者

お礼

回答ありがとうございます。 参考にさせていただきます。

  • driverII
  • ベストアンサー率27% (248/913)
回答No.1

通常、参考リンクの下のほうにあるSQLでのレコードセットの取得を使うと思います。 「SELECT * FROM 生徒名簿 WHERE クラス = 'TS'」 の部分が 「SELECT [映画ID] FROM [T_映画] WHERE [映画名] = '対象' AND [時間帯] = '対象'」 になります。 質問のコードでやる場合には、 http://www.accessclub.jp/ado/21.html のあいまい検索でチャレンジしてみてください。 ついでにこの場合Withは使わないほうが良いのでは^^

参考URL:
http://www.geocities.jp/cbc_vbnet/ADO/recordset.html
HAtSu569
質問者

お礼

早々の回答ありがとうございました。 あいまい検索を試してみましたが駄目でした。以前、ファイルオープンする際にSQLを使用したところうまくいかなかったので、今の方法で開発を進めていきたいのですが。 何かよい方法がありましたら、教えてください。 あつかましい質問で申し訳ありません。

関連するQ&A

  • VB初心者ですAccessを更新したいのですが

    VB初心者です、よろしくお願いします。 VBでAccessのレコードの一項目を更新したいのですが出来ません。 抽出条件からAccessのデータを持ってきた後、更新したいのですがどうすればいいのでしょうか? 因みに抽出条件までは変更できません、AddNew以降でお願いします。 VB6でAccess2003です。 エラーは現在のRecordsetは更新をサポートしておりませ。プロダイバーかロックタイプの限界の可能性があります。 Set rst = New ADODB.Recordset '処理をするテーブル指定 rst.Open "[**]", db, adOpenStatic, adLockOptimistic With rst .MoveFirst .Filter = "" criteria1 = "" criteria1 = "**= '" & Module1.** & "'" .Filter = criteria1 If .RecordCount = 0 Then MsgBox "は登録されていません" Else .Filter = "" criteria2 = "" criteria2 = "**= '" & Module1.** & "' " .Filter = criteria2 If .RecordCount = 0 Then MsgBox "登録されていません" Else .Filter = "" criteria3 = "" criteria3 = "**'" & Module1.** & "' " .Filter = criteria2 If .RecordCount = 0 Then MsgBox "登録されていません" Else Module1.** = rst.Fields("**") .AddNew .Fields("***") = Module1.** .Update End If End If End If End With

  • ADOでアクセスのレコードに複数のフィルタをかけるには?

    Sub ADO() Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & アクセスファイル名 Set rs = New ADODB.Recordset rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic rs.Filter = ("フィールド1 = " & "'" & 変数1 & "'") rs.Filter = ("フィールド2 = " & "'" & 変数2 & "'") Debug.Print rs.RecordCount Set rs = Nothing Set cn = Nothing End Sub だと最終的にはフィールド2のフィルタ後の個数しか取得できません。 rs.Filter = ("案件CD = " & "'" & 案件CD & "'" And "プロセス = " & "'" & プロセス & "'") だと「型が一致しません」になります。 どうすれば変数1と変数2のフィルタ後のレコードの個数を取得できるのでしょうか? ご教授よろしくお願い致します。

  • AccessVBA:フィールドの標題名を取得したい

    いつもお世話になっております WindowsXP SP1 Access2002を使用しております。 あるテーブルのフィールド名をイミディエイトウィンドウに出力するプログラムを以下のように作成しました '--------------------------------------------------- 'ADO結果セットのフィールド名をイミディエイトウインドウに出力 '--------------------------------------------------- Sub test()   Dim testcnt As Long   Dim gDb_User  As ADODB.Connection   Dim Rst   As ADODB.Recordset      Set gDb_User = New ADODB.Connection   Set gDb_User = CurrentProject.Connection   Set Rst = New ADODB.Recordset      Rst.Open "select * from テーブル1 ", gDb_User, adOpenKeyset, adLockOptimistic      Debug.Print "FieldName"   Debug.Print "--------------"        For testcnt = 0 To Rst.Fields.Count - 1     Debug.Print Rst.Fields(testcnt).name   Next      Debug.Print "--------------"   Debug.Print "End"      Rst.Close   Set Rst = Nothing   gDb_User.Close   Set gDb_User = Nothing    End Sub '--------------------------------------------------- 実行すると、フィールドは出力されるのですが 各フィールド名の標題も取得したいと考えております。 標題のプロパティ等をどのように抽出すればよろしいでしょうか? ご教示のほど、何卒よろしくお願いいたします。

  • sql select文について

    access2000 でテーブル名が座席、 フィールド1 - ID(オートナンバー) フィールド2 - 座席コード フィールド3 - 座席番号 フォームはどのテーブルにも連結されておらず テキストボックス(バーコード)にバーコードで読ませた情報(座席コード) から座席番号を別のテキストボックス(座席番号) に表示させるにはどうすればいいですか? 以前こちらで教えていただいたのを元に自分で考えたのですが、うまくいきません。 コードは下記のとおりです。 何分初心者で見当違いの部分もあると思いますが、 ご了承ください。 Private Sub バーコード_AfterUpdate() Dim rst As New ADODB.Recordset Set rst = New ADODB.Recordset rst.Open "select * from 座席 where 座席コード = '" & Me.バーコード & "'", CurrentProject.Connection, adOpenKeyset, adlockpotimistic rst.Filter = "座席番号=" & "'" & txtバーコード & "'" If rst.EOF Then MsgBox ("座席情報がありません。") Me.バーコード = "" Else  Me.座席番号 = rst![座席番号] Me.バーコード = "" End If rst.Close Set rst = Nothing End Sub

  • access2000VBAで、外部ファイルに書き込むには

    access2000 VBAで 「sample.htmlを作成、 tableテーブルのデータを書き込む」 をして、htmlファイルを自動作成したいのですが、 うまくVBAがかけません。 とりあえず、外部ファイルにデータを出力に取り組んでいます 外部ファイルの作成の仕方と、書き込みのところで、 どうしたらいいのか分からず、困っています。 アドバイスおねがいします。<(_ _)> Dim cnc As New ADODB.Connection Dim rst As New ADODB.Recordset Set cnc = CurrentProject.Connection rst.Open "table", cnc, adOpenKeyset, adLockOptimistic, adCmdTableDirect Open sample.html For Output As #1 If rst.EOF Then MsgBox "There are not recordset" GoTo db_Close End If Do Until rst.EOF Debug.Print rst!種類, rst!名前, rst!url Write #1, rst!種類, rst!名前, rst!url rst.MoveNext Loop Close #1 db_Close: rst.Close Set rst = Nothing cnc.Close Set cnc = Nothing End Sub

  • ADOを使いDBへ読み書きしたい

    VB初心者です。よろしくお願いします。 今、VBのActiveXドキュメントを使い、ブラウザ上で利用できるシステムを作ろうと思っています。その際、Textboxに入力されたデータをADOを使いAccess2003に格納したいのですが、うまくいきません。DAOではうまくいきました。 コードは以下の通りです。 Private Sub Command1_Click() Dim db As ADODB.Connection Dim rst1 As ADODB.Recordset Set db = New ADODB.Connection db.ConnectionString= "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source = 'データへのパス'\zaseki3.mdb" db.Open MsgBox ("接続成功") Set rst1 = New ADODB.Recordset ☆☆rst1.Open "T-利用者", db,adOpenForwardOnly,adLockOptimistic   With rst1 .AddNew .Fields("氏名") = Text1 .Update End With rst1.Close db.Close Set db = Nothing Set rst1 = Nothing End Sub ☆☆のところでエラーが発生します。エラー内容は次の通りです。  実行時エラー'-2147217900(80040e14)': SQLステートメントが正しくありません。'DELETE'などを使用してく ださい。 環境は Windows XP, VB6.0, Access2003  です。 よろしくお願いします。

  • レコードセットからの抽出方法

    Access2000を使用しています。 下記のコードのとおり 入力用テキストボックスに座席コードを入力して seat テーブルから座席コードと入力したものからレコードを探して表示できているんですが、 レコードセットで抽出した座席番号が「P」のものだけ チェックボックス(pri.value=true) にしたいのですが動きませんどのようなコードを書けばいいんでしょうか? Dim rst As New ADODB.Recordset Set rst = New ADODB.Recordset rst.Open "select * from seat where 座席コード='" & Me.入力用テキストボックス & "'", _ CurrentProject.Connection, adOpenKeyset, adLockOptimistic If rst.EOF = True Then MsgBox ("座席情報はありません。") Me.入力用テキストボックス = "" End If If rst.EOF = False Then Me.座席コード = rst![座席コード] Me.座席番号 = rst![座席番号] Me.入力用テキストボックス = "" Me.受付時間 = Now() End If If Left(rst![座席番号], 1) = "P" Then Me.pri.Value = True

  • ADO 英語を含むレコードを抽出したい

    テーブルに保存されてるフィールド1の英語が含まれているレコード(ABC株式会社 など)を抽出したいのですが 方法がわかりません。 *[a-z]* を使うんだなと思いますが、フィルタのかけかたがわかりません。 Sub test() Dim CN As New ADODB.Connection Dim RS As New ADODB.Recordset CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ファイル名 RS.Open "テーブル1", CN, adOpenStatic, adLockOptimistic RS.Filter = "フィールド1 = " '←ここをどうすればいいでしょうか? RS.Close: Set RS = Nothing CN.Close: Set CN = Nothing End Sub サンプルを作ってみたのですが ご教示頂けないでしょうか? よろしくお願い致します。

  • フォームの従業員番号と日付から該当レコードを

    フォームの従業員番号と日付から該当レコードを検索したいのですができません。 おそらくFilterの文法が間違えているのではと思いましたが、色々試した結果 自力ではダメでした。何卒よろしくお願いします Private Sub テスト() Dim CN As ADODB.Connection: Set CN = CurrentProject.Connection Dim RS As ADODB.Recordset: Set RS = New ADODB.Recordset RS.Open "勤怠表", CN, adOpenKeyset, adLockOptimistic RS.Filter = "従業員番号 = " & Me.TB_StaffID & " and 日付 = #" & Format(Me.TB_Date, "yyyy/mm/dd") & "#" If RS.RecordCount = 0 Then Debug.Print "ありません" Else Do Until RS.EOF Debug.Print RS!勤怠番号 RS.MoveNext Loop End If RS.Close: Set RS = Nothing CN.Close: Set CN = Nothing End Sub

  • クロス集計クエリ内の特定フィールドの有無の確認

    クロス集計クエリ内の特定フィールドの有無の確認 いつもお世話になっております。 ご質問です。 【状況】 毎月クラブの部費を集めています。 テーブル「t_buhi_mas」 フィールド(一部抜粋) ・ID_NO(部員の番号) ・ID_NO_s(枝番) ・nm(部員名) ・year_buhi(年)  2017 ・month_buhi(月)  08 ・buhi(部費)   1000 クロス集計クエリのデータを基に、別のテーブルにデータを追加します。 クロス集計クエリの結果一例 ID_NO ID_NO_s nm 08 09 10 11 1 1 山田 1000 1000 1000 10000 ※08 09 10 11・・・月 この結果を基に別テーブル「tbl_A」にデータを追加したいのですが、以下の場所でエラーとなります。 テーブル「tbl_A」 フィールド(一部抜粋) ・ID_NO(部員の番号) ・ID_NO_s(枝番) ・nm(部員名) ・01(金額を格納)  ~ ・12(金額を格納) Dim h_sql as string Dim h_year as string h_year = "2017" h_sql = "TRANSFORM Sum(buhi) AS buhi_sum " & _ "SELECT ID_NO, ID_NO_s, nm " & _ "FROM t_buhi_mas " & _ "WHERE ([year_buhi] = '" & h_year & "') " & _ "GROUP BY ID_NO, ID_NO_s, nm " & _ "ORDER BY ID_NO, ID_NO_s, month_buhi " & _ "PIVOT month_buhi;" Dim cnn As ADODB.Connection Dim rst1 As ADODB.Recordset Dim rst2 As ADODB.Recordset Dim h_str_fld1 As String Set rst1 = New ADODB.Recordset rst1.Open h_sql, cnn, adOpenKeyset, adLockOptimistic, adCmdTableDirect With rst1 If .RecordCount = 0 Then: GoTo line4: .MoveFirst Set rst2 = New ADODB.Recordset rst2.Open "tbl_A", cnn, adOpenKeyset, adLockOptimistic, adCmdTableDirect Do Until .EOF rst2.MoveFirst Do Until rst2.EOF If !ID_NO = rst2!ID_NO And !ID_NO_s = rst2!ID_NO_s Then For i = 1 To 12 '1月~12月の計算 If i < 10 Then h_str_fld1 = "0" & i Else h_str_fld1 = i End If On Error Resume Next If IsNull(rst1(h_str_fld1)) Then  ←ここでエラー rst2(h_str_fld1) = 0 Else rst2(h_str_fld1) = rst1(h_str_fld1) End If rst2.Update On Error GoTo 0 Next GoTo line3: End If rst2.MoveNext Loop line3: .MoveNext Loop End With rst2.Close rst1.close cnn.close エラーコメント:このコレクションには項目がありません。 要するに、追加先のテーブル「tbl_A」には毎月の部費を格納するフィールド「01」~「12」があるのですが、 クロス集計結果には「01」がないためだと思います。 On Error Resume Next で回避できると思っていたのですが作動しません。 クロス集計クエリ内に、「01」など結果に基づいたフィールドが無い場合の回避方法がご存知であれば教えてください。 何卒宜しくお願い申し上げます。

専門家に質問してみよう