excel vba sql 占用内存,因为如下查询的sql语句较多,每次运行完都要耗用很多内存,求高手指点。谢
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了excel vba sql 占用内存,因为如下查询的sql语句较多,每次运行完都要耗用很多内存,求高手指点。谢相关的知识,希望对你有一定的参考价值。
Sub 自定义明细()
Dim sht As Worksheet
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim Sql$, E$, F$
Dim strcn As String
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
'总收入
strcn = "provider=microsoft.jet.oledb.4.0;extended properties='excel 4.0;hdr=yes';" _
& "data source=" & ThisWorkbook.Path & "\效益分析 基础数据.xlsm"
cn.Open strcn
Sql = "SELECT sum(结帐金额) FROM [辅检收入$] "
Sql = Sql + " where 年份='2012年'"
Sql = Sql + " and 核算科室名称='妇产科'"
Sql = Sql + " group by 月份"
Sql = Sql + " order by 月份"
rs.Open Sql, cn
Set sht = ActiveWorkbook.Worksheets("妇产科1")
ActiveWorkbook.Worksheets("妇产科1").[B3:B14].ClearContents
Sheets("妇产科1").[B3].CopyFromRecordset rs
rs.Close
cn.Close
Set cn = Nothing
Set rs = Nothing
MsgBox "查询完毕"
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 占用内存,因为如下查询的sql语句较多,每次运行完都要耗用很多内存,求高手指点。谢的主要内容,如果未能解决你的问题,请参考以下文章
从 Excel VBA 运行嵌套的 Access SQL 查询
excel 2010 vba。 sql查询列'like' vlookup
使用 VBA 在 Excel 中的 SQL 表上使用参数化查询