【发布时间】:2020-02-19 18:46:00
【问题描述】:
我在 Excel 函数下方创建了该函数,该函数使用 ADODB 连接到访问数据库(大约 10k 行)。 它通常有效,但有两个主要问题:
- 不可靠:经常返回 0 而结果应该不同
- 肯定很慢
有什么改进的建议吗?
Public Function TotaleSQL(Cat As String, SubCat As String, Anno As Integer) As Long
On Error Resume Next
Dim cn As Object, rs As Object, output As String, sql As String
Dim src As String
Dim Total As Long
Dim CatLong As String
src = "Z:\Report.accdb"
'---Connecting to the Data Source---
Set cn = CreateObject("ADODB.Connection")
With cn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.connectionstring = "Data Source=" & src & ";Persist Security Info=False"
.Open
End With
'---Run the SQL SELECT Query---
CatLong = "'" & Cat & ":" & SubCat & "'"
sql = "SELECT Report.Withdrawal, Report.Deposit, Report.Category, Report.Date FROM Report WHERE (((Report.Category)=" & CatLong & ") AND ((Year([date]))=" & Anno & "));"
'sql = "SELECT * FROM [Sheet1$]"
Set rs = cn.Execute(sql)
Total = 0
Do
Total = Total + Val(rs(1) & "") - Val(rs(0) & "")
rs.Movenext
Loop Until rs.EOF
'---Clean up---
rs.Close
cn.Close
Set cn = Nothing
Set rs = Nothing
TotaleSQL = Total
End Function
【问题讨论】:
-
很可能不可靠,因为有错误。请注意,您必须删除
On Error Resume Next,因为该行隐藏了 所有 错误消息,但错误仍然存在,您只是看不到它们的消息。因此,如果您没有看到错误,则无法修复它们,并且如果您不修复它们,则代码将无法按预期工作。删除该行并改正您的错误。 • 您可能会从VBA Error Handling – A Complete Guide 中受益。 -
这可能很慢,因为您的
Do循环遍历所有记录(如果有很多记录,它会大大减慢该过程)。显然,您只需减去两个值并将它们相加即可。尝试弄清楚如何在 SQL 中执行此操作,这样您就不需要循环了。应该可以使用一条 SQL 语句来获得该总数,而无需循环。
标签: excel vba ms-access connection-string adodb