根据测试,用 Command 命令创建参数并调用存储过程的结果不正确,所以直接用 Recordset Open 方法能返回正确的结果。
Option Explicit
Public Sub GetStockBalance()
Dim conn As New ADODB.Connection
Dim connStr As String
connStr = "DRIVER={MySQL ODBC 8.0 Unicode Driver}; " & _
"SERVER=localhost; PORT=3306; DATABASE=stonetest; USER=root; PASSWORD=pwd;OPTIONS=3"
conn.ConnectionString = connStr
conn.Open
Dim rs As New ADODB.Recordset
rs.Open "call spStockBalances(2008,4)", conn, adOpenStatic, adLockReadOnly
Dim col As Integer
Dim startCell As Range
col = 0
Set startCell = Sheet1.Range("A1")
For col = 0 To rs.Fields.Count - 1
startCell.Offset(0, col).Value = rs.Fields(col).Name
startCell.Offset(1, 0).CopyFromRecordset rs
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
End Sub
最近对 pandas, Power Query 和 SQL 的数据处理和加工进行了一些类似的处理,希望通过比较看到各种处理方式的优点。之前笔者用的比较多的是 VBA + ADO,VBA + ADO 的方式其实离不开 Sql 语句,这种方式也有非常方便:前台有 Excel,后台有数据库就能实现...
首先,必须严肃脸说明的是,对于普通 Excel 使用者而言,VBA、SQL 以及以
后提及的 ADO 并不是非学不可的,非学不可的是基础操作、函数、透视表、图表……
然而大数据时代,对于另外相当一部分表族而言,Excel 用久了,慢慢的,会意
识到一个大问题;曾经在你心中无比强大的 Excel 函数,原来只适合小数据的腾挪
躲闪;当数据量稍大后,函数这货就像未嗑士力架的姚明——不来劲的很哩。
SQL In Excel 则可以解决函数处理大数据效率低下的问题,嗯~使用 SQL 语言,
你甚至可以将 Excel 作为前台数据看板,数据库(例如 ACCESS)作为后台数据储
存仓库,进而储存、分析远超 Excel 体积的数据量,本书描述了ADO和VBA喝SQL in Excel平台的运用
以下是一个VBA查询总账发生额及余额表的例子,掌握了它,我们就可以在EXCEL上直接得到各账套的发生额及余额表了,但是我对它并不太满意,我想要的效果是直接得到全年各月余额(损益类的为发生额)的表,这样我做集团合并报表时会方便很多,正在研究中,若能成功再发布上来:
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
"建立公用的数据源...
ADO是什么
首先,我们要介绍下ADO。
ADO (ActiveX Data Objects,ActiveX数据对象)是微软提出的应用程序接口,用以实现访问关系或非关系数据库中的数据……更多概念信息可以自行搜索。
之所以要学习ADO,一个原因是ADO自身的一些属性和方法对于数据处理是极其有益的;更重要的原因是,在EXCEL VBA中,一般只有通过ADO,才可以使用强大的SQL查询语言访问外部数据源,进而查、改、增、删相关数据源中的数据。
延伸在具体编程操作上,就形成了四步走发展战略:
VBA引用ADO类库
不过最主要的还是执行效率和SQL 代码封装。
特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库时(例如 PHP),要组织很多 SQL 语句。特别是业务逻辑复杂的时候,一大堆的 SQL 和条件夹杂在 PHP 代码中,让人不寒而栗。
strRegex = "\[(.*?)\]"
strRegex = Replace(strRegex, "[", "\[")
strRegex = Replace(strRegex, "]", "\]")
strRegex = Replace(strRegex, ".", "\.")
strRegex = Replace(strRegex, "(", "\(")
strRegex = Replace(strRegex, ")", "\)")
strRegex = Replace(strRegex, "*", "\*")
strRegex = Replace(strRegex, "+", "\+")
strRegex = Replace(strRegex, "?", "\?")
strRegex = Replace(strRegex, "^", "\^")
strRegex = Replace(strRegex, "$", "\$")
strRegex = Replace(strRegex, "{", "\{")
strRegex = Replace(strRegex, "}", "\}")
strRegex = Replace(strRegex, "|", "\|")
strRegex = Replace(strRegex, "/", "\/")
strRegex = Replace(strRegex, "\", "\\")
strRegex = Replace(strRegex, " ", "\s")
Dim regEx As New RegExp
regEx.Pattern = strRegex
regEx.Global = True
regEx.IgnoreCase = False
regEx.Multiline = TrueDim strInput As String
strInput = ActiveDocument.Range.Text
Dim strReplace As String
strReplace = ""Dim strOutput As String
strOutput = regEx.Replace(strInput, strReplace)ActiveDocument.Range.Text = strOutput
End Sub