0

我在从查询返回到数据库的 Excel VBA 中有一个 ADOBE.Recordset。我应该如何在这个集合中找到符合特定标准的特定记录?下面是代码。任何人都可以为我填写“'打印出一个年龄是我的人的名字”部分吗?提前致谢!

Dim rs As ADOBE.Recordset
q = "select name, age from people where country = 'US'"
Set rs = conn.Execute(q) 'conn is an ADOBE.Connection
For i = 30 To 40
    'print out the name of one person whose age is i 
Next i

更新 1: 感谢 KazJaw!我认为您的解决方案应该有效。但是,我正在寻找更清洁的解决方案 -

  1. 我不想将查询结果保存到工作表中。我更喜欢他们在记忆中。
  2. 是否有我可以使用的 .Find 或 .Search 功能,这样我就不需要使用循环实现搜索(就像您在第二个解决方案中所做的那样)?

也许我在这里很贪婪,但理想情况下,我想要这样的东西:

Dim rs As ADOBE.Recordset
q = "select name, age from people where country = 'US'"
Set rs = conn.Execute(q) 'conn is an ADOBE.Connection
For i = 30 To 40
    name = rs.Find("age = i")!name 'this line is where I am not sure how to achieve 
    MsgBox name & "'s age is " & i 
Next i

为格式化道歉。我是该站点的新手,不确定如何正确缩进 For 循环中的两行。

更新 2:

是的 KazJaw,其他问题出现了。".Find" 要求 rs 能够向后滚动,这需要将其 lockType 设置为 adLockOptimistic。还没想好怎么弄 如果我会发布。

解决方案: 关键是使用rs.Open而不是conn.Execute并设置CursorType。

Dim rs As ADOBE.Recordset
q = "select name, age from people where country = 'US' Order By i"
Set rs = New ADODB.Recordset
rs.Open Source:=q, CursorType:=adOpenStatic,  ActiveConnection:=ThisWorkbook.conn 'conn is an ADOBE.Connection      
For i = 30 To 40
    name = rs.Find("age = i")!name 'this line is where I am not sure how to achieve 
    MsgBox name & "'s age is " & i 
Next i
4

1 回答 1

0

第一个解决方案,没有循环,你可以这样做,但你需要坚持@mehow的建议,age condition应该在SQL查询中实现。

'return all results as of cell A2, direction down+right, in activesheet
ActiveSheet.Range("A2").CopyFromRecordset rs

第二种解决方案,使用循环,而不是您的For i...Next循环尝试以下解决方案。

Dim lRow as long
lRow=2
With rs
    Do Until .EOF
        'return only those which age equals to i
        'if implemented in SQL query then you could get rid of if statement below
        if .Fields(1).Value = i then
            Cells(lRow, 1) = .Fields(1).Value
            Cells(lRow, 2) = .Fields(2).Value
        .MoveNext
        lRow = lRow + 1
        end if
    Loop
End With

第三种解决方案。如果你真的需要使用,.Find method那么就这样做吧:

'...your loop here

rs.Find "age = " & i
name = rs(0)
MsgBox name & "'s age is " & i 

'... rest of your code here 

不幸的是,我不确定它是否会起作用。我认为您需要在 SQL 代码中按年龄对结果进行排序。如果不是,我希望可以省略一些年龄。可能会出现其他一些问题。因此尝试使用其他解决方案。

于 2013-10-21T13:51:40.150 回答