【ExcelVBA基礎】2章：配列

はじめに
この章ではExcelVBAで扱う配列について説明をします。
1章で説明した変数は1度にひとつのデータしか保持することができません。配列を用いれば複数のデータをより単純に扱うことが可能となります。

1、配列とは
変数は1度にひとつのデータしか保持できません。連続したデータを変数のみで保持するには、データの数だけ変数を用意する必要があります。

```
Sub sample_without_arrays()

    Dim name_1 As String
    Dim name_2 As String
    Dim sentence_1 As String
    Dim sentence_2 As String
    Dim sentence_3 As String
    Dim sentence_4 As String
    Dim sentence_5 As String
    Dim story As String
    
    story = ""
    
    name_1 = "おじいさん"
    name_2 = "おばあさん"
    
    sentence_1 = "むかしむかしあるところに"
    sentence_2 = "と"
    sentence_3 = "がいました。"
    sentence_4 = "はやまへしばかりに"
    sentence_5 = "はかわへせんたくに"
    
    story = story & sentence_1
    story = story & name_1
    story = story & sentence_2
    story = story & name_2
    story = story & sentence_3
    story = story & name_1
    story = story & sentence_4
    story = story & name_2
    story = story & sentence_5
    
    MsgBox story

End Sub
'結果:むかしむかしあるところにおじいさんとおばあさんがいました。おじいさんはやまへしばかりにおばあさんはかわへせんたくに
```

しかし、配列を使えば同じ名前を共有出来ます。

```
Sub sample_knew_array()

    Dim actor(0 To 1)
    Dim sentence(0 To 4)

    actor(0) = "おじいさん"
    actor(1) = "おばあさん"
    
    sentence(0) = "むかしむかしあるところに"
    sentence(1) = "と"
    sentence(2) = "がいました。"
    sentence(3) = "はやまへしばかりに"
    sentence(4) = "はかわへせんたくに"
    
    story = story & sentence(0)
    story = story & actor(0)
    story = story & sentence(1)
    story = story & actor(1)
    story = story & sentence(2)
    story = story & actor(0)
    story = story & sentence(3)
    story = story & actor(1)
    story = story & sentence(4)
    
    MsgBox story

End Sub
'結果:むかしむかしあるところにおじいさんとおばあさんがいました。おじいさんはやまへしばかりにおばあさんはかわへせんたくに
```

2、配列の宣言
変数は宣言を省略することが出来ますが、配列は宣言を省略することは出来ません。

3、配列の要素数

```
    Dim actor(0 To 1)
    Dim sentence(0 To 4)
```

配列は使う前に要素数を決める必要があります。通常は先頭の要素に0を指定します。上例の配列sentence()では0から4までの5つの要素を持った配列を宣言しています。

```
    Dim actor(1) '要素数は2
    Dim sentence(4) '要素数は5
```

「0 To」は省略することができますが要素数についてぱっと見、誤解を招くので省略しないことを推奨します。

4、動的配列
配列の宣言時に要素数を省略すると、マクロ実行中に要素数を自由に変更できます。

```
Sub dynamic_array()

    Dim actor()
    Dim sentence(0 To 4)
 
    ReDim actor(0 To 1)

    actor(0) = "おじいさん"
    actor(1) = "おばあさん"
    
    sentence(0) = "むかしむかしあるところに"
    sentence(1) = "と"
    sentence(2) = "がいました。"
    sentence(3) = "はやまへしばかりに"
    sentence(4) = "はかわへせんたくに"
    
    story = story & sentence(0)
    story = story & actor(0)
    story = story & sentence(1)
    story = story & actor(1)
    story = story & sentence(2)
    story = story & actor(0)
    story = story & sentence(3)
    story = story & actor(1)
    story = story & sentence(4)
    
    ReDim Preserve actor(0 To 2)
    
    actor(2) = "桃太郎"
    
    MsgBox story
    MsgBox actor(2)

End Sub
'結果:むかしむかしあるところにおじいさんとおばあさんがいました。おじいさんはやまへしばかりにおばあさんはかわへせんたくに
'結果：桃太郎
```
i）動的配列の宣言

