【发布时间】:2014-10-03 07:10:46
【问题描述】:
我在 Excel 2007 中打开 ADODB 连接以查询当前工作簿的工作表之一。尝试添加自定义 VBA 函数时,会引发错误“未定义的函数名称”。连接:
Dim connection As String
Dim records As ADODB.Recordset
Dim query As String
Dim fileName As String
fileName = ThisWorkbook.FullName
connection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & fileName & ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";"
query = "select t.[Col1] from [Sheet1$] As t"
Set records = New ADODB.Recordset
records.Open query, connection
Sheets(2).Range("A1").CopyFromRecordset records
我想要实现的是在选择中有另一列,比如
query = "select t.[Col1], myFunc() from [Sheet1$] As t"
其中 myFunc 是工作簿中定义的函数。
我知道在 Access 中可以进行类似的操作(在查询中使用自定义 VBA 函数)。这在 Excel 中也可以吗?
此方案的最佳做法或解决方法是什么?
【问题讨论】:
-
要弄清楚问题是什么:您说“在 Excel 2007 中打开 ADODB 连接以查询当前工作簿的工作表之一”。你为什么这样做?如果您在 Excel 中,为什么不直接访问工作表?但是:您的“查询”是一个字符串。因此,您可以根据需要通过连接来构建此字符串。如果函数 myFunc() 返回一个字符串,那么可能是:query = "select t.[Col1], " & myFunc() & " from [Sheet1$] As t" 是你想要的吗?如果不是,生成的查询字符串应该是什么样子?
-
阿克塞尔,感谢您的提问! 1.) 当使用查询处理大量数据时,操作和维护比单独访问单元格更清洁、更高效和更快。尤其是在连接多个工作表(或表格)、按多个字段进行分组和排序时。 2.) 连接查询字符串不是一个选项,因为连接在传递给连接对象之前只对函数进行一次评估。我想要实现的是在每次运行时评估函数,就像它在任何数据库引擎中一样。
-
如果您在 Access 中编写查询,则可以使用自定义 VBA 函数。查询字符串如下所示:“select field1, myFunc(field2) from table1”并且 myFunc 将在每一轮中使用实际的 field2 值进行评估。
-
啊,我明白了。您尝试像存储过程一样调用 Excel VBA 函数。这是不可能的,我想。但也许其他人知道方法。
-
没错。在Access中是可能的,这就是我问这个问题的原因。但如果在 Excel 中无法实现,是否有解决方法。