2015-11-24 56 views
0

我想写一个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作为源。

任何人都可以给我一些关于如何修改“数据源”参数来识别函数参数的指导吗?

回答

0

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

要合并参数到SQL语句,你反而会这样写:

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

具有A和B双引号外面使他们与他们的价值观来代替。 &是连接所有块的字符串连接运算符。

注:当从任何一种外部输入的动态构造SQL语句,考虑SQL注入的可能性 - 看herehere