プロが教える店舗&オフィスのセキュリティ対策術

access で、VBAにSQLを記述し、
その抽出結果を「Filter」でさらに抽出できるのでしょうか?

いろいろ調べても、
Me.Filter = "xxxx=xxxx"
と、オブジェクトが「Me」の例文しか見当たりません。

オブジェクトはどのように記述すればよいのでしょうか?
よろしくお願いします。

A 回答 (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の例でテスト済み。
    • good
    • 0

(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
    • good
    • 0

まあ、意味があるかどうかが疑問ですが不可能ではありません。



<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
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

お礼日時:2006/12/27 16:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています