ExcelマクロVBA入門
第111回.静的配列

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2019-07-19

第111回.静的配列


マクロVBAを学習していくと必ず配列が出てきます。
VBA記述自体は簡単なものですが正しく理解せずに使っている場合も見受けられます。
ここでは、配列の概要から入り、VBAでの記述方法を解説していきます。


配列とは

配列は、値を格納するために多くの区画を持つ1つの変数です、
集合住宅やアパートにたとえられますが、
要は、変数の箱を複数つなげたものと理解すれば良いでしょう。
1つの箱には、1つの値しか入れられませんが、その箱が複数つながっていますので、
結果として、複数の値をいれられるのが配列という事になります。
通常の変数が、1つの変数に1つの値を格納している点で大きく異なっています。

通常の変数 VBA マクロ 画像

配列    VBA マクロ 画像


配列が格納しているすべての値を参照する場合は、配列全体を参照することもできますし、
配列のインデックス番号(配列内の位置)を指定することで、個々の要素を参照することもできます。

配列のインデックス番号の最小値は、配列宣言時に指定しなければ0になります。

これを、
Option Base 1
のように指定することで変更可能ですが、
誤解の元になるので、あまり使用しない方が良いでしょう。
1から開始したい時は、配列宣言時に最小値に1を指定してください。

静的配列と動的配列

配列の要素数(値を入れる箱の数)が、あらかじめ決まっていてVBA内において不変の場合、
配列変数宣言時に要素数を指定します。
これを静的配列と呼びます。
対して、
マクロVBA実行時点で要素数を決める場合や、実行途中で要素数を増減させることもできます。
これを動的配列と呼びます。

マクロVBAでは配列の要素数が決まっていない場合が多々あるため、
むしろ動的配列を使用する機会の方が多いかもしれません。

配列の宣言

Dim ステートメント、またはPrivate ステートメント、Public ステートメントで宣言します。
Dim MyArray(10) As Long
インデックスの最小値は、0になりますので、
上記の宣言で、11個要素を持つ、1次元の配列を定義したことになります。

値を入れる時は、
MyArray(0) = 1
のように使用します。
以下の例では、配列に1から順に数値を入れています。

Sub sample()
  Dim MyArray(10) As Long
  Dim i As Long
  For i = 0 To 10
    MyArray(i) = i
  Next i
End Sub

多次元配列

Dim MyArray(10, 5) As String
これは、2次元配列を宣言しています。
ワークシートの、11行、6列のセル範囲を想像してもらえればよいでしょう。



Sub sample()
  Dim MyArray(10, 5) As Long
  Dim i As Long, j As Long
  For i = 0 To 10
    For j = 0 To 5
      MyArray(i, j) = Cells(i + 1, j + 1)
    Next i
  Next i
End Sub

上記では、セル範囲A1~F11を配列に入れています。

次元数の最大値は60とはなっていますが、
通常は、2次元までにしましょう。
ワークシートが2次元なのですから。
それ以上の次元は、むやみに複雑化させるだけです。

要素の下限()の変更

配列のインデックスの下限を変更することができます。
Dim MyArray(1 To 10) As String
このように定義することで、配列の要素は、
1~10の10個になります。
特に、ワークシートとデータのやり取りをする場合は、
このようにした方が理解しやすく、また、記述もしやすいでしょう。

配列について

以下も参考にして下さい。
配列の使い方について
今回は、配列についての基礎知識をまとめました。配列とは シートのセルを考えて下さい。縦1列だけを取り出した場合は、1次元の配列です。縦横の複数行列を取り出した場合は、2次元の配列です。このようなデータを変数で扱うのが、配列になります。
VBAの配列まとめ(静的配列、動的配列)
VBAで配列を必要とするのは、処理速度を上げる為だと言えます、そもそも、エクセルにはセルの2次元配列であるシートがあります。にもかかわらず、VBAの学習を進めると必ず配列が出てきます、ではなぜVBAで配列必須になるかと言うと、セルを使うと処理速度が非常に遅く、これを高速に処理するために配列が必要となるからです。
1次元配列の並べ替え(バブルソート,クイックソート)
2次元配列の並べ替え(バブルソート,クイックソート)
配列(2次元)の並べ替え方法について、バブルソートとクイックソートのサンプルになります。2次元配列の並べ替えと言えば、まさにワークシートの並べ替え機能になります。本来は、ワークシートにデータを書き出して、ワークシートの並べ替え機能を使えば良いのですが、しかし、どうしても、配列をワークシートに処理途中で書き出すと言うのは面倒なものです。
動的2次元配列の次元を入れ替えてシートへ出力(Transpose)
動的配列を使い様々な処理をした後にシートへ出力しようとしたとき、縦横が違っている為そのまま出力できません、そもそも、動的配列の要素数をRedimで変更できるのは、最下位の次元のみになります。2次元配列の場合、ReDimmyArray(2,10) ReDimmyArray(2,11) これはOKですが、
マクロVBAの高速化・速度対策の具体的手順と検証
マクロVBAが遅い・重いという相談が非常に多いので、遅い・重いマクロVBAを高速化・速度対策する場合の具体的な手順をここに解説・検証します。マクロVBAの速度に関する記事は既にいくつか書いています。特に、以下はぜひお読みください。
大量データにおける処理方法の速度王決定戦
VBAで自動化したが、大量データ処理に時間がかかってしまう… そんな悩みが非常に多いようです、そこで、各種処理方法の速度比較を行い、どの処理方法が最も速いかを検証します。つまり、処理方法の速度王決定戦です。検証する題材としては、最も一般的な集計で行います。



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

第108回.変数の適用範囲(スコープ,Private,Public)
第109回.列挙型(列挙体)Enum
第110回.ユーザー定義型・構造体(Type)
第111回.静的配列
第112回.動的配列(Redim)
第113回.配列に関連する関数
第114回.セル範囲⇔配列(マクロVBA高速化必須テクニック)
第115回.Split関数
第116回.ファイル操作Ⅱ(OpenとClose)
第117回.ファイル操作Ⅱ(Line Input #)
第118回.ファイル操作Ⅱ(Print #)


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

VBAにおける変数のメモリアドレスについて|VBA技術解説(11月8日)
空文字列の扱い方と処理速度について(""とvbNullString)|VBA技術解説(1月7日)
Errオブジェクトとユーザー定義エラー|VBA入門(11月5日)
シングルクォートの削除とコピー(PrefixCharacter)|VBA技術解説(11月4日)
ユーザー定義型の制限とクラスとの使い分け|VBA技術解説(11月3日)
クリップボードに2次元配列を作成してシートに貼り付ける|VBA技術解説(11月1日)
VBAクラスを使ったイベント作成(Event,RaiseEvent,WithEvents)|VBA技術解説(10月31日)
VBAクラスのAttributeについて(既定メンバーとFor Each)|VBA技術解説(10月19日)
VBAの用語について:ステートメントとは|VBA技術解説(10月16日)
VBAのマルチステートメント(複数のステートメントを同じ行に)|VBA技術解説(10月14日)


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

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



  • >
  • >
  • >
  • 静的配列

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


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




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