Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Word到Excel的VBA SQL连接不返回任何记录_Excel_Vba_Ms Word_Ado_Recordset - Fatal编程技术网

从Word到Excel的VBA SQL连接不返回任何记录

从Word到Excel的VBA SQL连接不返回任何记录,excel,vba,ms-word,ado,recordset,Excel,Vba,Ms Word,Ado,Recordset,我一直想弄清楚如何将Excel电子表格中的记录读取到Word文档中。我用的是Office 365。我发现一些文章已经连接到工作簿和工作表,但没有返回任何记录。 我引用了ActiveX数据对象2.8库 当代码到达消息框时,返回-1 帮忙?我错过了什么 这里是我在这一点上的代码 Sub CreateLetter() Dim rs As ADODB.Recordset, rsCount As ADODB.Recordset Dim cn As ADODB.Connection Dim sqlGetT

我一直想弄清楚如何将Excel电子表格中的记录读取到Word文档中。我用的是Office 365。我发现一些文章已经连接到工作簿和工作表,但没有返回任何记录。 我引用了ActiveX数据对象2.8库 当代码到达消息框时,返回-1

帮忙?我错过了什么

这里是我在这一点上的代码

Sub CreateLetter()

Dim rs As ADODB.Recordset, rsCount As ADODB.Recordset
Dim cn As ADODB.Connection
Dim sqlGetTbl As String
Dim sDataSource As String, sDataTable As String
Dim sProvider As String

Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
sDataSource = "D:\spreadsheetname.xlsx"
sDataTable = "[Donor Contact List$]"

sProvider = "Microsoft.ACE.OLEDB.16.0;"
sDataSource = sDataSource & ";Extended Properties = 'Excel 12.0 Xml;HDR=Yes';"

With cn
    .Provider = sProvider
    .ConnectionString = "Data Source=" & sDataSource
    .Open
End  With

sqlGetTbl = "SELECT * FROM " & sDataTable
Set rs = cn.Execute(sqlGetTbl)
MsgBox rs.RecordCount

Do
    With Selection
        .TypeText FullName & Chr(11) & Street & Chr(11) & City & ", " & St & "  " & Zip
        .TypeParagraph
    End With
Loop Until rs.EOF

rs.Close
cn.Close
Set cn = Nothing
Set rs = Nothing

End Sub

以下内容适合我。在我使用的测试数据源中获取记录集信息的关键是在连接字符串中包含
IMEX=1
,以指定数据源具有头

问题中的代码还有其他问题:

  • 有必要使用
    rs.MoveFirst
    来“初始化”记录集(将其放入第一条记录)
  • 在循环的每次迭代中都必须使用
    rs.MoveNext
    ,否则代码将“卡在”第一条记录上并进入无限循环
  • 如果记录集中确实没有记录,则使用
    Do而不是rs.EOF
    进行退出循环的测试更安全
  • 必须指定记录集中的字段。全名、城市、街道等都没有意义,至少在问题代码中是这样
  • 始终按创建对象的相反顺序释放对象(设置为
    Nothing
    )。在释放记录集之前不可能释放连接-活动记录集将保持连接“活动”
  • 我的示例代码:

    Sub CreateLetter()
    
        Dim rs As ADODB.Recordset, rsCount As ADODB.Recordset
        Dim cn As ADODB.Connection
        Dim sqlGetTbl As String
        Dim sDataSource As String, sDataTable As String
        Dim sProvider As String
    
        Set cn = New ADODB.Connection
        Set rs = New ADODB.Recordset
        sDataSource = "D:\spreadsheetname.xlsx"
        sDataTable = "[Donor Contact List$]"
    
        sProvider = "Microsoft.ACE.OLEDB.16.0;"
        sDataSource = sDataSource & ";Extended Properties = 'Excel 12.0 Xml;HDR=Yes;IMEX=1';"
    
        With cn
            .Provider = sProvider
            .ConnectionString = "Data Source=" & sDataSource
            .Open
        End With
    
        sqlGetTbl = "SELECT * FROM " & sDataTable
        cn.CursorLocation = adUseClient
        Set rs = cn.Execute(sqlGetTbl)
        MsgBox rs.RecordCount
        rs.MoveFirst
    
        Do While Not rs.EOF
            With Selection
                .TypeText rs.Fields("Fullname").value & Chr(11) & rs.Fields("street").value & Chr(11) & rs.Fields("city").value & ", " & st & "  " & rs.Fields("Zip").Value
                .TypeParagraph
            End With
            rs.MoveNext
        Loop
    
        rs.Close
        cn.Close
        Set rs = Nothing
        Set cn = Nothing
    End Sub
    

    请尝试使用
    cn.CursorLocation=adUseClient
    。如果这不起作用,请使用
    Recordset
    (再次使用
    CursorLocation=adUseClient
    )而不是
    Connection
    。澄清一下-Excel等电子表格有单元格和行(而不是记录)。数据库表(如Access)有记录。不管怎样,有更简单的方法将数据导入Word,除非你有理由这样做。我建议从搜索Google开始“将Excel中的数据导入Word”根据最终目标的不同,有几种方法可以做到这一点。@ashleedawg使用ADO、DAO或ODBC作为数据源连接到Excel是很有可能的。在这种情况下,可以使用数据源术语、记录和字段。使用数据连接通常开销较小,比“自动化”更快由于文件可以直接访问,无需将其加载到Excel应用程序中;事实上,即使计算机上未安装Excel,也可以使用该文件。OP建议的方法非常有效,甚至值得推荐…@WinginSue是否有任何理由不使用mailmerge?无需代码。IMEX=True您可能是指
     HDR=Yes
    ?@JohnyL No,我是说IMEX-原始代码已经包含了
    HDR
    。但是,时间太晚了,我最后输入的是“True”而不是“1”。感谢您指出这一点!