2016-10-23 4 views
1

私はこの質問の解決策を3日間探しました&が見つかりましたどちらかCtrlキー + Shiftキーを使用することを答え + 空の範囲を返すか、上げるerrは10041つまたは2つのdimバリエーションアレイを表示するにはCtrl + Shift + Enterを押しながら配列のメソッドを使用しないでExcelのUDF関数から返す方法

私は、64ビットのWindows 8.1とExcel-を使用していますいずれか(配列数式法)や関数を入力します。配列のサイズが不明な場合にバリアント配列を返す2013書き込みUDFは、... 'MyFunction(args ...)Variant()'のように返されます。直後のウィンドウで結果を確認したり、ファイルに書き込んだり表示することができますCtrl + Shift + を配列式として入力します。

私がしたいのは、arr2rng()がActiveCellからアクティブシート上の範囲を塗りつぶして、配列式メソッドを使用するマニュアルルーチン全体を避​​けるように、サブarr2rng(Myfunction)の引数としてMyFunction (例えば、返された配列よりも大きいサイズの範囲を強調表示する場合は、を入力してください。 + + を入力して配列を表示してください)。

は私もナイル川で長いサブルーチンを試してみた - 彼の 一般的なVBAの配列がVBA Excel 2-Dimensional Arraysで機能をレンジに見る、
Public Sub ArrayToRange(rngTarget As Excel.Range, InputArray As Variant) 

が、内のすべてのステートメントで

「ArrayToRange()」「rngOutput .Value2 = InputArray '関数はerr.Number 1004で爆弾を発生させます。の前に、' InputArray 'と' rngOutput.VaAlue2 'の両方の要素が正しくディメンションされ、(即時またはローカルウィンドウの観測値から) 'rngOutput.Value2'elmentsは空でなければなりません。 の後、ステートメントは 'rgnOutput.value2'を実行しますが、要素はまだ空ですが、err = 1004が発生しています。これは、コード内のどのテストが実行されても発生します。また

「ConArrは」結果バリアントの名前をある
myFunction(args....) as Variant() 
[do stuff...] 
ConArr = vbaTransposeVar(ConArr) 
Set DestCell = ACTIVE_CELL_DESTINATION 
ArrayToRange DestCell, ConArr 
myFunction = ConArr 
End Function 

()配列とからのリターン:私も自分のVBAのようの終わりに私の機能により、これまでの彼のサブを起動するように行ってきましたmyFunction()、ここで 'ACTTIVE_CELL_DESTINATION'はモジュール内のPublicとしてRangeとして宣言されています。

私はしかし、 'subArrayToRange myDest、myArray'、または汎用の 'sub arr2rng(myDestとしての範囲、myArray()をVariantとして使用するなどの他のサブを呼び出すだけです。マクロウィンドウからサブを呼び出すか、手動で実行します。

誰かが助けてくれますか、なぜ私が得るのは、空のセル範囲か1004エラーですか?私が本当に求めているのは、配列式メソッドを使用して回避する方法だと思います。Ctrl + Shift + を入力してください。方法が必要です! u

+1

のみ呼び出す数式を含むセル(単数または複数)に値を支配することができるワークシートからUDFと呼ばれる関数は:それはよく知られている限界である(少なくともここは、ここでそれはかなり定期的に来る)。あなたが望むことをするために調査することができる回避策があります。たとえば、次のようにします。http://stackoverflow.com/questions/23433096/using-a-udf-in-excel-to-update-the-worksheet/23437280#23437280 –

+0

値の統治のみが可能なのは値を返すことのみです –

+0

@ティムウィリアムズ - 私はこの文脈で「統治」が意味することに興味をそそられました!私は、あなたが "差を分けて新しい言葉を形成するかどうか"を "割り当てる"か "帰ってくる"と思っていました。 (または、少なくとも、既存の単語の新しい意味。長い女王の生きている!!) – YowE3K

答えて

0

この例は私のテストでは機能しましたが、以前の計算結果の前の値を消去するためのコードはありません。現在の実行の結果、配列が小さくなると、以前の値はクリアされません。

最後に入力した範囲を追跡し、最初にクリアすることができますが、実行可能ではない可能性のあるユースケースによっては、これを説明することができます。

enter image description here

Function ChangeIt(func As Range, c1 As Range, c2 As Range) 
    Dim arr(), r, c, rv, v 

    For r = 1 To c1 
    For c = 1 To c2 
     v = "Row" & r & ":Col" & c 
     If r = 1 And c = 1 Then 
      rv = v 'return this to the calling cell via myArray 
     Else 
      'all other values are written directly 
      func.Offset(r - 1, c - 1).Value = v 
     End If 
    Next c 
    Next r 

    ChangeIt = rv 
End Function 

'this is called from the worksheet 
Function MyArray(arg1 As Range, arg2 As Range) 

    Dim v 

    v = arg1.Parent.Evaluate("Changeit(" & Application.Caller.Address(False, False) & "," & _ 
              arg1.Address(False, False) & "," & _ 
              arg2.Address(False, False) & ")") 

    MyArray = v 'set the top-left array value 

End Function 
関連する問題