0

我不是 VBA 和 excel 宏的出色专家,但我需要执行数据库中存在的 SQL 宏。该宏在其 SQL 定义中执行一些“echo”操作(开头 4 个“echo”,结尾有 2 个“echo”),然后 SQL 宏检索 18 列。删除“回声”检索执行良好,但我需要在 SQL 代码中维护“回声”,因为此宏是由系统自动创建的。为了从我的外部源中检索数据,我使用了 ADO 记录集,如下所示:

'If the recordset is empty
If (rs.EOF And rs.BOF) Then
    iReply = MsgBox(Prompt:="No data retrieved", _
        Buttons:=vbOKOnly, Title:="Error")
Else 'If the recordset contains data
    rs.MoveFirst
    Row = 2
    Do While (rs.EOF = False And rs.BOF = False)         
        p = rs.GetRows
        Sheet2.Range("A" & Row).Value = p(0, 0)
        Sheet2.Range("B" & Row).Value = p(1, 0)
        Sheet2.Range("C" & Row).Value = p(2, 0)
        Sheet2.Range("D" & Row).Value = p(3, 0)
        Sheet2.Range("E" & Row).Value = p(4, 0)
        Sheet2.Range("F" & Row).Value = p(5, 0)
        Sheet2.Range("G" & Row).Value = p(6, 0)
        Sheet2.Range("H" & Row).Value = p(7, 0)
        Sheet2.Range("I" & Row).Value = p(8, 0)
        Sheet2.Range("J" & Row).Value = p(9, 0)
        Sheet2.Range("K" & Row).Value = p(10, 0)
        Sheet2.Range("L" & Row).Value = p(11, 0)
        Sheet2.Range("M" & Row).Value = p(12, 0)
        Sheet2.Range("N" & Row).Value = p(13, 0)
        Sheet2.Range("O" & Row).Value = p(14, 0)
        Sheet2.Range("P" & Row).Value = p(15, 0)
        Sheet2.Range("Q" & Row).Value = p(16, 0)
        Sheet2.Range("R" & Row).Value = p(17, 0)
        Row = Row + 1
    Loop
End If

事实是,使用 SQL 宏中的“echo”,只有第一个“echo”被检索并打印在我的 excel 表的第一列中,然后它不会检索其他任何东西,其他的“echo”和我感兴趣的 18 列数据。我尝试使用记录集 MoveNext 和 Move 方法移动到第 5 个位置(因为我认为第 5 个位置对应于前 18 列数据,因为我在开头有 4 个“回声”)但它没有工作:(即使移动到第二个位置也不起作用,所以我得出结论,在我的记录集中我只有一个对应于第一个“回声”的条目,然后记录集到达其 EOF 并退出循环。有没有办法或改变我的代码可以避免检索 SQL 宏产生的“回声”吗?

先感谢您

4

1 回答 1

0

这里可能有一个错误,但我认为你想要这样的东西。您只想调用一次 GetRows,因为调用它之后,它与说 MoveLast 是一样的。这里的想法是将记录集转储到一个数组中,然后遍历“行”的每个元素(这是第二维)。在其中,循环浏览第 4 到 21 列,我认为这会跳过你的“回声”。

Dim p as Variant
Dim i as Long
Dim j as Long

'If the recordset is empty
If (rs.EOF And rs.BOF) Then
    iReply = MsgBox(Prompt:="No data retrieved", _
        Buttons:=vbOKOnly, Title:="Error")
Else 'If the recordset contains data
   'just fetch it once
   p = rs.GetRows
   'loop through the rows
   For i = Lbound(p,2) to Ubound(p,2)
      'loop through the columns that don't have "echo"
      For j = 4 to 21
        Sheet2.Cells(i,j-2).Value = p(j, i)
      Next j
   Next i
End If
于 2012-05-07T15:46:20.873 回答