VBAには配列のshiftメソッドは無い

主にWeb系で扱うプログラミング言語には配列の操作を行うメソッドがあります。ここでは配列の先頭データを切り取る処理をVBA用にした関数を紹介します

先頭を切り取る処理はプログラミング言語によって関数名は異なりますが、JavaScriptやPHPやRubyなど一般的には「shift」という名前が多いため、以下で紹介する関数はそれに合わせて「ArrayShift」という関数名にしています。


配列の先頭や終端にデータの追加や削除を行うには

VBAの配列は単にデータを複数保持しているだけですが、現在主流のプログラミング言語では配列はクラスとして管理されており、配列を操作するための関数が複数用意されていることが一般的です。

プログラミング言語によって関数名は異なりますが、配列を操作する関数として一般的には以下のようなものがあります。

関数名 用途 関数戻り値
shift 配列の先頭データを切り取る 切り取った先頭データ
unshift 配列の先頭にデータを追加する 追加後の配列要素数
pop 配列の終端データを切り取る 切り取った終端データ
push 配列の終端にデータを追加する 追加後の配列要素数

これらの関数をVBAでも使えるように以下に説明します。なお、それぞれの実装方法が異なるためページを分けて説明しています。



配列の先頭データを切り取るコード(shift)

以下のコードは配列の先頭(配列のインデックスが0)のデータを切り取る関数です。JavaScriptやPHPなどでのshiftメソッドになります。

使い方ですが、関数の引数には配列を渡し、関数の戻り値は切り取ったデータを返します。関数実行後は配列の要素数は先頭データが無くなるため1減ります。

配列は1次元配列を対象としており、配列のデータ型はなんでもOKです。なんでもOKにするために、オブジェクト型かどうかの判定をIsObject関数で行い、オブジェクト型であれば値の代入方法でSetを使い、そうでなければ=で代入するようにしています。

IsObject関数の詳細については「VBAのオブジェクト変数かどうかを判定する(IsObject)」をご参照ください。

引数が配列でない場合は処理しません。また、配列の要素がない場合は先頭データを戻り値用に切り取り、配列をクリアしています。



使い方

上のArrayShift関数をString型の配列とRange型の配列のそれぞれを使った場合の利用例です。

引数に配列を渡すだけですが、戻り値の受け取り方が配列のデータ型がオブジェクト型かそうでないかの2通りあります。

以下のコードのString型はプロパティやメソッドを持たないプリミティブ型の1つで、ArrayShift関数の結果を=の代入で取得できます。Range型はクラスのためオブジェクト型の1つになり、ArrayShift関数の結果をSetステートメントを使って取得します。

実行結果
abc
2
!
0
A1
1