```
    Dim actor() '動的配列
    Dim sentence(0 To 4) '静的配列
```

宣言時に要素数を指定するとマクロ実行中に要素数を変えることができない「静的配列」とみなされます。

ii）動的配列の要素数指定

```
    ReDim actor(0 To 1)
```

配列を使用する前に必ず要素数を指定する必要があります。

iii）要素数の変更

```
    ReDim Preserve actor(0 To 2)
```
「Preserve」は配列のデータを保持した状態で要素数を変更する場合に指定します。

5、二次元配列
i)二次元配列とは
配列は、階層を増やしてデータを保持することができます。
変数は「セル」、1次元配列は「列」、2次元配列は「表」を扱うイメージです。

```
Sub demon_Slayer()

    Dim pillar() As String
    Dim table_string As String
    
    ReDim pillar(0 To 7, 0 To 1)
    
    table_string = ""
    
    pillar(0, 0) = "冨岡義勇"
    pillar(0, 1) = "トミオカギユウ"
    pillar(1, 0) = "煉獄杏寿郎"
    pillar(1, 1) = "レンゴクキョウジュウロウ"
    pillar(2, 0) = "胡蝶しのぶ"
    pillar(2, 1) = "コチョシノブ"
    pillar(3, 0) = "宇随天元"
    pillar(3, 1) = "ウズイテンゲン"
    pillar(4, 0) = "甘露寺蜜璃"
    pillar(4, 1) = "カンロジミツリ"
    pillar(5, 0) = "時透無一郎"
    pillar(5, 1) = "トキトウムイチロウ"
    pillar(6, 0) = "悲鳴嶼行冥"
    pillar(6, 1) = "ヒメジマギョウメイ"
    pillar(7, 0) = "不死川実弥"
    pillar(7, 1) = "シナズガワサネミ"

    table_string = table_string & pillar(0, 0) & "," & pillar(0, 1) & vbCrLf
    table_string = table_string & pillar(1, 0) & "," & pillar(1, 1) & vbCrLf
    table_string = table_string & pillar(2, 0) & "," & pillar(2, 1) & vbCrLf
    table_string = table_string & pillar(3, 0) & "," & pillar(3, 1) & vbCrLf
    table_string = table_string & pillar(4, 0) & "," & pillar(4, 1) & vbCrLf
    table_string = table_string & pillar(5, 0) & "," & pillar(5, 1) & vbCrLf
    table_string = table_string & pillar(6, 0) & "," & pillar(6, 1) & vbCrLf
    table_string = table_string & pillar(7, 0) & "," & pillar(7, 1) & vbCrLf
    
    MsgBox table_string

    '出力結果：冨岡義勇,トミオカギユウ
    '          煉獄杏寿郎,レンゴクキョウジュウロウ
    '          胡蝶しのぶ,コチョシノブ
    '          宇随天元,ウズイテンゲン
    '          甘露寺蜜璃,カンロジミツリ
    '          時透無一郎,トキトウムイチロウ
    '          悲鳴嶼行冥,ヒメジマギョウメイ
    '          不死川実弥,シナズガワサネミ

End Sub
```

二次元以上の配列を扱うことも可能ですが、管理が複雑になる(保守性が下がる)ので、よほど専門的な分野での利用を除けば、二次元までの利用を推奨します。

ii）二次元配列の要素を増やす

