• ベストアンサー

access SQLの抽出結果をFilterできるか

access で、VBAにSQLを記述し、 その抽出結果を「Filter」でさらに抽出できるのでしょうか? いろいろ調べても、 Me.Filter = "xxxx=xxxx" と、オブジェクトが「Me」の例文しか見当たりません。 オブジェクトはどのように記述すればよいのでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

#2です。#2に長々と書いてしまったが、質問はFilterにかんしてっだったので Private Sub test10() On Error GoTo Err_cmdKensaku_Click Dim db As DAO.Database Dim rs As DAO.Recordset Dim mSQL As String Dim stLinkCriteria As String Dim varBegin As Variant Dim varEnd As Variant ' varBegin = Me.txtBigin ' varEnd = Me.txtEnd Set db = CurrentDb mSQL = "SELECT ID,氏名,勝回数 from テーブル1 WHERE 氏名='山田';" Set rs = db.OpenRecordset(mSQL, dbOpenDynaset) stLinkCriteria = "勝回数 > 3 " rs.Filter = stLinkCriteria Set rs = rs.OpenRecordset() If rs.EOF Then MsgBox "条件に一致するレコードは抽出できませんでした。" Else Do Until rs.EOF MsgBox rs!ID & rs!氏名 & rs!勝回数 rs.MoveNext Loop End If Exit_cmdKensaku_Click: Exit Sub Err_cmdKensaku_Click: MsgBox Err.Description Resume Exit_cmdKensaku_Click End Sub をご参考に。 参照設定で、DAO(Microsoft 3.6 DAO Libraryなど)を必ず設定のこと。 #2の例でテスト済み。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

(1)アクセスの普通の例 1レコードづつ受け取って(レコード処理、アクセス特有の処理)、下記のMsgboxのところで、自分のしたい処理をする。 Sub test08() Dim strSQL As String strSQL = "SELECT ID,氏名,勝回数 from テーブル1 WHERE 氏名='山田';" Dim cnn As ADODB.Connection Dim rst As ADODB.Recordset Dim retText As String Set cnn = CurrentProject.Connection With cnn .Errors.Clear .BeginTrans Set rst = .Execute(strSQL) rst.MoveFirst While Not rst.EOF MsgBox rst.Fields(0) & rst.Fields(1) & rst.Fields(2) rst.MoveNext Wend End With End Sub この処理の段階でIF文で篩(ふるい)にかける。 しかし普通はこんなことは行われないでしょう。初めにSQL文作成の段階で条件を追加したら済むことだから。 ーーー ほかの方法に (2)アクセスのクエリを作成する。クエリはテーブルとほとんど 同じ処理をさせてくれる。中間的にクエリを一旦つくり (A)そのあと、そのクエリを対象に、条件Xで選択クエリを実行する。 (B)もうひとつそのクエリを対象に、条件Yで選択クエリを実行する FilterはFormのプロパティなので、選択にVBAで無理して使うかどうかは別でしょう。 これで質問の意図が達せられるのではないですか。 そのやり方は Sub test07() ' Dim dbs As Database Dim strSQL As String Dim strQueryName As String ' Dim qryDef As ADO.QueryDef On Error Resume Next Set dbs = CurrentDb strQueryName = "氏名選択2" dbs.Delete strQueryName dbs.QueryDefs.Delete strQueryName strSQL = "SELECT 氏名,ID from テーブル1 WHERE 氏名='山田';" '---- Set qryDef = dbs.CreateQueryDef(strQueryName, strSQL) End Sub 両モジュールは一応30レコード(行)ほどの簡単下記データで実行確認済み ID 氏名 勝回数 1 山田 2 2 大川 1 3 東山 3 4 植山 2 5 近藤 1 6 今田 5 7 山田 6 8 岸田 6 9 岡野 1 10 野上 0 11 菊川 6 12 和田 7 13 江上 4 14 団 0 15 山田 1 16 来島 3 17 山田 12 18 佐藤 2 19 辻 9 20 桐山 6 21 江嶋 5 22 銀野 7 23 竹田 2 24 山田 1 25 高地 0 26 荒川 0 27 芳田 0 28 山田 12 29 杉本 2 30 ジョンソン 7 31 李 4

noname#140971
noname#140971
回答No.1

まあ、意味があるかどうかが疑問ですが不可能ではありません。 <Test> ID Field_1 1  110 2  220 3  330 Private Sub コマンド0_Click()   Dim strDatas As String      strDatas = CnnExecute2("SELECT * FROM TEST", "ID=2")   Debug.Print strDatas End Sub [イミディエイト] 2;220; 次のCnnExecute2 関数は、SQL文 "SELECT * FROM TEST" の実行結果を更にフィルターしています。 結果として、'ID=2' の列のみの取得しているので成功しているということです。 意味があるかどうかが疑問とは、"SELECT * FROM TEST WHERE ID=2" とすればいいからです。 なお、CnnExecute2 は、ErrMessage 関数がないと動作しません。 Public Function CnnExecute2(ByVal strSQL As String, ByVal strFilter As String) As String On Error GoTo Err_CnnExecute2    Dim I    As Integer    Dim N    As Integer    Dim cnn   As ADODB.Connection    Dim rst   As ADODB.Recordset    Dim retText As String       Set cnn = CurrentProject.Connection    With cnn      .Errors.Clear      .BeginTrans      Set rst = .Execute(strSQL)      rst.Filter = strFilter      .CommitTrans      If Not rst.BOF Then       N = rst.Fields.Count - 1       rst.MoveFirst       For I = 0 To N         retText = retText & rst.Fields(I) & ";"       Next I      End If    End With Exit_CnnExecute2: On Error Resume Next    cnn.Close    Set cnn = Nothing    CnnExecute2 = retText    Exit Function Err_CnnExecute2:    If cnn.Errors.Count > 0 Then      ErrMessage cnn.Errors(0), strSQL      cnn.RollbackTrans    Else      MsgBox "プログラムエラーが発生しました。システム管理者に報告して下さい。(CnnExecute2)", _         vbExclamation, " 関数エラーメッセージ"    End If    Resume Exit_CnnExecute2 End Function

PearlJam69
質問者

お礼

ありがとうございます。 この質問を思ったのは、抽出条件が複数のため、 分岐したいという意図がありました。