繁体   English   中英

Excel VBA中使用函数参数作为源的Sumproduct

[英]Sumproduct in Excel VBA using function arguments as source

我正在尝试编写一个VBA函数,该函数将函数参数作为源,然后在其上运行SQL命令。 我目前正在第一步中执行的SQL命令等效于Excel的sumproduct()函数,在SQL中,该函数类似于“ SELECT SUM(A * B)”。

我修改了另一个站点的一些代码,这些站点使用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识别为源,因此最终出现错误。

谁能给我一些有关如何修改“数据源”参数以识别函数自变量的指导?

oneSQL = "SELECT sum(A * B)"的SQL语句正在寻找名为“ A”和“ B”的字段(无论在参数A和B中传递给函数的内容如何)。 这是因为A和B用双引号引起来。

要将参数合并到SQL语句中,应改为编写以下代码:

oneSQL = "SELECT sum(" & A & " * " & "B)"

将A和B放在双引号之外会使它们替换为它们的值。 &是将所有片段连接在一起的字符串串联运算符。

注意:从任何类型的外部输入动态构造SQL语句时,请考虑SQL注入的可能性-请参见此处此处

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM