2009-05-11 3 views
5

VBAでは、配列を返す方法、または関数を使ってセルに書き込む方法は?この非常に簡単な関数の使用

Function WriteArray() as Variant 
Dim array(0 To 2) 
array(0) = "A" 
array(1) = "B" 
array(2) = "C" 
WriteArray = array 
End Function 

を私は結果で私のExcelのスプレッドシートの配列全体を見て期待していたが、それはそうではないのです。私は最初の文字列を取得します。私は数式+ F2 + CTRL + SHIFT + ENTERでセルの範囲を選択することによってスプレッドシートに配列全体を表示するトリックがあることを知っていますが、VBAですべてを処理することをお勧めします。

また、 "Caller"の範囲に直接書き込むためにApplication.Caller変数を使用しようとしましたが、コードが壊れてしまいました。

ありがとうございました!

EDIT:

Function WriteArray() As Variant 
    Dim arr(0 To 2) 
    arr(0) = "A" 
    arr(1) = "B" 
    arr(2) = "C" 
    WriteArray = arr 
    Dim StartRow, i As Integer 
    For i = 0 To UBound(arr) 
     Range("A" & i).Value = arr(i) 
    Next 
End Function 

それはライン "範囲(" "& I).Valueの= ARR(I)" でどうぞ。 ここで私が使用しようとした別のコードがあります。私のExcelは壊れていますか?

答えて

6

次のコードは、美しくセルの範囲に配列を書き込みます。

Function WriteArray() As Variant 
    Dim AbcList(0 To 2) as Variant 
    AbcList(0) = "A" 
    AbcList(1) = "B" 
    AbcList(2) = "C" 
    WriteArray = AbcList 
End Function 

Function WriteArrayToSpreadsheet() 
    Dim MyArray As Variant 
    MyArray = WriteArray() 

    Dim StartRow, i As Integer 
    StartRow = 1 
    For i = 0 To UBound(MyArray) 
     Range("A" & i + StartRow).Value = MyArray(i) 
    Next 
End Function 

言われていること、私はあなたが実際にそれを取得しようとしているコードの一部を見てみたいと思いますスプレッドシートではなく、配列を作成する場所ではありません。それから私はあなたを助けることができます!

+0

これは実際には機能しませんが、VBAコードは "Range(" A "&i + StartRow).Value = MyArray(i)" ...でも問題になります。このコードはあなたのExcel上で動作しますか?私はExcel 2003を使用します。 –

+0

Excel 2003では完全に機能しました。先頭のコードのすべての「配列」を、AbcListや並べ替えのような予約語ではない別の変数名に変更します。バリアント 薄暗いARR(0〜2) ARR(0)= "" ARRは、(1)= "B" 編曲したよう 機能のwriteArray(): – Eric

+0

はまだ、それが壊れる...私は正確にこのコードを使用します(2)= "C" のwriteArray = ARR 薄暗いSTARTROW、I I = UBound関数を0(ARR) 範囲( "A" &I).Valueの= ARR(I) 次に エンド機能 に対する整数 として "Range(" A "&i).Value = arr(i)"では、エラーをスローせずにコードを終了します...私には意味がありません:( –

3

Excelのワークシート関数から呼び出し元以外のセルに直接書き込むことはできません。

あなたは(Shiftキーを押しながらCtrlキーを押しながら入力を使用して)配列関数を使用したい場合はあなたがあなたのコードを変更する必要があります:あなたは外にあなたがする必要があるだろう呼び出す細胞の書きたい場合は

Function WriteArray() As Variant 
    Dim arr(0 To 2, 0 To 1) 
    arr(0, 0) = "A" 
    arr(1, 0) = "B" 
    arr(2, 0) = "C" 
    WriteArray = arr 
End Function 

オートメーションを使用して他のセルに書き込む何らかの形式のコールバックを実装します。これはもっと複雑で、壊れやすいでしょう!

0

私は、これまでの手順を作成して作られた最適な回避策は以下のとおり...

をあなたの範囲参照し、あなたの配列を取得し、horizo​​ntalyまたは垂直方向にあなたのデータを表示するには、開始点としてそれを使用する:

Sub LoadArray(ByRef oRange, ByRef vArray) 
    Dim I 
    For I = 0 To UBound(vArray) 
     oRange.Offset(I, 0).Value = vArray(I) 
    Next 
End Sub 

'How to call: 
Dim anyArray 
anyArray = Array(1,2,3) 

Call LoadArray(Range("anyRange"), anyArray) 

希望します。

1

秘密は2次元配列を定義することです。配列の2つの次元は、単にデータセットに対して定義する必要がある範囲です。最初の配列次元は行オフセットで、2番目の次元は列オフセットです。

あなたの例では、第二の次元は、単に「使用」ではありません:だから

Sub Ente() 

    Dim myArray(0 To 3, 0) As String 
    myArray(0, 0) = "A" 
    myArray(1, 0) = "B" 
    myArray(2, 0) = "C" 

    Range("B7:B" & UBound(myArray) + 6) = myArray 

End Sub 

、一切必要ありませんループ!シンプルで速い。

関連する問題