1

a、b、x、Pの4つのフィールドを持つsimple_tableがあります

他のフィールドを入力パラメーターとして使用する関数の出力に基づいて、フィールド 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 オブジェクト ライブラリのリファレンス セットがあることを意味します。その場合、BetaDist関数を使用するために完全な Excel アプリケーション インスタンスは必要ありません。オブジェクト変数を設定し、Excel.WorksheetFunctionそのオブジェクトのメソッドとして関数を呼び出すことができます。ただし、それが大きな違いを生むかどうかはわかりません。CreateObject("Excel.Application")私は代替案をテストしませんでした。

このサンプルでは、​​ADO の代わりに DAO レコードセットを使用しました。その理由は、ネイティブ 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 に答える