2013-09-22 56 views
1

我有一個simple_table有4場函數的結果: A,B,X,P訪問VBA recordets - 更新字段基於使用其他字段輸入

我試圖更新域p基於使用其他字段作爲輸入參數的函數的輸出。在這種情況下,該函數是一個excel函數。 我正在使用SQL服務器,但確實需要訪問一些統計函數。所以昨天我第一次打開訪問。 Eeek。我花了最後一天嘗試學習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 
+0

請注意VBA代碼中的引號。樣例中的一行使用了類型設置引號......「P」。這將是一個問題。您需要使用標準(ASCII 43)引號來避免麻煩......'「P」' – HansUp

回答

2

由於您的代碼適用於"Dim objExcel As Excel.Application",這意味着您有一個Excel對象庫的參考集。在這種情況下,您不需要完整的Excel應用程序實例即可使用BetaDist函數。您可以將對象變量設置爲Excel.WorksheetFunction,並將該函數作爲該對象的方法調用。但是,我不知道這是否有重大的不同。我沒有測試CreateObject("Excel.Application")的替代方案。

在本示例中,我使用了DAO記錄集而不是ADO。原因是我發現DAO可以使用本地Access(Jet/ACE)數據源顯着加快速度。如果您願意,可以切換到ADO,但我沒有看到優勢。

注意我直接打開了表格而不是通過查詢。 DAO dbOpenTable選項也可以使性能受益。

有了這些細節,這只是一個循環遍歷記錄集,用當前行中的值調用函數並將函數的結果存儲在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 
+0

這是完美的謝謝。由於速度很重要,我換成了DAO(在simple_table中有超過一百萬條記錄),所以感謝提示。 – simon77

相關問題