Получил глупую проблему, это швы простые, но я просто не понимаю.
Есть очень простой код VBA для листе Excel:Ошибка при анализе набора записей в VBA
Private Sub GET_MDW_DATA()
On Error GoTo ErrorHandler
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Dim cmdSQLData As ADODB.Command
Set cmdSQLData = New ADODB.Command
Dim cnstr As String
Dim usr
Set usr = Nothing
usr = Sheet1.Cells(1, 4).Value
Dim pwd
Set pwd = Nothing
pwd = Sheet1.Cells(2, 4).Value
Dim odbcname
Set odbcname = Nothing
odbcname = Sheet1.Cells(1, 8).Value
Dim Category As String
Category = Sheet1.Cells(1, 6).Value
Dim Store As String
Store = Sheet1.Cells(2, 6).Value
cnstr = "Data Source=" & odbcname & "; Database=belccp_msi_d; Persist Security Info=True; User ID=" & usr & "; Password=" & pwd & "; Session Mode=ANSI;"
cn.Open cnstr
Set cmdSQLData.ActiveConnection = cn
Sheet1.Range("A6 : H1000000").Clear
Query = "SELECT SOMETHING FROM SOME DATABASE"
cmdSQLData.CommandText = Query
cmdSQLData.CommandType = adCmdText
cmdSQLData.CommandTimeout = 0
Set rs = cmdSQLData.Execute()
rs.MoveFirst
x = 6
Do While (rs.BOF = False or rs.EOF = False)
p = rs.GetRows(-1)
Sheet1.Range("A" & x).Value = p(0, 8)
Sheet1.Range("B" & x).Value = p(1, 8)
Sheet1.Range("C" & x).Value = p(2, 8)
Sheet1.Range("D" & x).Value = p(3, 8)
Sheet1.Range("E" & x).Value = p(4, 8)
Sheet1.Range("F" & x).Value = p(5, 8)
Sheet1.Range("G" & x).Value = p(6, 8)
Sheet1.Range("H" & x).Value = p(7, 8)
x = x + 1
Loop
cn.Close
Set cn = Nothing
Set rs = Nothing
Set cmdSQLData = Nothing
Если я «печать» мой выбор, скопируйте его и выполнить его в запросе, она возвращает 30 строк из моей базы данных, но когда я исполню ее из моего excel «code» он возвращает только 1 строку, только одну строку из 30 строк.
Я проверил его и перед x=x+1
rs.EOF
is True
. Это означает, что мой набор записей имеет только одно значение (если это так, потому что мой выбор возвращает 30 строк) или что я не разбираю его правильно. Любые намеки?
Большое спасибо заранее,
Я не совсем уверен, , но по какой-либо причине вы используете 'rs.GetRows (-1)'? Потому что согласно [это] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms675120 (v = vs.85) .aspx) и [это] (http://msdn.microsoft .com/en-us/library/windows/desktop/ms677558 (v = vs.85) .aspx), который будет сразу извлекать _ALL_ записи в ваш 'p' (таким образом, двумерный массив). Обычно 'rs (0)', 'rs (1)' и т. Д., С 'rs.MoveNext' достаточно. – Passerby