如何编写从SQL数据库返回值的Excel函数?

时间:2009-05-07 17:42:49

标签: sql excel odbc

我想编写以下应在Excel工作表中使用的函数:

=GetRecField("Foo Record Key", "FooField1")

...将通过ODBC内部连接到SQL数据库,在那里执行

SELECT FooField1 FROM MyTable WHERE KEY_FIELD='Foo Record Key';

并将返回结果值作为函数GetRecField的结果。上述SQL被授予仅返回一条记录(IOW KEY_FIELD具有唯一约束)。

当然,上述功能可以在工作表中多次调用,所以请尽量避免盲目QueryTables.Add

TIA。

3 个答案:

答案 0 :(得分:6)

您可以编写自定义函数来执行此操作

  1. 打开VBA编辑器(ALT-F11)
  2. 打开工具 - >参考,并确保选择“Microsoft ActiveX数据对象2.8库”和“Microsoft ActiveX数据对象记录集2.8库”
  3. 右键单击VBAProject,然后选择Insert - >模块
  4. 打开模块。现在您可以创建自定义函数,例如:
  5.     Public Function GetItem(field As String, id As Integer) As String
            Set oConnection = New ADODB.Connection
            Dim oRecordset As ADOR.Recordset
            oConnection.Open "provider=sqloledb;data source=yourserver;" & _
                "Trusted_Connection=yes;initial catalog=yourdatabase;"
            Set oRecordset = oConnection.Execute( & _
                "select " & field & " from table where id = " & id)
            If oRecordset.EOF Then
                GetItem = "n/a"
            Else
                GetItem = oRecordset(field)
            End If
        End Function
    
    1. 您现在可以从单元格中调用该函数:

      =的GetItem( “字段名”; 2)

    2. 该模块是必需的,因为无法从spreadhseet内部调用非模块函数。

答案 1 :(得分:1)

为什么不在单独的工作表(数据菜单,导入外部数据,新数据库查询)上使用Excel的内置数据库查询功能,然后使用VLOOKUP从该工作表中提取值?

答案 2 :(得分:0)

我通过在一张工作表中保存数据库连接并在另一张工作表中使用对所需单元格的引用来解决了Excel版本1808(?)中的类似问题。

  1. 数据>获取数据>从数据库>从SQL Server数据库
  2. 输入服务器和数据库名称。
  3. 打开“高级”选项并逐字输入查询,然后将其命名为“ connection_name”。
  4. 现在查询可用,打开“数据”>“查询和连接”。
  5. 右键单击连接,然后单击“加载到...”。
  6. 在未使用的工作表上选择一个未使用的位置并将其放在那里。
  7. 在文件其他位置的目标单元格中​​,输入=connection_name[[#All,][Column1]]

这显然是间接的,因为如果没有将它显示在某处的工作表中,我将找不到引用该连接的方法。但这对我有用,而且我在其他地方找不到类似的说明,因此我认为它可以提供很多信息。