VBA

【VBA】配列は動的配列一択である理由と配列宣言の最適解

記事内に商品プロモーションを含む場合があります
このページでわかること
  • 動的配列と静的配列の違い
  • 静的配列は実務では使用価値がない理由
  • 配列の宣言と使い方の実務上の最適解

こんにちは、hokkyokunです。

VBAの配列は使っていますか?
プログラミングにおいて、配列は超基本の要素で、とても便利な概念なので、使っていない方はぜひぜひ試してみてください!!

ですが、VBAの配列は難しく、初心者にはとっつきにくい点も否めません。
難しさの要素の一つが宣言の仕方のわかりくさだと思います。

今回は配列の宣言について注目しながら、解説していきます。

プログラミング代行いたします。

Python・VBAのコード対応です。

【VBA】
エクセルの自動処理全般

【Python】
スクレイピングによる、インターネット操作の自動化
デスクトップツール(データ解析等)
ワードプレスの自動化・効率化(自動更新、記事新規作成等の自動化)

ココナラで依頼を受けておりますので、お気軽にご相談ください。

依頼はこちらから

ココナラの会員登録がまだの方↓

無料登録はこちら

VBAを学習するには、動画プラットフォームUdemyがおすすめです。
Udemyの公式サイトはこちらです。

配列の種類

配列には大きく分けて、動的配列と静的配列の二種類があります。

動的配列と静的配列のどちらになるかは、配列をどのように宣言して、処理するかで変わります。

それぞれ見ていきましょう。

静的配列

静的配列は読んで字のごとく、動かない(静)配列です。
最初に要素数を決定し、以後変更をしない、させない配列です。

どのように宣言するか見てみましょう。

最初に要素数(配列に入れる項目の数)を決めちゃいます。

Dim 配列名(要素数-1) As データ型

なぜ要素数-1にするかというと
配列は0、1、2、3と順番に入れていくためです。
つまり、最初の配列は 配列名(0) となります。

簡単なコードを見ましょう

Sub Test1()

'要素数3-1=2を()に入れる
Dim Arrs(2) As String
Arrs(0) = "リンゴ"
Arrs(1) = "バナナ"
Arrs(2) = "リンゴ"

'For each文で配列の要素を全て取り出す
Dim arr As Variant
For Each arr In Arrs()
    Debug.Print arr
Next
End Sub

静的配列が使えない理由

静的配列が使えない理由は要素の追加ができないことです。

別の言い方をすれば、
静的配列で宣言した配列は要素数の変更ができない。
ということです。

Sub Test2()

'要素数3-1=2を()に入れる
Dim Arrs(2) As String
Arrs(0) = "リンゴ"
Arrs(1) = "バナナ"
Arrs(2) = "リンゴ"

'要素数の変更
ReDim Preserve Arrs(3) '>>ここでエラーが発生する。静的配列の要素数は変更できないため。
Arrs(3) = "パイナップル"

End Sub

要素数を変えるためにはRedim Preserveを使って再宣言をするのですが、
静的配列では再宣言をするとエラーが発生します

結論ですが、
静的配列は通常使いません。
私も現在、VBAでプログラムを作る際、静的配列で配列を扱うことは100%ありません。

動的配列(こちら一択)

要素数を指定せずに宣言する方法を動的配列といいます。
要素数は後から指定します。

何度も言いますが、100%動的配列を使用します。

基本的なプログラムを作成してみました(後述しますが、実務ではこの書き方はあまりしません。が、わかりやすいのであえてこの形にしています)

Sub Test3()

Dim Arrs() As Variant
ReDim Preserve Arrs(2)
Arrs(0) = "リンゴ"
Arrs(1) = "バナナ"
Arrs(2) = "リンゴ"


'要素数
Dim Arr As Variant
For Each Arr In Arrs
    Debug.Print Arr
Next

'要素の追加
ReDim Preserve Arrs(3)
Arrs(3) = "パイナップル"
Debug.Print Arrs(3)

End Sub





配列の宣言と使い方の実務上の最適解

静的配列は100%使わず、動的配列を100%使うというお話をさせていただきました。

ただ、動的配列を使うのは使うのですが、上記で書いたようなコードを実務上使うことは、あまりしません。

もっと簡単に配列を活用するための、(いつも書いている)コードの書き方をご紹介したいと思います。

【例1 Array関数を使う】

Sub Test4()

