2

Excelマクロでは、次のようにRecordsetを返すように定義された関数があります。

Function GetCommissionDataRecordset(doctorCode As String) As ADODB.Recordset
    Set GetCommissionDataRecordset = New ADODB.Recordset
    .
    . ' setup the connection and SQL string...
    .
    GetCommissionDataRecordset.Open strSQL
end function

そして私はそのように関数を呼び出そうとします

sub tester()
    'Dim oRecSet As ADODB.Recordset  ' this doesn't work, needs to be a variant
    Dim oRecSet As Variant
    Set oRecSet = GetCommissionDataRecordset("GC")
    'Copy Data to Excel'

    ActiveSheet.Range("a1").CopyFromRecordset (oRecSet)
end sub

定義したtesterサブプロシージャでoRecSet as ADODB.Recordset、を実行するとランタイムエラーが発生しますCopyFromRecordset

oRecSetとして定義すると、エラーはなくなりますVariant

実行時エラーは430 Class does not support Automation or does not support expected interfaceです。

エラーが発生すると、WatchはタイプoRecSetRecordset/Recordset

バリアントアプローチを使用すると、WatchはタイプoRecSetVariant/Object/Recordset

Watchでオブジェクトのプロパティを調べても、私には何の違いも見られないようです。

どうしたの?

4

2 に答える 2

7

CopyFromRecordSetは、Variantパラメーターを想定しています。(誤って?)レコードセットを値で送信しているので、oRecSetの周りに()があるため、型の一致は非常に厳密であるように見え、エラーが発生します。

通話を次のように変更した場合:

ActiveSheet.Range("a1").CopyFromRecordset oRecSet

oRecSetがRecordSetの場合は機能しますが、ByValueパラメーターを強制的に渡すことはありません。実際、関数宣言はパラメーターがByValであるかByRefであるかを指定していませんが、「レコードセットからのコピー」メソッドがその内容を変更することは期待できません。

于 2012-04-20T13:27:54.877 に答える
3

する必要はありません。かっこを削除するだけです。

ActiveSheet.Range("a1").CopyFromRecordset oRecSet
于 2012-04-20T13:26:51.193 に答える