如何编写一个从 ACCESS 数据库返回值的 Excel 函数?

Posted

技术标签:

【中文标题】如何编写一个从 ACCESS 数据库返回值的 Excel 函数?【英文标题】:How to write an Excel function which returns a value from an ACCESS database? 【发布时间】:2015-07-07 11:50:25 【问题描述】:

我在 access 2013 中有一个数据库

日期 |数据

2015 年 1 月 6 日 | 1

2015 年 2 月 6 日 | 2

我想编写一个从数据库返回值的函数。

=GETDATA("FORDATE")

这可能吗? 我已经尝试过了,但它不想工作

Public Function GetData(id As Date) As String

Set oConnection = New ADODB.Connection
Dim oRecordset As ADOR.Recordset

oConnection.Open "Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\user\Desktop\CAINV_DB.accdb;" & "Trusted_Connection=yes;"
Set oRecordset = oConnection.Execute("select " & RDATE & " from CB_EXCHANGE where RDATE = " & id)
If oRecordset.EOF Then
    GetData = "n/a"
Else
    GetData = oRecordset(1)
End If

End Function

【问题讨论】:

向我们展示您的尝试? 【参考方案1】:

所以你需要使用这段代码(插入你的数据库路径):

Public Function getData(whatDate As Date) As Variant

Dim DB As Database
Dim RS As Recordset

Set DB = DBEngine.OpenDatabase("C:\temp\Desktop\Test.mdb")
Set RS = DB.OpenRecordset("SELECT USD FROM CB_EXCHANGE WHERE RDate = #" & Format(whatDate, "m\/d\/yyyy") & "#", dbOpenDynaset) ' The date format must be like this

If RS.RecordCount > 0 Then
    RS.MoveFirst
    getData = RS!USD ' of course you must enter the correct column name
End If

End Function

【讨论】:

不需要转换数据库,我只是将引用“Microsoft DAO 3.6 Object Library”更改为“Microsoft Office 14.0 Access Database Engine Object Library”,效果很好。非常感谢多利安!!!!!!! 好的,但我有一个问题。列名可以是动态的吗?,我的意思是如果我在getData(whatDate As Date, ColName as variant) 中添加一个变量,这getData = RS!ColName 现在可以工作吗? 更好地使用ColName as String。您必须进行两项更改。使查询动态Set RS = DB.OpenRecordset("SELECT " & ColName & " FROM CB_EXCHANGE WHERE Date = #" & Format(Date, "m\/d\/yyyy") & "#", dbOpenDynaset) 并通过getData = RS(ColName) 使返回动态。您的示例 getData = RS!ColName 将不起作用,因为它会搜索名为“ColName”的列 是的,你是对的。这很好用。这个getData = RS(ColName) 解决了这个问题。再次非常感谢你!!!) 您确实应该编辑您的答案以省略“转换为 2003”语句。这不仅没有帮助,而且具有误导性。【参考方案2】:

首先你需要参考“Microsoft DAO 3.6 Object Library”。我不知道菜单在英文 VBA 编辑器中是如何命名的。在德语版本中,它位于“Extras > Verweise...”

那么你需要这样的代码:

Public Function getData(Data as Integer) As Variant
Dim DB As Database
Dim RS As Recordset

Set DB = DBEngine.OpenDatabase("C:\yourPath\yourDatabase.accdb")
Set RS = DB.OpenRecordset("SELECT foo FROM bar WHERE Data = " & Data, dbOpenDynaset)

If RS.RecordCount > 0 Then
    RS.MoveFirst
    getData = RS!Date
End If

End Function

编辑:对不起,我没有看到你需要它在相反的方向(输入日期并获取数据)所以函数必须是这样的:

Public Function getData(whatDate as Date) As Variant
Dim DB As Database
Dim RS As Recordset

Set DB = DBEngine.OpenDatabase("C:\yourPath\yourDatabase.accdb")
Set RS = DB.OpenRecordset("SELECT Data FROM CB_EXCHANGE WHERE Date = #" & Format(Date, "m\/d\/yyyy") & "#", dbOpenDynaset)

If RS.RecordCount > 0 Then
    RS.MoveFirst
    getData = RS!Data
End If

End Function

【讨论】:

感谢您的回答。但它给出了一个错误。你的意思是SELECT column FROM table,如果我的“数据”是一个日期,我应该写成getData(Data as Date)吗? 嗨,我已经更新了我的答案。没弄对。是的,我的意思是SELECT column FROM table WHERE Date = #7/7/2015#。为查询获取正确的日期格式有点棘手,但它应该像第二个函数一样工作。 我试过了,但它返回#VALUE!,你试过了吗? ) 我现在试了一下,效果很好。但是我确实犯了一个小错误。您需要将Format(Date, "m\/d\/yyyy") 替换为Format(whatDate, "m\/d\/yyyy"),否则它总是返回当天的数据。 如果对您不起作用,请尝试在即时窗口中解决问题。例如键入?getData("01.06.2015")。这应该返回您的数据或显示更好的错误消息。

以上是关于如何编写一个从 ACCESS 数据库返回值的 Excel 函数?的主要内容,如果未能解决你的问题,请参考以下文章

C#,winfom,数据库为access.如何把sql查询结果直接保存在数组中?不是通过循环一个值一个值的赋予。

如何编写返回多种数据类型值的Java函数?

access中查询出来值的为空,如何将空值改为0,具体表达式是啥,从啥地方输入表达式,多谢

返回带有零而不是空值的 Access 记录集

如何编写一个返回 xaml 切换开关的值的方法?

如何使用 Access VBA 将具有默认值的未绑定文本框的值设置为空字符串