4

編集:解決策- 以下の元の質問を参照してください

{1,2,3} のような配列を UDF に渡す際に、次の 2 つの点を考慮する必要があることがわかりました。

  • ロケール - 回答 1 を参照してください。ドイツ語システム (通常) のリスト区切り文字は ";" です。したがって、 {1 ;を使用する必要があります。2 ; 3}。

  • 渡された配列は、関数内で 2 次元配列として表示されます。したがって、n 番目の要素は myArray(n, 1 )としてターゲットにする必要があります。これを無視すると、#VALUE! が得られました。エラー。

したがって、短い「ケース選択」-UDF は次のようになります。

Function SelCase(a1, a2, a3)
    For i = 1 To UBound(a2)
        If a2(i, 1) = a1 Then SelCase = a3(i, 1)
    Next
End Function

のように呼ばれます (ドイツのロケール!):

=SelCase(A1;{1;2;3};{"a";"b";"c"})

A1 が 1、2、または 3 を保持するかどうかに応じて、結果に "a"、"b"、または "c" を指定します。

より精巧な「選択ケース」-UDF は、こちらにあります


元の質問:

{1,2,3,4} のような配列を Excel 2002 のユーザー定義関数に渡したいのですが、これを行う方法が見つかりません。

私はドイツ語版を使用しているため、「、」は小数点記号であり、水平 (1D-) 配列の値も区切ります- 編集: これは間違っています -、「;」私の知る限り、式で呼び出される関数の引数をシートから分離し、垂直(1D-)配列の値も分離します。

私は何かを試しました

Function test(myArray)
Function test(myArray())

のようなもので

=test({1,2,3,4})
{=test({1,2,3,4})} (with ctrl+shift+enter)

私のシートでは、Excelは常に「= test({1,234})」のように数式を修正するように求めますが、これは私が望んでいるものではありません。

次のようなことを試してみると

=test({1;2;3;4})
=test(1,2,3,4)
=test(1;2;3;4) <- ok this would be for paramArray

シートの数式として #VALUE! を取得します。エラー。

最終的に、2 つの配列 (可変サイズ) と 1 つの値を 3 つの引数として渡す必要があるため、paramArray は使用できません。配列 (範囲として定義されていない) を渡すには、シートと VBA でどのような構文が必要ですか?

前もって感謝します!マーティン・リンデンラウフ

編集:

私が構築しようとしているのは、次のような「Select Case」の省略形 UDF です。

Function SelCase() As Variant
a1 = "b"
a2 = Array("a","b","c")
a3 = Array("e1","e2","e3")
For i = 0 To UBound(a2)
    If a2(i) = a1 Then SelCase = a3(i)
Next
End Function

a1、a2、a3 は関数内で定義されていませんが、次のような関数呼び出しによって渡されます

=SelCase(A1;{"a","b","c"};{"e1","e2","e3"})

A1 = "a"、"b"、または "c" に応じて "e1"..."e3" を指定します。

CHOOSE() と MATCH() でこれを実現できましたが、非常に頻繁に必要です->素敵な「短いバージョン」が欲しいのですが、ところで。配列とUDFで何が間違っているのかを理解したいのですが...ありがとう。

編集2:

ここで「select case UDF」の実用的なアプローチを見つけました。一般的な問題が残っています: {1,2,3} 表記のような配列を UDF に渡す方法 (可能な場合)。

4

1 に答える 1

3

これはあなたが意味するものですか?

エクセル式:

=sumArray({1,2,3,4,5},2,{9.5,8.7,7.3,6,5,4,3},D1:D11)

UDF:

Function sumArray(ParamArray arr1() As Variant) As Double

    sumArray = WorksheetFunction.Sum(arr1(0)) + arr1(1) + _
        WorksheetFunction.Average(arr1(2)) + WorksheetFunction.Sum(arr1(3))

End Function

アップデート:

上記のコードと式は、以下の設定で UK ロケールを使用して確実に機能します。エラーが発生する場合は、コントロール パネルの記号を代用するか、式を正しい区切り記号と小数点記号で更新してください。

ここに画像の説明を入力

于 2013-08-12T11:46:08.843 に答える