配列に簡単に要素を追加できる関数のコードとその使い方
こんにちはhokkyokunです。
配列の関数をいくつか作っていますが、最重要かつ最頻出の関数を紹介します。
それは、配列の要素を追加する関数です。
この関数には大きく二つの使い方があり、
- デフォルトでは末尾に要素を追加(普段はこれで十分)、
- 必要に応じて、位置を指定するとその位置に要素を追加できます。
配列はプログラミングの基本中の基本要素です。
一方で、VBAの配列はクセ強なので、そのままでは取り扱いが難しいです。
これを簡単に扱えるようにしましたので最後まで見ていってください。
プログラミング代行いたします。
Python・VBAのコード対応です。
【VBA】
エクセルの自動処理全般
【Python】
スクレイピングによる、インターネット操作の自動化
デスクトップツール(データ解析等)
ワードプレスの自動化・効率化(自動更新、記事新規作成等の自動化)
ココナラで依頼を受けておりますので、お気軽にご相談ください。
ココナラの会員登録がまだの方↓
VBAを学習するには、動画プラットフォームUdemyがおすすめです。
Udemyの公式サイトはこちらです。
なぜ要素を追加する関数が必要なのか
そもそもなんで要素を追加するだけの関数を作る必要があるのでしょうか。
関数を使わずに配列を追加しようと思うと以下のような処理が必要になります。
Sub testArray1()
Dim arrs As Variant
Dim num As Long
Dim a As Variant
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
Dim a As Variant
'エラー判定
On Error GoTo err
a = arrs(0)
'エラーを起こす=配列が空→要素を一つ追加して終了
err:
If err.Number = 9 Or err.Number = 13 Then
ReDim arrs(0)
arrs(0) = elm
Exit Function
End If
'エラーを起こさない=配列が空ではない→orderの順番で入れる位置を決める
'orderが-1以下、もしくは、配列の要素数を超える数値の場合、末尾に追加
num = UBound(arrs)
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
末尾に追加したい場合は、位置を指定する「order」引数は省略し、何も記入しないと勝手に末尾に追加されます。
[リンゴ、バナナ、パイナップル]の2番目に追加
次は位置を指定して追加してみます。
これもプログラムの作り方によっては便利です。
例えば、あらかじめエクセルシートのある列のデータをとっておき、後から配列の先頭にデータを追加したいときや、
配列内のデータをサーチして、特定の位置にデータを差し込んだりなどができるようになります。
位置の数え方ですが、【 0, 1, 2, 3…】と数えます。
今回だと2番目となるので、「1」を指定します。
ちょっとややこしいですが、プログラムの世界では「0」から数えることが多いので、そのような仕様としました。
Sub testArray4()
Dim arrs As Variant
arrs = Array("リンゴ", "バナナ", "パイナップル")
'追加
Call addElm(arrs, "イチゴ", 1)
Debug.Print "============================"
Dim arr As Variant
For Each arr In arrs
Debug.Print arr
Next
Debug.Print "============================" & vbCrLf
'以下のように出力されます。
'============================
'リンゴ
'イチゴ
'バナナ
'パイナップル
'============================
End Sub
何も入っていない、空の配列に要素を追加
ちょっと日本語としてはおかしい表現ですが、何も入っていない配列に追加をしてみます。
今回作った関数のかなり汎用性の高いところで、通常であれば配列が空の状態、つまりEmpty状態の場合、うまく場合分けをしないとすぐエラーが発生します。
ところが、この関数は配列がどんな状態だろうとお構いなしで要素の追加が可能です!
Sub testArray5()
Dim arrs As Variant
'追加
Call addElm(arrs, "イチゴ")
Debug.Print "============================"
Dim arr As Variant
For Each arr In arrs
Debug.Print arr
Next
Debug.Print "============================" & vbCrLf
'以下のように出力されます。
'============================
'イチゴ
'============================
End Sub
まとめ
いかがでしたでしょうか
もう一度おさらいしてみます。
# | 引数 | データ型 | 内容 |
① | arrs | Variant | 対象とする配列 |
② | elm | Variant | 追加したい要素の値 |
③ | order | long | 省略可(その場合は-1) 指定された位置に要素を追加。 マイナスの値および、要素数以上の値が指定されたら、末尾に追加。 |
配列を便利に使いやすくする関数を作っています。
最後に、
ココナラでVBA、Pythonの作成代行を行っています。
よければ、↓からご依頼お待ちしております。
プログラミング代行いたします。
Python・VBAのコード対応です。
【VBA】
エクセルの自動処理全般
【Python】
スクレイピングによる、インターネット操作の自動化
デスクトップツール(データ解析等)
ワードプレスの自動化・効率化(自動更新、記事新規作成等の自動化)
ココナラで依頼を受けておりますので、お気軽にご相談ください。
ココナラの会員登録がまだの方↓
また、VBAを学習するなら動画での学習がおすすめです。
世界最大級の学習用動画プラットフォームUdemyにはVBAの動画がたくさんアップロードされています。よければ覗いてみてください。
ではでは。