如何知道我的记录集是否已满?如何提取它并将其放在Excel表格上?



我有一个关于宏的问题,我正在为一个项目写作,在那里我应该能够将请求转换为sql查询,执行它并在新的Excel工作表上返回它。我有一个问题,我称之为"Result"对象,它应该执行查询,基本上其余的代码应该允许我提取数据,并把它放在一个Excel工作表。

我有几个问题。首先,在对这个主题研究了很长时间之后,我得到了下面的代码,它产生了错误3021:'No Current Record'。

对于上下文,Result是一个对象,connection也是一个对象(对于连接),request是一个字符串,这是应该执行的SQL查询。输出是一个变体(如果我诚实的话,我真的不明白这个输出是用来做什么的)我在"Debug行得到错误。打印结果(张)">

Set Result = connection.Execute(requete)
Do
For i = 1 To Result.Fields.Count
Debug.Print Result(i - 1)
Output = Output & Result(i - 1) & ";"
Ws_res.Cells(1, 1).CopyFromRecordset Result
Next i
Output = Output & vbNewLine
Result.MoveNext

Loop Until Result.EOF

所以我又研究了一下,这让我做了一个"测试"。首先使用.EOF,然后编写其余的代码,尝试使用GetRows()

获取我的查询
If not Result.EOF Then 
Output = Result.GetRows()
nbcol = UBound(Output, 1) + 1
For i = 1 To Result.Fields.Count
For j = 1 To nbcol
Debug.Print Output(i, j)
Next j
Next i
Ws_res.Cells(1, 1) = Output
Else
MsgBox ("No Data found")
End If

这段代码运行得很好,但它总是给我"没有数据发现"。所以我有点困在这里了——因为我不知道第一个位是否有效。

所以现在我有点迷路了,因为我不知道问题来自哪里,如果它来自代码,记录集或查询本身?

这是整个函数(我已经更新了导致我与建议的问题的位,但我再次出现3021错误):

Function fct_resultat(fichier_type As Integer, Sql As String, rgD As Range) As Variant

Dim connection As Object
Dim Result As Object
Dim SaveName As Variant
Dim Wb_Res As Workbook
Dim Ws_res As Worksheet
Dim i As Integer, j As Integer
Dim nbcol As Integer, nbrow As Integer
Dim requete As String
Set Wb_Res = Workbooks.Add
Set Ws_res = Wb_Res.Worksheets(1)

Set connection = CreateObject("ADODB.Connection")
With connection
.Provider = "Microsoft.ACE.OLEDB.12.0"
.connectionstring = "Data Source=" & ThisWorkbook.Path & "" & ThisWorkbook.Name & ";" & "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
.Open
End With
requete = Sql
Set Result = connection.Execute(requete)
Do
Ws_res.Range("A1").CopyFromRecordset Result
Result.MoveNext
Loop Until Result.EOF

另外,关于查询本身(requete),它是一个通过各种函数构建的字符串(目标是从用户的输入创建查询)。因此,它是一个变量字符串,在前面的代码中定义(我有一个sql_string函数和一个执行查询的函数)。

下面是一个sql查询字符串的例子(我是法国人,它用法语解释了所有细节):

SELECT bps_codeFonds, Portefeuille, bps_libellePaysEmetteur,
bps_libTypeInstr, bps_libSousTypeInstr, id_inventaire,
bps_pruDevCot
FROM [Donnees$] 
WHERE bps_deviseCotation="DKK"  AND 
bps_quantite<10000 
ORDER BY AuM ASC;

对于更多的上下文,我非常熟悉vba和sql,但这是我第一次处理应该连接这两种语言的对象,所以希望我没有太混乱。

这段代码适合我:

Sub Tester()
fct_resultat "select * from [Donnees$] where false"
End Sub
'Your Function returns no result, so make it a Sub...
Sub fct_resultat(Sql As String)
Dim connection As Object, Result As Object, SaveName As Variant
Dim Wb_Res As Workbook, Ws_res As Worksheet

Set Wb_Res = Workbooks.Add
Set Ws_res = Wb_Res.Worksheets(1)

Set connection = CreateObject("ADODB.Connection")
With connection
.Provider = "Microsoft.ACE.OLEDB.12.0"
.connectionstring = "Data Source=" & ThisWorkbook.FullName & ";" & _
"Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
.Open
Set Result = .Execute(Sql)
End With

If Not Result.EOF Then
'This copies the content of the entire recordset,
' so there's no need to use it in a loop 
Ws_res.Range("A1").CopyFromRecordset Result
Else
Ws_res.Range("A1").Value = "No results"
End If

End Sub

如果你的SQL没有返回任何结果,你需要检查你的数据,以确保它实际上有匹配的记录。

最新更新