1

我有一个包含 4 个字段的 simple_table:a、b、x、P

我正在尝试根据使用其他字段作为输入参数的函数的输出来更新字段 p。在这种情况下,该函数是一个 excel 函数。我使用的是 SQL 服务器,但确实需要访问一些统计功能。所以昨天我第一次打开了访问权限。哎呀。我花了最后一天尝试学习 vba 并遵循有关记录集的各种教程。

我正在努力解决的问题是如何根据其他字段更新 P 字段?在一个循环?

非常感谢。

Dim objExcel As Excel.Application
Set objExcel = CreateObject("Excel.Application") 
'Test it works
MsgBox objExcel.Application.BetaDist(0.4, 2, 5)
'OK, that works :)

'set up the ADO stuff
Dim cnn1 As ADODB.Connection
Dim MyRecordSet As New ADODB.Recordset

Set cnn1 = CurrentProject.Connection
MyRecordSet.ActiveConnection = cnn1

'Load data into MyRecordSet
MySQLcmd = "SELECT * FROM simple_table"
MyRecordSet.Open MySQLcmd

'HELP WITH THE NEXT BIT PLEASE!
'Some kind of loop to go through the recordset to set the field P
' equal to the result of the excel function betadist(x,a,b)
'I imagine looping through something like the following semi pseudo code ???  
    myRecordSet.Fields(“P”).Value = objExcel.Application.BetaDist(myRecordSet.Fields(“x”).Value, myRecordSet.Fields(“a”).Value, myRecordSet.Fields(“b”).Value)
'end of the loop

objExcel.Quit
Set objExcel = Nothing
MyRecordSet.Close
cnn1.Close
Set MyRecordSet = Nothing
Set cnn1 = Nothing
4

1 回答 1

2

由于您的代码适用于"Dim objExcel As Excel.Application",这意味着您有一个 Excel 对象库的参考集。在这种情况下,您不需要完整的 Excel 应用程序实例即可使用该BetaDist功能。您可以将对象变量设置为Excel.WorksheetFunction并调用该函数作为该对象的方法。但是,我不知道这是否会产生重大影响。我没有测试CreateObject("Excel.Application")替代方案。

在此示例中,我使用了 DAO 记录集而不是 ADO。原因是我发现使用本机 Access (Jet/ACE) 数据源可以显着加快 DAO。如果您愿意,可以切换到 ADO,但我看不出有什么优势。

请注意,我直接打开了表,而不是通过查询。DAOdbOpenTable选项还可以提高性能。

排除这些细节后,只需循环遍历记录集,使用当前行中的值调用函数,并将函数的结果存储在P字段中……几乎就是您在伪代码中概述的内容. :-)

Dim objWFunction As Object ' Excel.WorksheetFunction
Dim MyRecordSet As DAO.Recordset
Dim db As DAO.database

Set objWFunction = Excel.WorksheetFunction ' Excel reference required
Set db = CurrentDb
Set MyRecordSet = db.OpenRecordset("simple_table", dbOpenTable)
With MyRecordSet
    Do While Not .EOF
        'Debug.Print objWFunction.BetaDist(!x, !a, !b)
        .Edit
        !p = objWFunction.BetaDist(!x, !a, !b)
        .Update
        .MoveNext
    Loop
    .Close
End With

Set MyRecordSet = Nothing
Set db = Nothing
Set objWFunction = Nothing
于 2013-09-22T02:00:45.263 回答