如何知道我的记录是否已满并将其提取到Excel工作表?

5lhxktic  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(113)

我正在编写一个宏来将请求转换为SQL查询,执行它并在新的Excel表上返回它。
我称之为“Result”的对象应该执行查询,基本上剩下的代码应该允许我提取数据并将其放在Excel工作表上。
在研究了这个主题之后,我得到了以下代码,
错误3021:'无当前记录'。
结果是一个对象,连接是一个对象(对于连接),请求是一个字符串,这是应该执行的SQL查询。
输出是一个变量。(我不知道这是用来做什么的)。
我在Debug.Print Result(i-1)行上得到错误。

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

我做了更多的研究,首先使用. xml进行“测试”,然后编写其余的代码,使用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;

我非常熟悉SQL和SQL,但这是我第一次处理连接这两种语言的对象。

qgelzfjb

qgelzfjb1#

这段代码对我很有效:

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没有返回任何结果,则需要检查数据以确保它实际上具有匹配的记录。

相关问题