即効テクニック

関数関連のテクニック

セルに配列を代入する

(Excel 2000/2002/2003/2007)

「田中」「鈴木」「山田」という要素を持つ配列データを、セル範囲A1:C1に代入するには次のようにします。

Sub Sample1()
    Range("A1:C1") = Array("田中", "鈴木", "山田")
End Sub
このとき、代入するセル範囲の大きさと、配列の大きさを一致させるのがポイントです。 こうしたテクニックは、CSVファイルのデータを1行ずつ読み込み、指定したセルへ代入するとき便利です。 CSVファイルを1行ずつ読み込むには次のようにします。
Sub Sample2()
    Dim buf As String
    Open "C:\Sample.csv" For Input As #1
        Do Until EOF(1)
            Line Input #1, buf
            Debug.Print buf
        Loop
    Close #1
End Sub
「Debug.Print buf」の代わりに、読み込んだ1行分のデータをカンマ(,)で分割し、それぞれのデータをセルに代入します。データの分割にはSplit関数が便利です。 Split関数は分割した各要素を配列で返します。 Sample1を応用すれば各セルに代入できますが、ここで問題になるのは配列の要素数とセル範囲の大きさ指定です。 配列の要素数はUbound関数で取得できます。 Ubound関数は、配列の最終要素のインデックスを返します。要素が3つある配列では先頭から0,1,2というインデックスが振られますので、2が返ります。 要素の個数は、この返り値に+1した数になります。
Sub Sample3()
    Dim tmp
    tmp = Array("田中", "鈴木", "山田")
    MsgBox Ubound(tmp)
End Sub
Ubound関数を使えばSplit関数によって得られる配列の要素数が取得できます。 残る問題は、その配列の大きさに合わせたセル範囲を指定することです。 セル範囲の大きさを特定するにはResizeプロパティを使います。 Resizeプロパティは
 セル.Resize(RowSize, ColumnSize)
と指定することで、任意の大きさを持つセル範囲を取得することができます。 CSVデータの場合、代入は1行ずつ行いますので、RowSizeは1です。 列サイズのColumnSizeは、配列の要素数を指定します。
Sub Sample4()
    Dim buf As String, I As Long
    Open "C:\Sample.csv" For Input As #1
        Do Until EOF(1)
            Line Input #1, buf
            I = I + 1
            Cells(I, 1).Resize(1, Ubound(Split(buf, ",")) + 1) = Split(buf, ",")
        Loop
    Close #1
End Sub
●補足● Split関数はExcel 2000で追加された関数です