有一个愚蠢的问题,它接缝简单,但我只是不明白 得到一个非常简单的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“代码”执行它时,它只返回1行,只有一行来自30行。
我已在x=x+1
rs.EOF
True
之前检查过它。这意味着我的记录集只有一个值(如果是这样,为什么?因为我的选择返回30行)或者我没有正确解析它。任何提示?
非常感谢,
答案 0 :(得分:1)
我在代码中注意到的一个奇怪的事情是你在循环中使用GetRows函数。
GetRows
将记录集加载到数组中
您可以遍历GetRows
返回的数组,也可以遍历记录集。你没有理由同时做这两件事。
如果你遍历记录集,你会有类似的东西:
x = 6 'As you prefer
rs.MoveFirst
Do Until rs.EOF
Sheet1.Range("A" & x).Value = rs![field_name_1]
Sheet1.Range("B" & x).Value = rs![field_name_2]
Sheet1.Range("C" & x).Value = rs![field_name_3]
Sheet1.Range("D" & x).Value = rs![field_name_4]
Sheet1.Range("E" & x).Value = rs![field_name_5]
Sheet1.Range("F" & x).Value = rs![field_name_6]
Sheet1.Range("G" & x).Value = rs![field_name_7]
Sheet1.Range("H" & x).Value = rs![field_name_8]
rs.MoveNext
Loop
要检查记录集中有多少条记录,请使用:
rs.MoveLast
iRecordCount = rs.RecordCount