'宣言は()をつけてもつけなくてもいい。Dim Arrs() As VariantでもOK
Dim Arrs As Variant
Arrs = Array("リンゴ", "バナナ", "リンゴ")


'要素数
Dim Arr As Variant
For Each Arr In Arrs
    Debug.Print Arr
Next

'要素の追加
ReDim Preserve Arrs(3)
Arrs(3) = "パイナップル"
Debug.Print Arrs(3)

End Sub

このコードの利点は次の二つです。

  • 宣言時に()をつけてもつけなくてもいい
  • 最初の要素追加(上記だとリンゴ、バナナ、リンゴ)が、一行でできる

これでも十分いいのですが、要素数の変更=ReDim Preserveを宣言しなくてはいけません。

この場合は簡単だからいいですが、複雑なコードになると今の要素数の最大要素を取って、そこに一つ足した要素数で再宣言して。。というコードが必要です。

いちいちこんなコードを書いていたら面倒です。
冒頭でも言いましたが、配列はプログラミングの基本であり、もっと手軽に使うべき概念です。

例2 関数を作ってコードをすっきりさせる】

結論として、配列を使うときは以下のコードで行っています。

これが私が考える配列の宣言と使い方の実務上の最適解です。

Sub Test5()

'宣言時に()はつけない
Dim arrs As Variant

arrs = Array("リンゴ", "バナナ", "リンゴ")

Call addElm(arrs, "パイナップル")
Call addElm(arrs, "スイカ")
Call addElm(arrs, "イチゴ")

Dim arr As Variant
For Each arr In arrs
    Debug.Print arr
Next

End Sub


Function addElm(ByRef arrs As Variant, ByVal elm As Variant)
    Dim num As Long
    
    'Is_correct_array関数で配列がエラーを起こす空の状態かどうか判定
    
    'エラーを起こす空の状態
    If Not IsCorrectArray(arrs) Then
    
        '要素数が一つ=「0」で宣言
        ReDim arrs(0)
        arrs(0) = elm
    
    'エラーを起こす空の状態ではない
    Else
        num = UBound(arrs)
        ReDim Preserve arrs(num + 1)
        arrs(num + 1) = elm
    End If
End Function

Function IsCorrectArray(ByVal arrs As Variant)
    Dim a As Long
    
    'なんでもいいが、エラーを生じさせる
    On Error GoTo err
    a = UBound(arrs)

    'エラーが生じたときエラー番号で9か13の場合はFalse
err:
    If err.number = 9 Or err.number = 13 Then
        IsCorrectArray = False
    Else
        IsCorrectArray = True
    End If
    
End Function

一見長く、複雑になったように見えますが、
要素の追加をエラーを起こさずに処理するために関数を作ってそちらに処理を任せています。

関数を除いた、Subプロシージャだけみると、先ほどよりも要素の追加を増やしていますが、かなりすっきり、コードの可読性も上がっています

宣言のほうに注目してまとめます。

上記のコードだと配列の宣言は()はいりません。よって宣言の最適解はこちらになります。

Dim Arrs As Variant

めちゃくちゃシンプルですよね。
でもこれで(上記のような関数を使えば)エラーを生じずに、いくらでも要素数を追加することができます

配列は大事でもVBAの配列は使いにくい

いかがでしたでしょうか。

配列はとても大事な概念です。
一方で、VBAの配列は残念ながらとても使いにくくなっています。

配列を使うのにいちいち頭を悩ませてコードを作るのではなく、関数を作ることで手軽に使いこなす。

それが、複雑な処理ができ、それなのに可読性の良いコードを書くコツです。

当サイトでは配列に関するコードをたくさん作っています。
よければ参考にしてみてください。

配列に関する記事

最後に、

ココナラでVBA、Pythonの作成代行を行っています。
よければ、↓からご依頼お待ちしております。

プログラミング代行いたします。

Python・VBAのコード対応です。

【VBA】
エクセルの自動処理全般

【Python】
スクレイピングによる、インターネット操作の自動化
デスクトップツール(データ解析等)
ワードプレスの自動化・効率化(自動更新、記事新規作成等の自動化)

ココナラで依頼を受けておりますので、お気軽にご相談ください。

依頼はこちらから

ココナラの会員登録がまだの方↓

無料登録はこちら

また、VBAを学習するなら動画での学習がおすすめです。
世界最大級の学習用動画プラットフォームUdemyにはVBAの動画がたくさんアップロードされています。よければ覗いてみてください。

Udemyの公式サイトはこちらです。

ではでは。