2012-05-07 5 views
0

VBAの優れたエキスパートではありませんが、Excelマクロをエキスパートしていますが、データベースに存在するSQLマクロを実行する必要があります。 SQL定義内のこのマクロは、いくつかの 'echo'操作(最初は の4 'echo'、最後は2 'echo')を実行し、SQLマクロは18個の列を取得します。 検索の 'エコー'を削除するとパフォーマンスは向上しますが、このマクロはシステムによって自動的に作成されるため、SQLコードで 'echo'を維持する必要があります。VBAで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マクロ内でのみ最初の「エコー」は検索され、私のExcelシートに印刷されたということです: は、次のように私は、ADOレコードセットを使用し、私の外部ソースからデータを取得するには最初の列では、それ以外のものは取得しません。他の「エコー」も、18列のデータも取得できません。 MoveNextとMoveメソッドを5番目の位置に移動しようとしましたが(最初の18列のデータに対応するので、5番目の位置は最初に4 'エコーがあります)、動作しませんでした。 ( 2番目の位置に移動しても機能しないので、私は自分のレコードセットに最初の「エコー」に対応するエントリが1つしかないと判断し、レコードセットはそのEOFに達してループを終了します。 SQLマクロによって生成さ「エコー」の検索を避ける私のコードの変更は?

は、事前にありがとう

答えて

0

あり、ここでのミスは、おそらくですが、私はあなたがこのような何かをしたいと思います。あなただけGetRowsを一度呼びたいあなたがそれを呼び出した後は、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 
+0

事実も、コードのあなたの部分でRSのみ、最初の「エコー」印刷して、他には何が含まれていることです...あなたの助けにダグありがとう、それはうまくいきませんでした... Iそれを調整しようとしましたが(今のところ)成功なし...:D – brokenp87

関連する問題