VBA

コピペ有!配列の要素数の変更(ネタばれ:静的配列はダメ、動的配列はOK)(セルの値を配列に格納する方法もあります)

記事内に商品プロモーションを含む場合があります

このページでわかること

配列の要素を変更できます。

覚えること

  1. 静的配列は変更できない。動的配列のみ変更できる!
  2. Redim 配列名(要素数-1)で要素数変更
  3. セルの値を配列に格納する方法

こんにちはhokkyokunです。
配列の記事第二弾です。
こちらに配列の基本操作をご紹介しているので、よろしければこちらもご覧ください。

今回は配列の要素数を変更する方法です。
この方法を使うことで
セルに入力された値を取り込むことが簡単にできます。

コピペ用意していますので、
見ていただけるとうれしいです!!

要素数をRedimを使って変更する方法 (ネタばれ:静的配列では使えません!!要素全て消えます!!)

静的配列で使った場合

静的配列の要素数を変えてみようと思います。
静的配列とは最初に要素数を宣言しちゃう方法です。
この配列には3個入れるよ!って最初に言うやつです。詳しくはこちら

 Redim 配列名(要素数-1)

大事なこと言います
静的配列ではRedimで宣言できません。

Sub 静的配列要素数の変更()

Dim Arrs(2) As String '静的配列の宣言
Dim arr As Variant 'For each文のための変数

'静的配列に格納
Dim i As Long
Arrs(0) = "リンゴ"
Arrs(1) = "バナナ"
Arrs(2) = "リンゴ"

'再宣言できるか?
ReDim Arrs(1)
Arrs(0) = "メロン"
Arrs(1) = "スイカ"

End Sub

エラーが発生します。

動的配列で使った場合

動的配列はどうでしょうか。
動的配列とは最初に要素数を宣言しない方法です。

結論を述べます

Redimで宣言できます。
ただし、格納したデータ全て消去されます。

Sub 動的配列()

'動的配列で宣言
Dim Arrs() As Variant

'一つ一つ格納するときはRedimで宣言必要
ReDim Arrs(2)
Arrs(0) = "リンゴ"
Arrs(1) = "バナナ"
Arrs(2) = "リンゴ"

'要素数を変更するときはもう一度Redim
'ただし、最初に入れた要素は消されています。
ReDim Arrs(3)
Arrs(3) = "メロン"

'空白の要素が3つとメロンが格納された配列となります。
Dim Arr As Variant
For Each Arr In Arrs()
    Debug.Print Arr
Next

End Sub
Redim 配列名(要素数-1)

もしかしたら使い道あるかもですが、
通常はこの方法で実務は難しいと思います。

文字数ゼロの要素が3つとメロンが格納されてます。

前の配列を消さずに要素数を変更する方法

こちらを使う方が実務向きです。
要素数の変更ができ、
かつ、前に入っていた要素をそのまま継続できます。

ReDim Preserve 配列名(要素数-1)
Sub 動的配列_前の配列残すバージョン()

'動的配列で宣言
Dim Arrs() As Variant

'一つ一つ格納するときはRedimで宣言必要
ReDim Arrs(2)
Arrs(0) = "リンゴ"
Arrs(1) = "バナナ"
Arrs(2) = "リンゴ"

'要素数を変更するときはもう一度Redim
'Redim Preserveで前の分を残しておきます。
ReDim Preserve Arrs(3)
Arrs(3) = "メロン"

'リンゴ、バナナ、リンゴ、メロンが格納された配列となります。
Dim Arr As Variant
For Each Arr In Arrs()
    Debug.Print Arr
Next

End Sub
前に格納された分が残ってます。

セルの値を配列に格納していく方法(コピペOK)

前フリ長くなりすみません。
以上で学んだことを生かすと
セルに入った値を一つ一つ格納していくプログラムが作れます。

下記のように入力された値を配列に格納していきたいと思います。
よく見ると、リンゴとバナナが重複しています。
今回は重複させたまま入れたい場合とします。

Sub 動的配列_セルの値を格納()

Dim Arrs() As Variant '動的配列で宣言
Dim Rngs As Range '格納するセルの範囲
Dim r As Range 'For each文用の変数
Dim i As Long 'Redimする要素数のインデックス番号
Dim str As String 'メッセージボックス用の文字列

Set Rngs = ActiveSheet.Range("A3:A9")

i = 0
For Each r In Rngs
    ReDim Preserve Arrs(i)
    Arrs(i) = r.Value
    str = str & "Arrs(" & i & "):" & Arrs(i) & vbCrLf
    i = i + 1
Next

MsgBox (str)

End Sub

ばっちり入りましたね。
この方法は実務でも使い道ありそうです。

まとめ

いかがでしょうか。
配列はまだまだ奥が深いです。

でも、おそらく実務で使う分にはそこまで難しいことはやらなくていいと思います。
必要になったら覚えるくらいで大丈夫だと思います。

今回のセルの値を格納しておく方法は結構使えます。
セルにある値を一気に入れて他の場所に転記したり、
一時的に保存しておく方法としても使い道あるかもしれません。

よかったらコピペして使ってみてください。

ではでは