【问题标题】:How to use SQL query to manipulate Excel data?如何使用 SQL 查询来操作 Excel 数据?
【发布时间】:2021-08-08 08:15:17
【问题描述】:

我正在尝试在 Excel 文件中按 SQL 语句执行分组。下面是excel表格。如何通过 VBA 通过 SQL 语句执行简单的分组以获取结果。

最终结果如下所示,

PS - 我不想使用 Pivot、Power 查询等方法。我需要在 excel 文件中使用 VBA 和 SQL。

示例 02 -

我在下面找到了简单的例子, https://stackoverflow.com/a/45720915/5002322

我尝试复制这个,以便我可以使用相同的方法解决我的问题并感受一下。

使用示例 02

在这里我创建了一个名为“Book11.xlsx”的新excel文件并保存。

我在“Sheet2”中添加了 A1 = 1、A2 = 2 和 A3 = 3 的值。

创建了一个excel宏并在下面的代码中使用。

Public Sub OverkillSum()

    Dim connection As Object
    Set connection = CreateObject("ADODB.Connection")
    connection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                    "Data Source=" & ThisWorkbook.FullName & ";" & _
                    "Extended Properties=""Excel 8.0;HDR=Yes;"";"

    Dim recordset As Object
    Set recordset = connection.Execute("SELECT SUM(Values) As Total FROM [Sheet2$]")

    Sheet1.Range("A4").Value = recordset.Fields("Total").Value
    recordset.Close
    connection.Close

End Sub

当我运行宏时,我收到一条错误消息 “没有为一个或多个必需参数指定值”

我的excel文件表

【问题讨论】:

  • 您不能使用 SQL 从 Excel 中查询 Excel 电子表格。请改用 PowerQuery。可以说,PowerQuery 比 SQL 更好,只是需要一些时间来适应。它也是第一个用于构建实际上并不可怕的查询的 GUI 编辑器(还有其他人记得 MSQUERY 吗?)
  • 谢谢。我在读到我们可以使用 ADODB.Connection 来做到这一点,但我不明白。我想按功能自动化分组。我试图记录宏以使用电源查询,但似乎它没有以这种方式集成。我们可以使用 Power Query 将其自动化吗?
  • 是的,可以通过ADODB 进行。你尝试了什么,你在哪里卡住了?
  • @Storax 我尝试通过这个简单的示例来查看它是否有效stackoverflow.com/a/45720915/5002322 在这里我创建了一个名为“Book11.xlsx”的新 Excel 文件并保存了它。我在“Sheet2”中添加了 A1 = 1、A2 = 2 和 A3 = 3 的值。创建了一个 excel 宏并将其中的代码复制过去。当我运行宏时,我收到一条错误消息“没有为一个或多个必需参数提供值”
  • 请相应地编辑您的帖子

标签: sql excel vba


【解决方案1】:

为了让代码运行,您必须在 A 列中添加一个标题,即您的工作表应该是这样的

这在连接信息中用HDR=Yes声明,列的名称Values在SQL语句中使用SELECT SUM(Values) As Total FROM [Sheet2$]

更新代码以在编写结果时使用sheetname 而不是代号

Public Sub OverkillSum()

    Dim connection As Object
    Set connection = CreateObject("ADODB.Connection")
    connection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                    "Data Source=" & ThisWorkbook.FullName & ";" & _
                    "Extended Properties=""Excel 8.0;HDR=Yes;"";"

    Dim recordset As Object
    Set recordset = connection.Execute("SELECT SUM(Values) As Total FROM [Sheet2$]")

    Worksheets("Sheet1").Range("A4").Value = recordset.Fields("Total").Value
    recordset.Close
    connection.Close

End Sub

【讨论】:

  • 谢谢。我已经完成了建议的更改。我现在可以运行它而不会出现任何错误。但是,我没有看到单元格 Sheet1!A4 中的输出。请您也可以在这里帮助我。
  • 嗯,对我来说,代码按预期工作。输出在单元格 A4 的 Sheet1 上,不在 Sheet2 上!
  • 我关闭了所有打开的工作表并再次尝试。我在 Sheet1.Range("A4").Value =recordset.Fields("Total").Value 处收到错误提示 - 运行时错误“424”需要对象
  • 是的,您必须拥有代号为 Sheet1 的工作表。
  • 第一个示例的 SQL 语句是 "SELECT Col1,Col2,Col3,Col4, Sum(Qty) as SumQty FROM [Sheet3$] GROUP BY Col1, Col2, Col3, Col4" PS 我懒得写完整的列名 ;-)
猜你喜欢
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 2011-02-10
  • 1970-01-01
  • 2017-06-11
相关资源
最近更新 更多