求助,EXCEL通过VBA操作SQL数据库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求助,EXCEL通过VBA操作SQL数据库相关的知识,希望对你有一定的参考价值。

参考技术A Sub 按钮1_Click()
Dim i As Integer, j As Integer, sht As Worksheet 'i,j为整数变量;sht 为excel工作表对象变量,指向某一工作表
'Dim cn As New ADODB.Connection '定义数据链接对象 ,保存连接数据库信息;请先添加ADO引用
'Dim rs As New ADODB.Recordset '定义记录集对象,保存数据表
‘工具 ---〉引用 ---〉Microsoft ActiveX data objects ....
'下面两句就不需要增加引用ADO
Set cn = CreateObject("Adodb.Connection")
Set rs = CreateObject("Adodb.Recordset")
Dim strCn As String, strSQL As String '字符串变量
Dim strCond As String
strCn = "Provider=sqloledb;Server=R9HDET7;Database=dbname;Uid=username;Pwd=password" '定义数据库链接字符串

'下面的语句将读取数据表数据,并将它保存到excel工作表中:工作表为一张两维表,记录集也是一张两维表

strSQL = "select CUSTOMER_NAME from VSC_BI_CUSTOMER " '定义SQL查询命令字符串

cn.Open strCn '与数据库建立连接,如果成功,返回连接对象cn
rs.Open strSQL, cn '执行strSQL所含的SQL命令,结果保存在rs记录集对象中
i = 2

Set sht = ThisWorkbook.Worksheets("Test") '把sht指向当前工作簿的Test工作表
Do While Not rs.EOF '当数据指针未移到记录集末尾时,循环下列操作
sht.Cells(i, 1) = rs("CUSTOMER_NAME") '把当前记录的字段1的值保存到sheet1工作表的第i行第1列
rs.MoveNext '把指针移向下一条记录
i = i + 1 'i加1,准备把下一记录相关字段的值保存到工作表的下一行
Loop '循环
rs.Close '关闭记录集,至此,程序将把某数据表的字段1保存在excel工作表sheet1的第1列,行数等于数据表的记录数

cn.Close '关闭数据库链接,释放资源
End Sub

如何使用 SQL 查询来操作 Excel 数据?

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

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

最终结果如下所示,

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

示例 02 -

我在下面找到了简单的例子, https://***.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 我尝试通过这个简单的示例来查看它是否有效***.com/a/45720915/5002322 在这里我创建了一个名为“Book11.xlsx”的新 Excel 文件并保存了它。我在“Sheet2”中添加了 A1 = 1、A2 = 2 和 A3 = 3 的值。创建了一个 excel 宏并将其中的代码复制过去。当我运行宏时,我收到一条错误消息“没有为一个或多个必需参数提供值” 请相应地编辑您的帖子 【参考方案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 我懒得写完整的列名 ;-)

以上是关于求助,EXCEL通过VBA操作SQL数据库的主要内容,如果未能解决你的问题,请参考以下文章

无法通过Excel VBA连接到SQL数据库。

通过 excel VBA 加入 SQL 表时出错

在excel中用vba实现与sql数据库的数据比较

从 Excel VBA 运行工作参数化 Access SQL 查询 (INSERT INTO) 时出现“需要对象”错误

为啥sql数据库的表用VBA导到EXCEL中的速度比EXCEL的数据导入功能慢

使用 VBA 将 Excel 表连接到 SQL Server