我不是VBA和excel Macro的优秀专家,但我需要执行数据库中存在的SQL宏。 它的SQL定义中的这个宏执行一些'echo'操作(开头是4'echo') 最后2'echo'然后SQL宏检索18列。 删除'echo'检索执行良好,但我需要在SQL代码中维护'echo',因为该宏是由系统自动创建的。 要从外部源检索数据,我使用了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表中,然后它不会检索任何其他内容,也不检索其他的回声'也不是我感兴趣的18列数据。 我尝试将记录集MoveNext和Move方法移动到第5个位置(因为我认为第5个位置对应于第一个18列数据,因为我在开头有4个'回声'但是它不起作用:( 即使移动到第二个位置也不起作用,所以我得出结论,在我的记录集中,我只有一个对应于第一个'echo'的条目,然后记录集到达其EOF并退出循环。 我的代码中是否有一种方法或更改可以避免检索SQL宏生成的“echo”?
提前谢谢
答案 0 :(得分: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