ExcelマクロVBA入門
第114回.セル範囲⇔配列

Excelマクロの基礎と応用、エクセルVBAの入門・初級・初心者向け解説
最終更新日:2018-02-06

第114回.セル範囲⇔配列


セル範囲をVariant型変数に入れる事で、配列を作成することができます、


また、配列をセル範囲にまとめて入れる事も出来ます。

これは、VBAを高速処理したい時の必須テクニックになります、

マクロVBAの処理が遅い場合は、このテクニックが使えないか検討してください。



セル範囲⇔配列の基本

Dim MyArray

MyArray = Range("A1:B100")

・・・処理・・・
Range("A1:B100") = MyArray


MyArray = Range("A1:B100")

これで、MyArrayは配列になります。

MyArray(1 To 100, 1 To 2)

の配列です。

LBoundは1になる点を注意して下さい。

Range("A1:B100") = MyArray

これで、配列の値が、セル範囲に一度に入れる事が出来ます。



使用例.

以下は、配列を使わない場合と、配列を使った場合のサンプルになります。

速度の違いは、一目瞭然ですので、実際にやってみて下さい。

Sub sample1()
  Dim i As Long
  Application.ScreenUpdating = False
  For i = 1 To 100000
    Cells(i, 3) = Cells(i, 1) * Cells(i, 2)
  Next i
  Application.ScreenUpdating = False
End Sub

Sub sample2()
  Dim i As Long
  Dim MyArray1
  Dim MyArray2
  MyArray1 = Range("A1:B100000")
  ReDim MyArray2(1 To 100000, 1 To 1)
  For i = LBound(MyArray1, 1) To UBound(MyArray1, 1)
    MyArray2(i, 1) = MyArray1(i, 1) * MyArray1(i, 2)
  Next i
  Range("C1:C100000") = MyArray2
End Sub

単に、100000行の掛け算をしています。

セル範囲とやり取りする配列は、必ず2次元で定義します。

上記で、

ReDim MyArray2(1 To 100000, 1 To 1)

これは、C列に入れる為の配列ですが、2次元で定義しています。

1次元目が行、2次元目が列に相当します。

LBoundは、0でも問題ありませんが、1にした方が理解しやすいと思います。


これほど単純な処理は、あまり無いと思いますが、

大量データを扱う場合は、適宜、配列を使うようにする事で、

高速処理を実現する事が出来ます。

ぜひ、マスターして頂きたいテクニックになります。



以下も参考にして下さい。

動的2次元配列の次元を入れ替えてシートへ出力(Transpose)
動的配列を使い様々な処理をした後にシートへ出力しようとしたとき縦横が違っている為そのまま出力できませんそもそも動的配列の要素数をRedimで変更できるのは最下位の次元のみになります。2次元配列の場合ReDimmyArray(2,10) ReDimmyArray(2,11) これはOKですが

マクロVBAの高速化・速度対策の具体的手順と検証
マクロVBAが遅い・重いという相談が非常に多いので、遅い・重いマクロVBAを高速化・速度対策する場合の具体的な手順をここに解説・検証します。マクロVBAの速度に関する記事は既にいくつか書いています。特に、以下はぜひお読みください。

大量データにおける処理方法の速度王決定戦
VBAで自動化したが、大量データ処理に時間がかかってしまう・・・そんな悩みが非常に多いようです、そこで、各種処理方法の速度比較を行い、どの処理方法が最も速いかを検証します。つまり、処理方法の速度王決定戦です。検証する題材としては、最も一般的な集計で行います。




同じテーマ「マクロVBA入門」の記事

静的配列
動的配列(Redim)
配列に関連する関数
セル範囲⇔配列
Split関数
ファイル操作Ⅱ(OpenとClose)
ファイル操作Ⅱ(Line Input #)
ファイル操作Ⅱ(Print #)
ファイルシステムオブジェクト(FileSystemObject)
OnTimeメソッド
SendKeysメソッドとAppActivateステートメント

新着記事NEW ・・・新着記事一覧を見る

Withステートメントの実行速度と注意点|VBA技術解説(6月6日)
VBA+SeleniumBasicで検索順位チェッカー(改)|VBA技術解説(6月2日)
マクロでShift_JIS文字コードか判定する|VBA技術解説(6月1日)
Shift_JISのテキストファイルをUTF-8に一括変換|VBAサンプル集(5月31日)
「VBAによる解析シリーズその2 カッコ」をやってみた|エクセル(5月21日)
VBA+SeleniumBasicで検索順位チェッカー作成|VBA技術解説(5月18日)
テーブル操作のVBAコード(ListObject)|VBA入門(5月12日)
テーブル操作の概要(ListObject)|VBA入門(5月12日)
VBAのスクレイピングを簡単楽にしてくれるSelenium|VBA技術解説(5月6日)
Excelワークシート関数一覧(2010以降)|VBAリファレンス(4月22日)

アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.ひらがな⇔カタカナの変換|エクセル基本操作
7.繰り返し処理(For Next)|ExcelマクロVBA入門
8.マクロって何?VBAって何?|ExcelマクロVBA入門
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.ExcelマクロVBAの基礎を学習する方法|エクセルの神髄



  • >
  • >
  • >
  • セル範囲⇔配列

    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。






    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。

    本文下部へ