- 締切済み
レコードの文字列をフィールド抽出のクエリとして指定
レコードの文字列として リンゴ ミカン イチゴ となっていたときに、この3つを別のテーブルにあるフィールド名のリンゴ、ミカン、イチゴのみを抽出するクエリをVBAで指定できますか?
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- kkkkkm
- ベストアンサー率66% (1719/2589)
回答No.1の追加訂正です。 現状ではクエリの結果を開いた状態でモジュールを実行しても元の結果のままですので クエリが開いていたら閉じるようするために 最初の方で以下のようになっているところを Set rs2 = db.OpenRecordset("文字列テーブル", dbOpenTable) ReDim sqlStr1(rs1.Fields.Count) 以下のように上記の間にIf~End Ifの部分を追加してください。 Set rs2 = db.OpenRecordset("文字列テーブル", dbOpenTable) If SysCmd(acSysCmdGetObjectState, acQuery, "テストクエリ") = acObjStateOpen Then DoCmd.Close acQuery, "テストクエリ" End If ReDim sqlStr1(rs1.Fields.Count)
- kkkkkm
- ベストアンサー率66% (1719/2589)
別テーブルのフィールドで文字列と一致するフィールドだけクエリで出したいという事だとしたら テストクエリという空のクエリを作成してから実行してください。 文字列テーブルがイチゴとかの文字が入っているテーブルでフィールド名が「品」にしてます。 実行時にはテストクエリは閉じておいてください。 Private Sub test() Dim db As Database, rs1 As Recordset, rs2 As Recordset Dim i As Long, j As Long, sqlStr1 As Variant, sqlStr2 As Variant Dim mySQL As String, SqlTmp As String Set db = CurrentDb Set rs1 = db.OpenRecordset("別のテーブル", dbOpenTable) Set rs2 = db.OpenRecordset("文字列テーブル", dbOpenTable) ReDim sqlStr1(rs1.Fields.Count) For i = 0 To rs1.Fields.Count - 1 sqlStr1(i) = rs1.Fields(i).Name Next i = 0 ReDim sqlStr2(0) rs2.MoveFirst Do Until rs2.EOF ReDim Preserve sqlStr2(i) sqlStr2(i) = rs2![品] rs2.MoveNext i = i + 1 Loop SqlTmp = "" For i = LBound(sqlStr2) To UBound(sqlStr2) For j = LBound(sqlStr1) To UBound(sqlStr1) If sqlStr1(j) = sqlStr2(i) Then SqlTmp = SqlTmp & sqlStr1(j) & ", " Exit For End If Next Next SqlTmp = Left(SqlTmp, Len(SqlTmp) - 2) mySQL = "SELECT " & SqlTmp & " FROM " & rs1.Name & ";" CurrentDb.QueryDefs("テストクエリ").SQL = mySQL DoCmd.OpenQuery "テストクエリ" Set rs1 = Nothing Set rs1 = Nothing Set db = Nothing End Sub