【问题标题】:SQL Functionality in Excel VBAExcel VBA 中的 SQL 功能
【发布时间】:2018-05-15 16:25:16
【问题描述】:

对于那些不知道的人来说,将 SQL 功能添加到 VBA 宏是相当容易的。以下文章提供代码:http://analystcave.com/excel-using-sql-in-vba-on-excel-data/

我对此进行了一些修改(很高兴提供代码),以便它可以很好地输出并将其放入我可以调用的 Sub 中。这使我不必执行多种排序、复制粘贴等操作来从大型工作表中查找特定数据。

但是,当使用来自在线资源的工作簿时,请注意一个问题,例如邮箱:

.ConnectionString = "Data Source=" & ThisWorkbook.Path & "\" & ThisWorkbook.Name & ";"

当文件保存到驱动器时​​,这可以正常工作,但从在线站点,Excel 无法连接。当文件未保存在任何地方时,有关修改连接字符串的任何建议?

【问题讨论】:

  • 在这种情况下您能提供一个示例 ConnectionString 吗?您可能需要对其进行操作才能使其正常工作。
  • 如果工作簿未保存到磁盘,则不能使用此方法。最好的办法是将临时副本保存到磁盘并进行查询。
  • @wdosanjos 当前连接字符串使用 ThisWorkbook.Path 和 .Name,但是如果文件没有保存因此没有路径怎么办?
  • Microsoft.ACE.OLEDB.12.0 需要一个文件,因此在您保存文件之前它不会工作。
  • @wdosanjos 好的,所以没有办法指向内存中的文件或类似的东西?

标签: sql-server vba excel


【解决方案1】:

对于任何感兴趣的人,这段代码(基于来自 Analyst Cave 的代码)非常适合在 VBA 中使用 SQL。将以下内容另存为 Sub:

Option Explicit

Sub QuerySQL(result_location As Range, query As String)

    Dim ResultWS As Worksheet
    Set ResultWS = ThisWorkbook.Sheets("Query Results")
    ResultWS.Cells.ClearContents

    If query = "" Then Exit Sub

    Dim cn As Object, rs As Object
    'Add to the workbook a database connection with itself
    'Note other ConnectionString could be used to access a variety of media
    Set cn = CreateObject("ADODB.Connection")
    With cn
        .Provider = "Microsoft.ACE.OLEDB.12.0"
        .ConnectionString = "Data Source=" & ThisWorkbook.Path & "\" & ThisWorkbook.Name & ";" & _
        "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
        .Open
    End With

    'Build and execute the SQL query
    Set rs = cn.Execute(query)
    If rs.EOF = True Then Exit Sub

    'Print column labels
    Dim i As Long, j As Long
    For i = 0 To rs.Fields.Count - 1
        result_location.Offset(0, i).Value = rs.Fields(i).Name
    Next i

    'Print column contents
    i = 0
    Do
        For j = 0 To rs.Fields.Count - 1
            result_location.Offset(i + 1, j).Value = rs.Fields(j).Value
        Next j

        rs.MoveNext
        i = i + 1
    Loop Until rs.EOF

    'Close the connections
    rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing

End Sub

要使用它,只需执行以下操作:

Dim myQuery As String
myQuery = "SELECT * FROM [Sheet2$]"
Call QuerySQL(ThisWorkbook.Sheets("Sheet1").Range("A1"), myQuery)

它使用 MS Access 风格的 SQL。以上将以 Sheet2 为表格,并在 Sheet1 上从 A1 开始打印结果。

【讨论】:

  • 这似乎无法解决问题中提出的问题。 (如果你使用result_location.Offset(1, 0).CopyFromRecordset rs 来存储数据,你会大大提高速度。)
  • 只是想我会添加它,因为还有其他人询问如何将 SQL 添加到 Excel,它对我来说非常有效。
  • 如果它没有回答问题,则不应将其添加为答案 - 应将其添加为问题的一部分,但在这种情况下,它并不需要像您一样已经有一个很好的 MCVE。
猜你喜欢
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 2019-03-21
  • 1970-01-01
相关资源
最近更新 更多