前に複数のセルに値をセットするときは配列を使うと処理が速いということを紹介しましたが、今回はその応用です。
「あるシートのデータを加工して別のシートにセットする」という場合があります。
下で紹介するサンプルは、あるシートのデータを一気に配列に取得して、別のシートに一気にセットします。
一般に、セルを一つずつする処理するより、配列の要素を処理する方が速いです。
サンプル
Sub シートの全てのセルを取得し別のシートにセットする()
'元のシートのデータを取得
Sheets("moto").Select
arrs = Cells(1, 1).CurrentRegion
'各要素を加工
For r = 2 To UBound(arrs, 1)
For c = 2 To UBound(arrs, 2)
arrs(r, c) = arrs(r, c) * 2
Next c
Next r
'別のシートにデータをセット
Sheets("saki").Select
Range(Cells(1, 1), Cells(UBound(arrs, 1), UBound(arrs, 2))) = arrs
End Sub
'元のシートのデータを取得
Sheets("moto").Select
arrs = Cells(1, 1).CurrentRegion
'各要素を加工
For r = 2 To UBound(arrs, 1)
For c = 2 To UBound(arrs, 2)
arrs(r, c) = arrs(r, c) * 2
Next c
Next r
'別のシートにデータをセット
Sheets("saki").Select
Range(Cells(1, 1), Cells(UBound(arrs, 1), UBound(arrs, 2))) = arrs
End Sub
解説
元のシートのデータを取得
「arrs = Cells(1, 1).CurrentRegion」の部分は、セルを一つ指定してCurrentRegionを適用すると、アクティブセル領域(空白行と空白列で囲まれたセル範囲)を取得できます。そのセルを含む「表」を取得するときに便利です。
r行目c列目のセルはarrs(r, c)になります。ちょうど「Cells(r, c)」に相当します。
1行目1列目のセルはarrs(1, 1)です。
各要素を加工
UBound(arrs, 1)は、配列の1次元目の添え字の最大値です。この場合、「表」の行数を表します。
UBound(arrs, 2)は、「表」の列数を表します。
ForNextの部分は、2行目から最後の行まで、2列目から最後の列まで、の各要素について、値を2倍にしています。
別のシートにデータをセット
別のシートの範囲を指定して、そこに配列を一気にセットします。
コメント