- ベストアンサー
access SQLの抽出結果をFilterできるか
access で、VBAにSQLを記述し、 その抽出結果を「Filter」でさらに抽出できるのでしょうか? いろいろ調べても、 Me.Filter = "xxxx=xxxx" と、オブジェクトが「Me」の例文しか見当たりません。 オブジェクトはどのように記述すればよいのでしょうか? よろしくお願いします。
- みんなの回答 (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)
(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
まあ、意味があるかどうかが疑問ですが不可能ではありません。 <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
お礼
ありがとうございます。 この質問を思ったのは、抽出条件が複数のため、 分岐したいという意図がありました。