```
Sub demon_Slayer()

    Dim pillar() As String
    Dim table_string As String
    
    ReDim pillar(0 To 7, 0 To 1)
    
    table_string = ""
    
    pillar(0, 0) = "冨岡義勇"
    pillar(0, 1) = "トミオカギユウ"
    pillar(1, 0) = "煉獄杏寿郎"
    pillar(1, 1) = "レンゴクキョウジュウロウ"
    pillar(2, 0) = "胡蝶しのぶ"
    pillar(2, 1) = "コチョシノブ"
    pillar(3, 0) = "宇随天元"
    pillar(3, 1) = "ウズイテンゲン"
    pillar(4, 0) = "甘露寺蜜璃"
    pillar(4, 1) = "カンロジミツリ"
    pillar(5, 0) = "時透無一郎"
    pillar(5, 1) = "トキトウムイチロウ"
    pillar(6, 0) = "悲鳴嶼行冥"
    pillar(6, 1) = "ヒメジマギョウメイ"
    pillar(7, 0) = "不死川実弥"
    pillar(7, 1) = "シナズガワサネミ"
    
    table_string = table_string & pillar(0, 0) & "," & pillar(0, 1) & vbCrLf
    table_string = table_string & pillar(1, 0) & "," & pillar(1, 1) & vbCrLf
    table_string = table_string & pillar(2, 0) & "," & pillar(2, 1) & vbCrLf
    table_string = table_string & pillar(3, 0) & "," & pillar(3, 1) & vbCrLf
    table_string = table_string & pillar(4, 0) & "," & pillar(4, 1) & vbCrLf
    table_string = table_string & pillar(5, 0) & "," & pillar(5, 1) & vbCrLf
    table_string = table_string & pillar(6, 0) & "," & pillar(6, 1) & vbCrLf
    table_string = table_string & pillar(7, 0) & "," & pillar(7, 1) & vbCrLf
    
    MsgBox table_string
    
    ReDim Preserve pillar(0 To 7, 0 To 2)
    
    table_string = ""
    
    pillar(0, 2) = "水柱"
    pillar(1, 2) = "炎柱"
    pillar(2, 2) = "蟲柱"
    pillar(3, 2) = "音柱"
    pillar(4, 2) = "恋柱"
    pillar(5, 2) = "霞柱"
    pillar(6, 2) = "岩柱"
    pillar(7, 2) = "風柱"
    
    table_string = table_string & pillar(0, 0) & "," & pillar(0, 1) & "," & pillar(0, 2) & vbCrLf
    table_string = table_string & pillar(1, 0) & "," & pillar(1, 1) & "," & pillar(1, 2) & vbCrLf
    table_string = table_string & pillar(2, 0) & "," & pillar(2, 1) & "," & pillar(2, 2) & vbCrLf
    table_string = table_string & pillar(3, 0) & "," & pillar(3, 1) & "," & pillar(3, 2) & vbCrLf
    table_string = table_string & pillar(4, 0) & "," & pillar(4, 1) & "," & pillar(4, 2) & vbCrLf
    table_string = table_string & pillar(5, 0) & "," & pillar(5, 1) & "," & pillar(5, 2) & vbCrLf
    table_string = table_string & pillar(6, 0) & "," & pillar(6, 1) & "," & pillar(6, 2) & vbCrLf
    table_string = table_string & pillar(7, 0) & "," & pillar(7, 1) & "," & pillar(7, 2) & vbCrLf

    MsgBox table_string

    '出力結果：冨岡義勇,トミオカギユウ,水柱
    '          煉獄杏寿郎,レンゴクキョウジュウロウ,炎柱
    '          胡蝶しのぶ,コチョシノブ,蟲柱
    '          宇随天元,ウズイテンゲン,音柱
    '          甘露寺蜜璃,カンロジミツリ,恋柱
    '          時透無一郎,トキトウムイチロウ,霞柱
    '          悲鳴嶼行冥,ヒメジマギョウメイ,岩柱
    '          不死川実弥,シナズガワサネミ,風柱

End Sub
```

2次元配列の要素を「Preserve」を使って増やす場合、配列の最後の要素しか増やすことができません。

```
    ReDim pillar(0 To 7, 0 To 1)
'…
    ReDim Preserve pillar(0 To 7, 0 To 2)'これはできる

    ReDim Preserve pillar(0 To 8, 0 To 1)'これはできない

```

強いてExcelで表現するなら、データを保持しながら列を増やすことはできるが、データを保持しながら行を増やすことはできない、ということです。

3章：セルの操作
https://qiita.com/daichi05w/items/87011897a5116bd260ae

序章：まえがきと目次
https://qiita.com/daichi05w/items/002f311490dabaaf14d0