1

以下のコードは配列を返します。配列を返すための Excel 数式としてスプレッド シートで使用したいと思います。ただし、そうすると、最初の値のみがセルに返されます。配列と同じサイズの範囲で配列を返す方法はありますか?

Function LoadNumbers(Low As Long, High As Long) As Long()
'''''''''''''''''''''''''''''''''''''''
' Returns an array of Longs, containing
' the numbers from Low to High. The
' number of elements in the returned
' array will vary depending on the
' values of Low and High.
''''''''''''''''''''''''''''''''''''''''

'''''''''''''''''''''''''''''''''''''''''
' Declare ResultArray as a dynamic array
' to be resized based on the values of
' Low and High.
'''''''''''''''''''''''''''''''''''''''''
Dim ResultArray() As Long
Dim Ndx As Long
Dim Val As Long
'''''''''''''''''''''''''''''''''''''''''
' Ensure Low <= High
'''''''''''''''''''''''''''''''''''''''''
If Low > High Then
    Exit Function
End If
'''''''''''''''''''''''''''''''''''''''''
' Resize the array
'''''''''''''''''''''''''''''''''''''''''
ReDim ResultArray(1 To (High - Low + 1))
''''''''''''''''''''''''''''''''''''''''
' Fill the array with values.
''''''''''''''''''''''''''''''''''''''''
Val = Low
For Ndx = LBound(ResultArray) To UBound(ResultArray)
    ResultArray(Ndx) = Val
    Val = Val + 1
Next Ndx
''''''''''''''''''''''''''''''''''''''''
' Return the array.
''''''''''''''''''''''''''''''''''''''''
LoadNumbers = ResultArray()

End Function
4

3 に答える 3

5

UDF は確かに配列を返すことができ、関数は正常に動作します。たとえば、範囲 B2:D2 を選択=LoadNumbers(1, 3)して数式バーに入力し、Ctrl+Shift+Enter を押して、それが配列関数であることを Excel に伝えます。

現在、UDFがその入力に応じて呼び出された範囲を自動サイズ変更することはできませんが(少なくとも醜いApplication.OnTimeハックがなければ)、とにかくそれを行う必要はありません。最初に関数を 1000 セル幅の範囲に配置し、次のように UDF で未使用のスペースを空白セルで埋めます。

Function LoadNumbers(ByVal Low As Long, ByVal High As Long) As Variant()
    Dim ResultArray() As Variant
    Dim Ndx As Long
    Dim Val As Long
    Dim SourceCols As Long

    SourceCols = Application.Caller.Columns.Count

    If Low > High Then
        Exit Function
    End If
    If High - Low + 1 > SourceCols Then High = Low + SourceCols - 1

    ReDim ResultArray(1 To SourceCols)

    Val = Low
    For Ndx = LBound(ResultArray) To (High - Low + 1)
        ResultArray(Ndx) = Val
        Val = Val + 1
    Next Ndx
    For Ndx = (High - Low + 2) To UBound(ResultArray)
        ResultArray(Ndx) = vbNullString
    Next Ndx
    LoadNumbers = ResultArray()
End Function
于 2013-08-28T19:21:40.283 に答える
1

ワークシートの数式は、数式が書き込まれた同じセルにのみ値を出力できます。現状では、コードは既に配列を生成しています。数式を下にコピーするときに値を表示する場合は、次のような数式を (任意のセルで) 使用してから下にコピーします。

=INDEX(LoadNumbers(1,10),ROWS($A$1:$A1))

下にコピーしすぎると、#REF が発生します。LoadNumbers の数値が不足しているため、エラーが発生しました。

于 2013-08-28T17:19:39.673 に答える
0
=INDEX(LoadNumbers(1,10),ROWS($A$1:$A1),COLUMNS($B$1,B$1))
于 2013-08-28T17:40:47.303 に答える