我想写一个VBA函数,它将函数参数作为源,然后在其上运行SQL命令。我目前试图作为第一步实现的SQL命令相当于Excel的sumproduct()函数,它在SQL中是沿着“SELECT SUM(A * B)”行的东西。在Excel VBA中使用函数参数作为源Sumproduct
我修改了另一个网站的一些代码,它使用SQL将Excel表转换为单个列,并对其进行了修改以计算一个sumproduct,但我在将子例程转换为函数时遇到问题。
当前工作的代码:
Sub doSQL()
Dim strCon As String
Dim oneSQL As String
' refer to 'microsoft activex data objects library'
Dim cn As Object
Dim rs As Object
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source='" & ThisWorkbook.FullName & "';" & _
"Extended Properties='Excel 12.0;HDR=No;IMEX=1';" ' HDR=No means no headers (field names)
cn.Open strCon ' open connection
'-------------------------------------------------------------------------------
' F1, F2, F3 are the default fieldnames when no headers are included with data
oneSQL = "SELECT sum(F1 * F2) FROM [Sheet1$B:D] where F1 not like '' AND F2 not like ''"
rs.Open oneSQL, cn ' get recordset
Sheets("Sheet1").Range("A:A").ClearContents
Sheets("Sheet1").Range("A1").CopyFromRecordset rs ' copy recordset to worksheet
'-------------------------------------------------------------------------------
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
End Sub
最终的结果是,单元格A1返回SUMPRODUCT的当量(B3:B5,C3:C5)。
我试图把它转换成一个功能:
Function SQL_sumproduct(A As Variant, B As Variant) As Double
Dim strCon As String
Dim oneSQL As String
' refer to 'microsoft activex data objects library'
Dim cn As Object
Dim rs As Object
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source='" & ThisWorkbook.FullName & "';" & _
"Extended Properties='Excel 12.0;HDR=No;IMEX=1';" ' HDR=No means no headers (field names)
cn.Open strCon ' open connection
oneSQL = "SELECT sum(A * B)"
rs.Open oneSQL, cn ' get recordset
'-------------------------------------------------------------------------------
' Sheets("Sheet1").Range("A:A").ClearContents
' Sheets("Sheet1").Range("A3").CopyFromRecordset rs ' copy recordset to worksheet
'-------------------------------------------------------------------------------
SQL_sumproduct = rs
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
End Function
我最终得到一个错误,因为代码不能识别函数参数A和B作为源。
任何人都可以给我一些关于如何修改“数据源”参数来识别函数参数的指导吗?