- 要素数を任意の位置に追加する関数
- 位置を指定しなければ末尾に追加
- 位置を指定すればその位置に追加
こんにちはhokkyokunです。
配列の関数をいくつか作っていますが、最重要かつ最頻出の関数を紹介します。
配列の要素を追加する関数です。
デフォルトでは末尾に追加する関数で(普段はこれで十分)、必要に応じて、位置を指定するとその位置に要素を追加できるようにしました。
なぜ要素を追加する関数が必要なのか
そもそもなんで要素を追加するだけの関数を作る必要があるのでしょうか。
関数を使わずに配列を追加しようと思うと以下のような処理が必要になります。
Sub testArray1()
Dim arrs As Variant
Dim num As Long
arrs = Array("リンゴ", "バナナ")
On Error GoTo err
num = UBound(arrs)
err:
If err.Number = 9 Or err.Number = 13 Then
ReDim arrs(0)
num = -1
End If
ReDim Preserve arrs(num + 1)
arrs(num + 1) = "パイナップル"
Debug.Print "============================"
Dim arr As Variant
For Each arr In arrs
Debug.Print arr
Next
Debug.Print "============================" & vbCrLf
'以下のように出力されます。
'============================
'リンゴ
'バナナ
'パイナップル
'============================
End Sub
プログラミングにおいて、配列は超基本の要素です。
これを手軽にかつ、無駄に思考をせずに使いこなすことが、複雑なプログラムを効率的かつ、可読性の高いコードで書くコツです。
一方で、上記のプログラムを見るとかなり冗長に見えます。
この冗長になる理由を言語化すると以下の3点です。
- エラーキャッチが組み込まれるため(プログラムを安全に走らせるには必須!)
- 要素数の管理(常に最大要素数を把握する必要がある)
- 再宣言の手間
※特にエラーキャッチが重要で、配列は取り扱いをミスるとすぐエラーを出して止まるので、エラーキャッチは必ず入れることをお勧めします。
一方で今回作成した関数を使うと以下のようになります。
Sub testArray2()
Dim arrs As Variant
arrs = Array("リンゴ", "バナナ")
'追加
Call addElm(arrs, "メロン")
Debug.Print "============================="
Dim arr As Variant
For Each arr In arrs
Debug.Print arr
Next
Debug.Print "============================" & vbCrLf
'以下のように出力されます。
'=============================
'リンゴ
'バナナ
'メロン
'============================
End Sub
このようにコードがすっきりし、可読性もあがります。
また、要素を追加するのも基本的に一行でできるようになり、かつエラーの配慮も必要ないので、手軽にガンガン使用することができます。
繰り返しになりますが、配列はプログラミングの基本で手軽にたくさん使用することが良いコードを書く基本となります。
よって、簡単に手軽に使えるようにする関数を作ることはとてもとても重要となります。
注意点
配列の変数を宣言するときは以下の書き方でやることを守ってください。
Dim 配列名 as Variant
(例) Dim arrs as Variant
arrsの後に()や(2)などをつけないのがポイント
Dim 配列名(2) as Variant のように配列名の後に要素数を入れる=静的配列で使用はしないでください。
静的配列は絶対にその後の要素数の変更はできない=要素の追加が不可能となります。
使用した場合は以下のようなエラーを起こします。
詳しくはこちらの記事を確認してください
コード
# | 引数 | データ型 | 内容 |
① | arrs | Variant | 対象とする配列 |
② | elm | Variant | 追加したい要素の値 |
③ | order | long | 省略可(その場合は-1) 指定された位置に要素を追加。 マイナスの値および、要素数以上の値が指定されたら、末尾に追加。 |
Function addElm(ByRef arrs As Variant, ByVal elm As Variant, Optional order As Long = -1)
Dim num As Long
Dim arr As Variant
Dim i As Long
'エラー判定
On Error GoTo err
num = UBound(arrs)
'エラーを起こす=配列が空→要素を一つ追加して終了
err:
If err.Number = 9 Or err.Number = 13 Then
num = 0
ReDim arrs(0)
arrs(0) = elm
Exit Function
End If
'エラーを起こさない=配列が空ではない→orderの順番で入れる位置を決める
'orderが-1以下、もしくは、配列の要素数を超える数値の場合
If order <= -1 Or order > num Then
ReDim Preserve arrs(num + 1)
arrs(num + 1) = elm
'orderが0~要素数までの値の場合その位置に要素を入れる
Else
ReDim results(num + 1)
For Each arr In arrs
If i = order Then
results(i) = elm
i = i + 1
results(i) = arr
Else
results(i) = arr
End If
i = i + 1
Next
arrs = results
End If
End Function
実際に使用
実際に使用してみます。
[リンゴ、バナナ、パイナップル]という配列と
何も入っていない、空の配列を用意します。
この配列で以下の処理を試してみます。
- [リンゴ、バナナ、パイナップル]の末尾に追加
- [リンゴ、バナナ、パイナップル]の2番目に追加
- 何も入っていない、空の配列に要素を追加
[リンゴ、バナナ、パイナップル]の末尾に追加
Sub testArray3()
Dim arrs As Variant
arrs = Array("リンゴ", "バナナ", "パイナップル")
'追加
Call addElm(arrs, "イチゴ")
Debug.Print "============================"
Dim arr As Variant
For Each arr In arrs
Debug.Print arr
Next
Debug.Print "============================" & vbCrLf
'以下のように出力されます。
'============================
'リンゴ
'バナナ
'パイナップル
'イチゴ
'============================
End Sub
まとめ
いかがでしたでしょうか
まとめてみます。
- 配列に要素を追加する関数
- シンプルに末尾に要素を追加する関数
add_Elm関数 - 任意の位置に挿入する関数
insert_Elm関数
配列を便利に使いやすくする関数を作っています。
VBAを学習する方法をまとめました。
ご参考いただければ幸いです。