5

このコードは、私が取り組んでいるものの小さなサブセットです。問題を次の部分に絞り込みました。このUDFSampleFunctionがあり、これに配列{3;4}を唯一の引数として渡す必要があります。

Function SampleFunction(InputVar As Variant) As Integer
    SampleFunction = InputVar(LBound(InputVar))
End Function

私はこのUDFを2つの異なる方法で呼んでいます。まず、VBAを介して

ケース1:

Sub testSF()
    MsgBox SampleFunction(Array(3, 4))
End Sub

そして第二に、私のエクセルワークシートを通して

ケース2:

={SampleFunction(ROW(3:4))}->すなわち配列関数として。

問題:

UDFはケース1、つまりVBAを介した呼び出しで機能#VALUEしますが、Excelワークシートを介して呼び出すと、ケース2でエラーが発生します。

ケース2でF8を使用して関数をステップ実行しましたが、Lbound(InputVar)1と評価されます(ケース1のサブからの呼び出しとは異なり、0と評価されます)がInputVar(Lbound(InputVar))、ケース2では「添え字が範囲外です」エラーが表示されます。

私が知りたいのは、ワークシート、つまりケース2からSampleFunction関数を呼び出して、上記のケース1と同じ動作をする方法だけです。Lbound(InputVar)ボーナスとして、誰かが上記の場合になぜ異なる評価をするのか説明できればいいのですが。

その他の詳細:

いくつかの正規表現操作を実行するためにUDFを構築しています。上記の引数InputVarは、x番目、y番目、z番目...の出現を指定する配列{x; y;z;...}になります。のデータ型はInputVarVariantに保持されます。これは、数値(1つの長さの配列として)、配列、または範囲(取り込んで配列に変換)のいずれかを関数に渡せるようにするためです。

前もって感謝します!!

4

1 に答える 1

5

2つの問題があると思います。SampleFunctionまず、非配列数式で使用するかどうか、つまりInputVarが範囲であるかどうかをコードが評価するとは思いません。バリアントに渡すことができるさまざまなタイプの入力を処理する何らかの方法を組み込む必要があります。次に、コードはInputVarが1次元配列であると想定しています。これにより、多次元配列でエラーが発生します。'Subscript out of range.'配列関数は、1次元として表現できる場合でも、すべての配列引数を2次元配列として渡すため、これがエラーの原因です。

関数で新しい動的配列を宣言してから、それをInputVarと等しく設定することをお勧めします。過去に、私は以下のような配列および非配列数式に対してこの作業を行いました。また、配列から最初のアイテムを取得する方法の変更にも注意してください。

Option Explicit
Function SampleFunc(InputVar As Variant) As Integer

Dim tmpArray() As Variant

On Error GoTo ErrHandler
tmpArray = InputVar

'Added extra argument to LBound since dynamic arrays have two dimensions by default.
SampleFunc = tmpArray(LBound(tmpArray, 1), LBound(tmpArray, 2))
Exit Function

ErrHandler:
'Handles the case where InputVar is a Range.
tmpArray = InputVar.Value
Resume Next

End Function

これは、特に迅速で汚いです。エラー処理ですが、基本的な考え方が役立つことを願っています。

于 2012-04-23T19:38:05.120 に答える