0

私はVBAの専門家ではなく、マクロに優れていますが、データベースに存在する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シートに出力されます。その後、他の「echo」も、他の「echo」も取得されません。私の興味深い18列のデータ。レコードセットのMoveNextメソッドとMoveメソッドを5番目の位置に移動しようとしましたが(最初に4'echo'があるため、5番目の位置は最初の18列のデータに対応すると思います)、機能しませんでした:( 2番目の位置に移動しても機能しないため、レコードセットには最初の「エコー」に対応するエントリが1つしかないため、レコードセットはそのEOFに到達し、ループを終了します。 SQLマクロによって生成された「エコー」の取得を回避する私のコード?

前もって感謝します

4

1 に答える 1

0

ここに間違いがあるかもしれませんが、私はあなたがこのようなものが欲しいと思います。GetRows を呼び出すのは 1 回だけにする必要があります。呼び出した後は、MoveLast と言うのと同じだからです。ここでの考え方は、レコードセットを配列にダンプし、「行」のすべての要素 (2 番目の次元) をループすることです。その中で、列 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 に答える