2016-09-11 7 views
1

私は配列をとり、別の配列を出力する関数を持っています。その内部は以下のおもちゃの例よりも複雑です。配列パラメータとして範囲を受け入れる

Public Function divide_by_2_5(ByRef coeffs() As Double) As Double() 
    Dim Columns As Integer 
    Columns = UBound(coeffs, 2) - LBound(coeffs, 2) + 1 
    Dim output() As Double 
    ReDim output(1 To 1, 1 To Columns) 
    Dim i As Integer 
    For i = 1 To Columns 
     output(1, i) = coeffs(1, i)/2.5 
    Next i 
    divide_by_2_5 = output 
End Function 

は、ここで私が見たものだ:私は代わりに、関数の出力を格納するための第二列をしたいと思い

enter image description here

。この場合は、0.4, 0.4, 0.4, 0.4となります。

残念ながら、#VALUE!エラーが発生し、これをデバッグする方法がわかりません。

明示的には、同じ関数に配列を返したり、スプレッドシートに書き込んだりすることができます(Ctrl - Shift - Enter)。同様の方法で、範囲または配列のどちらからでも入力が可能ですか?

+0

セルに範囲を渡す場合は、渡されたパラメータをRangeまたはVariantのいずれかとして宣言する必要があります。 – YowE3K

+0

'ReDim出力(1、coeffs)'文は 'ReDim output(1、columns)'でなければなりません。 – YowE3K

+0

@ YowE3K、thanks、編集 – user357269

答えて

4
Public Function divide_by_2_5(coeffs As Variant) As Double() 
    Dim v() As Variant 
    If TypeName(coeffs) = "Range" Then 
     v = coeffs.Value 
    Else 
     v = coeffs 
    End If 
    Dim output() As Double 
    ReDim output(LBound(v, 1) To UBound(v, 1), LBound(v, 2) To UBound(v, 2)) 
    Dim r As Long 
    Dim c As Long 
    For r = LBound(v, 1) To UBound(v, 1) 
     For c = LBound(v, 2) To UBound(v, 2) 
      output(r, c) = v(r, c)/2.5 
     Next 
    Next 
    divide_by_2_5 = output 
End Function 

UDFとしてこれを呼び出す例は以下のようになりUDFのみがその呼び出し元のセルに値を追加することができると思う:

{=divide_by_2_5(C2:F2)} 

VBAからこれを呼び出す例

Dim v As Variant 
v = divide_by_2_5(Worksheets("Sheet1").Range("C2:F2")) 

VBAから配列を使用してこれを呼び出す例は、次のようになります。

Sub test() 
    Dim x(1, 4) As Variant 
    Dim v As Variant 
    x(1, 1) = 6 
    x(1, 2) = 7 
    x(1, 3) = 8 
    x(1, 4) = 9 
    v = divide_by_2_5(x) 
    MsgBox v(1, 3) 
End Sub 
0

渡されたパラメータをRange変数に変更します。

Public Function divide_by_2_5(ByRef inputRange As Range) As Double() 
    Dim output() As Double 
    ReDim output(1 To inputRange.Rows.Count, 1 To inputRange.Columns.Count) As Double 
    Dim r As Long 
    Dim c As Long 
    For r = 1 To inputRange.Rows.Count 
     For c = 1 To inputRange.Columns.Count 
      output(r, c) = inputRange.Cells(r, c).Value/2.5 
     Next 
    Next 
    divide_by_2_5 = output 
End Function 

注:私はもともと私はちょうど関数に渡されたVariant配列を持っている可能性が考えていたが、私は

Public Function divide_by_2_5(ByRef x As Variant) As Double() 

代わりの

Public Function divide_by_2_5(ByRef x() As Variant) As Double() 
のヘッダを使用してテストされているため混乱していました

したがって、私がテストしていたバージョンはVariant の配列を受け入れておらず、Rangeオブジェクトを含むVariantだけでした。その後のテストコードでは、x(i)のようなものにはうまくいきましたが、Variant配列のi番目の要素が返されませんでした。これはRangeのi番目のセルを返すだけでした。

+0

私のコードを掃除していただきありがとうございます。あなたはこのbtwをテストしましたか?私はまだ同じエラーを受けています – user357269

+0

私は何か似たようなテストをしました - 私はあなたの変数にそれを戻す "翻訳"ミスをしたかもしれません。 – YowE3K

+0

一口 - それは問題を引き起こしているUBoundだ - 私は私の答えを削除するつもりだ – YowE3K

0

あなたはD2、E2、F2、G2が0.4に等しいようにしたい場合は、あなたが同じように、あなたの関数に1つの焦がす値を渡す必要があります。D2に=divide_by_2_5(D1)

Public Function divide_by_2_5 (ByRef coeff As Range) As Double 
     divide_by_2_5 = coeff.Value/2.5 
End Function 

次の呼び出しを行いますG2までドラッグします。

は私だけ

+0

私はもともとUDFは、単一の細胞にも作用できると思ったが、実際には複数の細胞に出力することができます配列式として入力します。 – YowE3K

+0

あなたは正しいです。私はこれまで聞いたことがない、今まで。 – suisgrand

+0

私は、何年も何年もExcelを使用している以上に、SOの質問に答えようとするだけでもっと多くのことを学びました。 – YowE3K

関連する問題